我试图更新一个深度嵌套的对象,因此有一个相当长的名称,我不想在我的代码中输入。在这个讨论中,我将用较短的名称“目标”来称呼它。
我首先用较短的名称'c'来引用它:
c = target
然后我想用另一个对象更新其内容;叫它update
。
如果我使用c = $.extend(c,update)
,对c的引用仍然是“完整的”;即c === target
是真的。
但是,如果我使用c = {...c, ...update}
,则会创建一个新变量;即c === target
是假的。我原来的target
变量没有更新。
我不懂为什么。谁能解释一下?
jQuery文档很清楚extend()
的工作原理:
目标对象(第一个参数)将被修改,并且也将从$ .extend()返回
使用扩展运算符是不同的。当你写这个:
c = {...c, ...update}
你正在创建一个新对象。然后指定c
指向该新对象。 c
之前指出的对象与任何这一点无关。它只是(来自:tc29/proposal):
将所提供对象的可枚举属性复制到新创建的对象上
要获得您想要的行为,您可以使用Object.assign()
;
let target = {
name: "Mark",
place: "AK"
}
let c = target;
Object.assign(c, {
name: "Tim"
})
console.log(target)
$.extend()
的描述如下:
将两个或多个对象的内容合并到第一个对象中。
意思是,合并两个对象并使用秒的属性(或第三个,第四个等)修改第一个对象
JavaScript is pass-by-reference,所以,当更新c
时(不是在设置为新值时),您正在修改target
引用的相同对象。
c = {...c, ...update};
将c
设置为c
和update
的组合,而
$.extend(c,update);
通过添加c
的属性来修改update
引用的对象。
我希望这说清楚