以下为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和数组,如果需要支持更多的对象类型,还需要做更多的处理。