【问题标题】:Ecma6, Object.assign doesn't do a deep copy [duplicate]Ecma6,Object.assign 不做深拷贝[重复]
【发布时间】: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

标签: javascript ecmascript-6


【解决方案1】:

首先我想告诉你,它不是防弹解决方案(在日期对象的情况下)。如果您想要“正确”作为答案,这是您的解决方案:

var dst,src = { "edf" : {"zyx" : "right"} };
dst = JSON.parse(JSON.stringify(src));
dst["a"] = 1;
src.edf.zyx = "wrong";
console.log(src, dst);

所以请阅读这些链接以更好地理解深拷贝

Most elegant way to clone a JavaScript object

Copy JavaScript object to new variable NOT by reference?

【讨论】:

  • 尝试在我上面的示例 obj 上运行它,看看它在哪里失败(特别是日期和函数)。
  • 它肯定会失败,这就是为什么我给出了链接并且还提到了'如果你想要“正确”作为答案'。
  • 请注意,这不会复制不可枚举的属性或符号,因此这不是防弹的。
猜你喜欢
  • 2011-02-09
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 2011-03-24
  • 2013-03-12
  • 1970-01-01
相关资源
最近更新 更多