let obj1 = { name: 'qianguyihao', age: 28, info: { desc: 'hello', }, color: ['red', 'blue', 'green'], }; let obj2 = {}; deepCopy(obj2, obj1) console.log(obj2); obj1.info.desc = '123' console.log(obj1,obj2); function deepCopy(newObj,oldObj) { for(let key in oldObj) { // 获取属性值 let item = oldObj[key] if(item instanceof Array) { newObj[key] = [] deepCopy(newObj[key],item) } else if (item instanceof Object) { newObj[key] = {} deepCopy(newObj[key], item) } else { newObj[key] = item } } }我这个代码还能怎么优化
时间: 2024-02-14 07:12:09 浏览: 50
Java集合框架总结:TreeSet类的排序问题
5星 · 资源好评率100%
你这段代码已经实现了深拷贝,但可能存在一些问题。比如,如果对象中存在循环引用,会导致死循环,也会抛出“Maximum call stack size exceeded”错误。因此,你可以在函数中添加一个参数来记录已经拷贝过的对象,避免重复拷贝和循环引用的问题。示例代码如下:
```
function deepCopy(newObj, oldObj, copiedObjs = []) {
if (copiedObjs.includes(oldObj)) {
return oldObj;
}
copiedObjs.push(oldObj);
for (let key in oldObj) {
let item = oldObj[key];
if (item instanceof Array) {
newObj[key] = [];
deepCopy(newObj[key], item, copiedObjs);
} else if (item instanceof Object) {
newObj[key] = {};
deepCopy(newObj[key], item, copiedObjs);
} else {
newObj[key] = item;
}
}
}
```
在这个示例代码中,我们添加了一个名为copiedObjs的数组参数,用于记录已经拷贝过的对象,避免重复拷贝和循环引用的问题。我们还在函数开始部分添加了一个判断,如果已经拷贝过这个对象,直接返回原对象,避免死循环。
阅读全文