深拷贝与浅拷贝
深拷贝和浅拷贝只针对Object和Array这样的引用数据类型的。
浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,考本的就是基本类型的值,如果属性是应用类型,拷贝的就是内存地址,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。
深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟了一个新的区域存放新对象,且修改新对象不会影响原对象。
数组与对象赋值是浅拷贝;一维的数组和对象可以看做是深拷贝;二维的是浅拷贝;方法不能拷贝;
浅拷贝的实现方式:
1.展开运算符…
2.Object.assign()
let obj1 = {
person: {
name: "不完美女孩"
},
age: '14'
};
let obj2 = Object.assign({}, obj1);
obj2.person.name = "哈哈哈";
obj2.age = '23'
console.log(obj1); // { person: { name: '哈哈哈'}, age: '14' }
3.Array.prototype.concat()
let arr = [1, 3, {
name: '不完美女孩'
}];
let arr2 = arr.concat();
arr2[2].name = '哈哈哈哈';
console.log(arr); //[ 1, 3, { name: '哈哈哈哈' } ]
4.Array.prototype.slice()
let arr = [1, 3, {
name: '不完美女孩'
}];
let arr2 = arr.slice();
arr2[2].name = '哈哈哈哈';
console.log(arr); //[ 1, 3, { name: '哈哈哈哈' } ]
标准的深拷贝应该怎么写?
1.JSON.parse(JSON.stringify())
2.function dee(socur) {
const targetObj = socur.constructor === Array ? [] : {};
for (let keys in socur) {
if (socur.hasOwnProperty(keys)) {
// 应用数据类型
if (socur[keys] && typeof socur[keys] === 'object') {
targetObj[keys] = socur[keys].constructor === Array ? [] : {};
// 递归
targetObj[keys] = dee(socur[keys])
} else {
// 基础数据类型直接赋值
targetObj[keys] = socur[keys]
}
}
}
return targetObj
}
let objc = {
a: '嗯嗯',
b: 1,
c: [1, 2, 3],
d: {
arr: '10',
age: '78'
}
}
let newobjc = dee(objc)
newobjc.a = '哦哦'
newobjc.c.push(5)
newobjc.d.arr = '修改'
console.log(objc, newobjc)