在这种情况下,链式赋值运算符如何工作 [重复]

Posted

技术标签:

【中文标题】在这种情况下,链式赋值运算符如何工作 [重复]【英文标题】: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

【问题讨论】:

【参考方案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 哦有道理,感谢您提供的信息学到了一些新东西:)

以上是关于在这种情况下,链式赋值运算符如何工作 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

分享------关于复合赋值运算符

如何为这种情况编写赋值运算符?

如何避免共享指针的复制赋值运算符c ++

熊猫:链式作业[重复]

pandas的链式索引

对象的赋值运算符