以下为ChatGPT自动生成的解答,正确与否请自行判断。
BFE.devAI解答 - JavaScript 代码题
63. 手写`_.cloneDeep()`
可以使用递归实现深拷贝。对于每个对象,首先创建一个空对象或数组,然后循环遍历原对象的属性,将其递归地深拷贝并赋值给新对象的属性。
以下是可能的实现:
function cloneDeep(obj) {
if (obj === null || typeof obj !== 'object') {
return obj;
}
const newObj = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = cloneDeep(obj[key]);
}
}
return newObj;
}
使用时,可以像这样调用:
const obj = {
a: 1,
b: {
c: {
d: 'foo'
}
}
}
const clonedObj = cloneDeep(obj);
console.log(clonedObj); // { a: 1, b: { c: { d: 'foo' } } }
console.log(clonedObj.b.c === obj.b.c); // false
这里使用了obj.hasOwnProperty(key)
来确保不会复制原型链上的属性。如果需要复制原型链上的属性,则需要使用Object.getOwnPropertyNames(obj)
或Object.getOwnPropertySymbols(obj)
来获取所有属性。同时,这里只实现了基础类型、简单的Object和数组,如果需要支持更多的对象类型,还需要做更多的处理。