关于JS 的深拷贝和浅拷贝
最简单的深拷贝当然是var obj1 = JSON.parse(JSON.stringify(obj2));
但这种拷贝有两个缺点:
-
如果你的对象里有函数,函数无法被拷贝下来
-
无法拷贝copyObj对象原型链上的属性和方法
真正的深拷贝:
function deepCopy(source, target = {}) {
var key;
for (key in source) {
if (source.hasOwnProperty(key)) { // 意思就是__proto__上面的属性,我不拷贝
if (typeof(source[key]) === "object") { // 如果这一项是object类型,就递归调用deepCopy
target[key] = Array.isArray(source[key]) ? [] : {};
deepCopy(source[key], target[key]);
} else { // 如果不是object类型,就直接赋值拷贝
target[key] = source[key];
}
}
}
return target;
}
source.hasOwnProperty(key),意思是判断这一项是否是其自有属性,是的话才拷贝,不是就不拷贝。也就是说__proto__上面的属性,我不拷贝。这个其实你可以根据业务需求,来决定加上和这个条件;
上面的deepCopy方法有漏洞,没有考虑source一开始就是数组的情
下面是一个修改后版本:
function deepCopy( source ) {
let target = Array.isArray( source ) ? [] : {}
for ( var k in source ) {
if ( typeof source[ k ] === 'object' ) {
target[ k ] = deepCopy( source[ k ] )
} else {
target[ k ] = source[ k ]
}
}
return target
}

浙公网安备 33010602011771号