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

时间:2018-05-03 17:02:38

标签: javascript extend spread-syntax

我正在尝试更新一个深度嵌套的对象,因此有一个相当长的名称,我不想继续输入我的代码。在本次讨论中,我将用较短的名称' target'来称呼它。

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

update

然后我想用另一个对象更新其内容;称之为c = $.extend(c,update)

如果我使用c === target,则对c的引用仍然完好无损&#39 ;;即c = {...c, ...update}是真的。

但是,如果我使用c === target,则会创建一个新变量;即target是假的。我的原始.card { text-align:center; display:block; border: none !important; } 变量未更新。

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

$extends vs JavaScript spread

有一个垃圾箱

2 个答案:

答案 0 :(得分:2)

jQuery文档非常清楚extend()的工作原理:

  

目标对象(第一个参数)将被修改,并且也将从$ .extend()返回

使用spread运算符是不同的。当你这样写:

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)




答案 1 :(得分:0)

$.extend()的描述如下:

  

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

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

JavaScript is pass-by-reference,因此,在更新c时(而不是在将其设置为新值时),您正在修改target引用的同一对象。

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

c设置为cupdate的组合,而

$.extend(c,update);

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

我希望能说清楚