当我修改克隆的 obj(使用 ...)时,为啥 obj 会发生突变?

Posted

技术标签:

【中文标题】当我修改克隆的 obj(使用 ...)时,为啥 obj 会发生突变?【英文标题】:Why the obj is being mutated when I am modifying the cloned obj ( using ...)?当我修改克隆的 obj(使用 ...)时,为什么 obj 会发生突变? 【发布时间】:2018-01-01 11:07:49 【问题描述】:

让我们取一个对象 d。

var d =   
  "e":
    "f": 3
  

现在使用 ... 将 d 复制到 t 并分配新属性。

var t = ...d
t.e._f = 4

为什么对象 d 被变异为


  "e": Object 
    "_f": 4,
    "f": 3
  

【问题讨论】:

【参考方案1】:

你正在做浅拷贝。 ...d 等价于 Object.assign(, d),后者依次复制 1 级深的属性。 Docs.

对于深度克隆,我们需要使用其他替代方法,因为 Object.assign() 复制属性值。如果源值是 引用一个对象,它只复制该引用值。

所以t.e === d.e 引用同一个对象。

【讨论】:

以上是关于当我修改克隆的 obj(使用 ...)时,为啥 obj 会发生突变?的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我的查询有 Where 时 SQL Server 有更多的 I/O?

无法用函数的返回值初始化对象。为啥? [复制]

当我尝试使用 MVVM WPF 中的命令修改对象时,为啥在视图模型中出现空错误?

在深度克隆对象时,Typescript Error 2345

Instagram 克隆。单击按钮时,为啥我不能回到上一个片段?

为啥 NMake 生成器将 C 文件的 .obj 文件放在 C++ 以外的目录中