【问题标题】:How does chaining assignment operator work in this situatio [duplicate]在这种情况下,链式赋值运算符如何工作 [重复]
【发布时间】:2019-12-15 10:57:58
【问题描述】:

我看到这个有点奇怪的赋值运算符链接在某个地方,我一直在试图理解这是怎么可能的,但我似乎无法理解它。

var a = {n: 1};

var b = a;  

a.x = a = {n: 2};

console.log(a.x); // undefined  
console.log(b.x); // {n: 2}

【问题讨论】:

    标签: javascript object assignment-operator


    【解决方案1】:

    a.x 的内部参考值 — 分配 a.x = a 的“目标” — 在分配发生之前计算。因此,赋值的目标是aold 值上的“x”属性,它与b 相同。 a 的新值没有“x”属性,因此未定义。但是,该赋值为 a 的旧值赋予了“x”属性,这是 b 的当前值。

    如果您喜欢“语言律师”,您可以查看here in the ES2015 spec= 运算符的描述及其工作原理。请注意,在第 1 步中,确定了称为 lref 的内容。这就是我在上一段中提到的“目标”,请注意它发生在 右侧的“赋值表达式”被计算之前。

    【讨论】:

      【解决方案2】:
      var a = {n: 1};
      
      var b = a;   // since a is an object b holds the reference of 
      
      a.x = a = {n: 2};
      
      • a = {n : 2}这改变了a的值,因此内存引用因赋值而改变

      • a.x = a a 现在指向新的内存引用,而 a.x 仍然引用旧的引用(因为它在右手边表达式之前被评估)

      【讨论】:

      • 但是b.x 不是 undefined
      • @Pointy 你能解释一下我哪里弄错了吗?很想纠正自己
      • 关键是在a.x = a = {n: 2}中计算lref a.x之前计算最左边=的右侧.因此,右侧的“内存位置”,即a 更改的位置,发生在a 更改之前。因此,即使它仍然显示a.x,它实际上是在引用b.x,因为be 是对aold 值的唯一剩余引用。
      • @Pointy 哦有道理,感谢您提供的信息学到了一些新东西:)
      猜你喜欢
      • 2012-11-02
      • 1970-01-01
      • 2011-01-16
      • 2018-06-25
      • 1970-01-01
      • 2018-12-26
      • 2019-12-04
      • 2013-08-04
      • 1970-01-01
      相关资源
      最近更新 更多