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