JavaScript基础
深浅拷贝的区别,如何实现深拷贝和浅拷贝
首先深浅拷贝是适用于对象的。
深拷贝是指在复制对象时,创建一个新的对象,并将原对象的所有属性和子对象都复制到新对象中,新对象与原对象完全独立,对新对象的修改不会影响原对象。
浅拷贝是指在复制对象时,只复制对象本身的属性,而不复制其子对象,新对象与原对象共享同一子对象,对新对象的修改会影响原对象。 也就是说 我们从浅拷贝中如果对更改属性出来的obj,不会对原对象进行干扰,但是对象内的对象则会进行干扰
举个例子: 假设有一个对象A,包含属性a和子对象B。
- 深拷贝: 深拷贝对象A时,会创建一个新的对象A',并将属性a的值和子对象B完全复制到A'中,A'与A是完全独立的两个对象,对A'的修改不会影响A。
- 浅拷贝: 浅拷贝对象A时,会创建一个新的对象A',并将属性a的值复制到A'中,但子对象B只是引用了原对象A中的子对象B,并没有真正复制,所以A'与A共享同一子对象B,对A'的修改会影响A。
浅拷贝举例
const obj = {
uname: 'person',
age: 18,
family: {
baby: 'son'
}
}
//通过展开运算符对obj进行浅拷贝
const o = { ...obj }
console.log(o)
o.age = 20
console.log(o)
console.log(obj)
//通过Object.assign来进行浅拷贝
const o = {}
Object.assign(o, obj)
o.age = 20
o.family.baby = 'sony'
console.log(o)
console.log(obj)
深拷贝的具体实现方式
1.通过递归函数进行深拷贝
2.通过lodash包进行深拷贝
3.通过JSON.String ,JSON.parse 进行JSON格式转换进行深拷贝
1通过递归函数进行深拷贝
function deepClone(obj) {
if (typeof obj !== 'object') return;
let newObj = obj instanceof Array ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key];
}
}
return newObj;
通过lodash进行深拷贝
const _ = require('lodash');
const obj = {
a: 1,
b: { c: 2 },
};
const deepCloneObj = _.cloneDeep(obj);
使用JSON.parse()和JSON.stringify()实现深拷贝
function deepClone(obj) {
return JSON.parse(JSON.stringify(obj));
}