【发布时间】:2016-02-21 04:10:28
【问题描述】:
dst = { "a" : 1}
src = { "edf" : {"zyx" : "right"}}
Object.assign(dst, src)
src.edf.zyx = "wrong"
console.log(dst["edf"]["zyx"])
我希望看到'right' 作为输出,但它会打印'wrong'。
这意味着,Object.assign 没有对复杂对象从源到目标进行深度复制。如何进行深拷贝?
注意:我知道lodash.deepClone,但我试图避免使用外部框架
【问题讨论】:
-
是的,
Object.assign()只执行属性的浅层合并。但是,目前还没有用于深度合并、递归发现嵌套对象中的属性的内置函数。 -
您可以使用 JSON,但对于大型数据集,这可能会很慢。尽管如此,它还是尽可能接近内置克隆,并且实际上比大多数库方法更快。
-
请注意,解析到 JSON 和从 JSON 解析将不适用于函数。
-
自己的属性或原型?
-
遗憾的是,它不应该返回深层副本。 ecma-international.org/ecma-262/6.0/#sec-object.assign