- 在JS中的等于号都是把对象的地址引用了,所有普通的赋值或者是Object.assign都是浅克隆,那么怎么深克隆呢
- 基本思想就是遍历对象,一个一个赋值
- 遇到对象或者数组的化递归
function deepClone(parent, child) {
child = child || {};
for (const key in parent) {
if (parent.hasOwnProperty(key)) {
let item = parent[key];
if (typeof item === "object") {
child[key] = Object.prototype.toString.call(item) === "[object Array]" ? [] : {};
deepClone(item,child[key],);
} else {
child[key] = item;
}
}
}
return child;
}
let a = {a:1,b:{c:3,d: [6,5,4,3]}}
let b = {};
b = deepClone(a,b);
console.log(a,b)
这里有几个点需要注意以下
在遍历目标对象的时候,首先需要属性是不是对象,不是的话,证明是基本类型对不,那么就可以直接赋值了,因为基本类型在内存中的栈里存的就是真实值
如果是对象或者数组的化,那么需要递归调用这个对象,直到是基本类型为止