深/浅拷贝的异同,实现方式
程序员文章站
2022-04-27 08:50:09
...
深浅拷贝的异同
浅拷贝方法
- 直接对象复制
- Object.assign
// 浅拷贝
function shallowClone(src){
var dst = {};
for(var prop in src){
if(src.hasOwnProperty(prop)){
dst[prop] = src[prop]
}
}
return dst;
}
深拷贝方法
- Json.stringfy转为字符串,再Json.parse转回对象(坏处:它会抛弃对象的constructor。也就是深拷贝之后,不管这个对象原来的构造函数是什么,在深拷贝之后都会变成Object。所以只适合 Number, String, Boolean, Array 的扁平对象)
- 深度递归遍历
// 深拷贝,利用递归
function deepClone(obj) {
let objClone = Array.isArray(obj) ? [] : {};
if (obj && typeof obj === "object") {
for (key in obj) {
if (obj.hasOwnProperty(key)) {
//判断ojb子元素是否为对象,如果是,递归复制
if (obj[key] && typeof obj[key] === "object") {
objClone[key] = deepClone(obj[key]);
} else {
//如果不是,简单复制
objClone[key] = obj[key];
}
}
}
}
return objClone;
}