手写深拷贝

2021-05-05  本文已影响0人  miao8862

深拷贝

// 手写实现一个深拷贝
function deepClone(obj) {
  // 判断是不是一个对象
  function isObject(obj) {
    return typeof obj === 'object' && obj !== null;
  }
  // 如果不是一个对象,抛出异常
  if(!isObject(obj)) {
    throw new Error("拷贝的数据不是一个对象")
  }
  // 判断是数组还是对象,创建对应的拷贝初始对象
  let newObject = Array.isArray(obj) ? [] : {}
  Object.keys(obj).map(key => {
    newObject[key] = isObject(obj[key]) ? deepClone(obj[key]) : obj[key]
  })
  return newObject
}

const d = Symbol('d')
let obj = {
  a: 111,
  b: [3,2, {z: {k: 1}}],
  c: {k: 2},
  d: {o: 3}
}
let newobj = {...obj}

// console.log('obj:', obj); // obj: { a: 111, b: [ 3, 2, { z: [Object] } ], c: { k: 3 } }
// console.log('newobj:', newobj); // newobj: { a: 111, b: [ 3, 2, { z: [Object] } ], c: { k: 3 } }

let newobj2 = deepClone(obj)
newobj2.c.k = 3
newobj2.d.o = 11
console.log('obj:', obj);
console.log('newobj2:', newobj2);
上一篇 下一篇

猜你喜欢

热点阅读