LearningRecord
LearningRecord copied to clipboard
深拷贝的实现
function cloneDeep(x) {
const root = {};
// 栈
const loopList = [
{
parent: root,
key: undefined,
data: x,
}
];
while(loopList.length) {
// 广度优先
const node = loopList.pop();
const parent = node.parent;
const key = node.key;
const data = node.data;
// 初始化赋值目标,key为undefined则拷贝到父元素,否则拷贝到子元素
let res = parent;
if (typeof key !== 'undefined') {
res = parent[key] = {};
}
for(let k in data) {
if (data.hasOwnProperty(k)) {
if (typeof data[k] === 'object') {
// 下一次循环
loopList.push({
parent: res,
key: k,
data: data[k],
});
} else {
res[k] = data[k];
}
}
}
}
return root;
}
扩展:深拷贝和浅拷贝的区别 浅拷贝只是新开一个别名来引用这个内存区。即拷贝原对象的引用
深拷贝会重新开辟一个内存区,并把之前内存区的值复制进来,这样两个内存区初始值是一样的,但接下去的操作互不影响 深拷贝终极探索