在这种情况下,链式赋值运算符如何工作 [重复]
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
的“目标” — 在分配发生之前计算。因此,赋值的目标是a
的old 值上的“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 是对a
的old 值的唯一剩余引用。
@Pointy 哦有道理,感谢您提供的信息学到了一些新东西:)以上是关于在这种情况下,链式赋值运算符如何工作 [重复]的主要内容,如果未能解决你的问题,请参考以下文章