浅拷贝:拷贝所有的属性值到新的对象中,如果属性值是对象的,拷贝的则是地址。
let p1 = {
age : 10,
jobs:{
first:'xxx'
}
}
let p2 = Object.assign({} , p1);
p1.age = 20;
p1.jobs.first = 'zzz';
console.log(p2.age) // 10
console.log(p2.jobs.first) // zzz
let p1 = {
age : 10
}
let p2 = {...p1}
p1.age = 20;
console.log(p2.age) // 10
深拷贝:拷贝所有的属性值到新的对象中,如果属性值是对象也不影响。
-
JSON.parse(JSON.stringify(object)):
但是该方法有局限性:
-
忽略undefined
-
忽略symbol
-
不能序列化函数
-
不能解决循环引用对象
let p1 = {
age : 10,
jobs:{
first:'xxx'
}
}
let p2 = JSON.parse(JSON.stringify(p1));
p1.age = 20;
p1.jobs.first = 'zzz';
console.log(p2.age) // 10
console.log(p2.jobs.first) // xxx
实现一个深拷贝需要考虑很多情况:DOM如何处理,原型链如何处理等,推荐使用:
lodash的深拷贝函数