浅拷贝:拷贝所有的属性值到新的对象中,如果属性值是对象的,拷贝的则是地址。
- Object.assign():
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
- 递归
function deepClone(obj = {}){
if(typeof obj !== 'object' || obj == null){
return obj
}
let result
if(obj instanceof Array){
result = []
}else{
result = {}
}
for(let key in obj){
if (obj.hasOwnProperty(key)) {
result[key] = deepClone(obj[key])
}
}
return result
}
实现一个深拷贝需要考虑很多情况:DOM如何处理,原型链如何处理等,推荐使用:lodash的深拷贝函数