JavaScript传播语法与jQuery $ .extend - ByRef和ByVal

问题描述 投票:1回答:2

我试图更新一个深度嵌套的对象,因此有一个相当长的名称,我不想在我的代码中输入。在这个讨论中,我将用较短的名称“目标”来称呼它。

我首先用较短的名称'c'来引用它:

c = target

然后我想用另一个对象更新其内容;叫它update

如果我使用c = $.extend(c,update),对c的引用仍然是“完整的”;即c === target是真的。

但是,如果我使用c = {...c, ...update},则会创建一个新变量;即c === target是假的。我原来的target变量没有更新。

我不懂为什么。谁能解释一下?

$extends vs JavaScript spread有一个垃圾箱

javascript extend spread-syntax
2个回答
2
投票

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)

0
投票

$.extend()的描述如下:

将两个或多个对象的内容合并到第一个对象中。

意思是,合并两个对象并使用秒的属性(或第三个,第四个等)修改第一个对象

JavaScript is pass-by-reference,所以,当更新c时(不是在设置为新值时),您正在修改target引用的相同对象。

c = {...c, ...update};

c设置为cupdate的组合,而

$.extend(c,update);

通过添加c的属性来修改update引用的对象。

我希望这说清楚

© www.soinside.com 2019 - 2024. All rights reserved.