深浅拷贝区别
深拷贝(深克隆) 浅克隆(浅拷贝)
let a = 111
let b = a;
如果b里面的内容修改了 a如果不变 深克隆 (基本数据类型)
如果b里面的内容修改了 a如果变了 浅克隆 (引用数据类型)
浅拷贝
可以通过Object.assign来解决这个问题,Object.assign只会拷贝所有属性值到新的对象中,如果属性值是对象的话,拷贝的是地址。
let a = {
age: 1
}
let b = Object.assign({}, a)
a.age = 2
console.log(b.age) // 1
可以通过展开运算符 ... 来实现浅拷贝
let a = {
age:1,
jobs: {
first: 'IT'
}
}
let b = {...a}
a.jobs.first = 'PM'
console.log(b.jobs.first) // PM
深拷贝
深拷贝能够实现真正意义上的对象的拷贝,实现方法就是递归调用“浅拷贝”。深拷贝会创造一个一模一样的对象,其内容地址是自助分配的,拷贝结束之后,内存中的值是完全相同的,但是内存地址是不一样的,目标对象跟源对象不共享内存,修改任何一方的值,不会对另外一方造成影响。
// 对象深克隆
function deepClone(obj) {
var tmp = {}
for(var key in obj) {
// 判断对象中的每一项的数据类型 如果是引用数据类型 递归调用自己
if( typeof(obj[key]) === 'object') {
tmp[key] = deepClone(obj[key])
} else { // 基本数据类型 直接赋值
tmp[key] = obj[key]
}
}
return tmp;
}
可以通过JSON.parse(JSON.stringify(object))实现深拷贝
var arr = {
name: "aaa",
other: {
name: "bbb"
}
};
var arr2 = JSON.parse(JSON.stringify(arr));
arr2.name = "AAA";
arr2.other.name = "BBB";
console.log(arr); // { name: 'aaa', other: { name: 'bbb' } }
console.log(arr2); // { name: 'AAA', other: { name: 'BBB' } }