SOURCE

// 先判断参数是否为对象,如果不是对象直接返回。
// 如果是数组,遍历数组进行递归拷贝,
// 如果是对象,遍历对象属性进行递归拷贝。
// 其中,需要注意的是,
// 需要使用 hasOwnProperty 进行判断是否为对象自身的属性,避免出现原型链上的属性也被拷贝的情况。

function deepClone(obj) {
  // 判断是否为对象
  if (typeof obj !== 'object' || obj === null) {
    return obj;
  }

  // 初始化返回结果
  let result;

  // 判断是否为数组
  if (Array.isArray(obj)) {
    result = [];
    for (let i = 0; i < obj.length; i++) {
      result[i] = deepClone(obj[i]);
    }
  } else {
    result = {};
    for (let key in obj) {
      if (obj.hasOwnProperty(key)) {
        result[key] = deepClone(obj[key]);
      }
    }
  }

  return result;
}
console 命令行工具 X clear

                    
>
console