浅拷贝
用ES6语法实现是相当简单的
function shadowClone(target){
return {...target}
}
深拷贝
function deepClone(target){
let result = Array.isArray(target) ? [] : {};
for(let key in target){
if(target.hasOwnProperty(key)){
if(typeof target[key] === 'object' && target[key] != null){
result[key] = deepClone(target[key]);
}else{
result[key] = target[key]
}
}
}
return result;
}
当确认对象中没有"undefined" "function" "symbol"时,深拷贝也很简单
function deepClone(target){
return JSON.parse(JSON.stringfy(target));
}
测试
let obj = {
name: 'lihao',
age: 18,
eyes:{
left: null,
right: undefined,
nose:['right', 'left']
},
hobby:['basketball', 'football', 'pingpang',{money: 1000,computer:{price: 4000}}]
}
let deep = deepCopy(obj);
let shadow = shadowClone(obj);
shadow.eyes.left = true;
log(deep)
log(shadow, obj)
先进行深拷贝,在进行浅拷贝,然后修改浅拷贝中的一个引用值。shadow.eyes.left = true
预测输出结果应该是
- 深拷贝不变,与目标对象相同
- 浅拷贝shadow.eyes.left值为true
- 由于修改了浅拷贝中的引用值,所以目标对象的shadow.eyes.left变为true