let obj={name:'jack',address:'shanghai'}
let o = {...obj};
obj.name = 'hello';
console.log(o); //=>{name: "jack", address: "shanghai"}
复制代码
这个看起来有点像深拷贝是否是? 别急再来一点变化。json
let obj={name:'jack',address:{city:'shanghai',num:1}}
let o = {...obj};
obj.name = 'hello';obj.address.city='beijing'
console.log(o);
//{name: "jack", address:{city: "beijing",num: 1}}
复制代码
因此咱们知道深拷贝不单单是一维不影响而且朵惟也不影响。因此...运算符是浅拷贝;
数组
2.slice/concat 这两个方法和1是同样的 一维的时候是深拷贝 可是多维是浅拷贝bash
function deepClone(obj){
if(obj == null) return obj;
if(obj instanceof Date) return new Date(obj);
if(obj instanceof RegExp) return new RegExp(obj);
if(typeof obj !=='object') rerurn obj;
let cloneObj = new obj.constructor;
//找到数组或者对象的原型;
for(let key in obj){
if(obj.hasOwnPrototype(key){
//实现递归拷贝
cloneObj[key] = deepClone(obj[key]);
}
}
return cloneObj;
}
let obj = {name:1,address:{name:'shanghai',num:1}};
复制代码