Saber2pr's Blog

深拷贝

const clone = value => {
  if (typeof value !== "object") return value
  // 遍历每个属性,执行clone,并把返回值添加到新对象对应属性上
  return Object.keys(value).reduce(
    (out, key) =>
      Object.assign(out, {
        [key]: clone(value[key])
      }),
    {}
  )
}

const obj = {
  name: "saber",
  age: 21,
  like: ["js", "ts"]
}

const newObj = clone(obj)
console.log(obj, newObj)
obj.age = 233
obj.like.push("vv")
console.log(obj, newObj)

补充

深拷贝遇到循环引用会无限递归导致堆栈溢出 lodash 却可以实现循环引用的拷贝,它的原理: 利用了 stack,每次访问一个属性后,把值存入 stack 中,如果 stack 中已经存在,说明发生了循环引用,则直接返回。 即遇到循环引用的属性,就浅拷贝