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 中已经存在,说明发生了循环引用,则直接返回。 即遇到循环引用的属性,就浅拷贝