我有一个关于变量赋值的问题
var foo = {n: 1};
foo.x = foo = {n: 2};
console.log(foo.x) // undefined
为什么foo.x
是未定义
?
最佳答案
=
赋值运算符是右关联的,这意味着赋值链是从右到左计算的。也就是说,语言对待这个
x = y = x+2;
就像写的一样
x = (y = x+2);
首先y
分配加法的结果 ( 5
),然后 x
被赋予了该赋值的值,这也是 5
.
你问题中的第一个例子是同一个故事,但事情有点复杂:
foo.x = foo = { n: 2 };
所做的第一个分配是 foo
,该对象字面量。然而,在此之前,语言将确定 foo.x
的引用值。 ,这是对原始 foo
上的(尚未存在)属性的引用目的。因此,当对该属性进行右侧赋值时,它确实有效,但该属性是在旧对象上设置的,而不是在新对象上设置的!
让我们改变一下例子:
var foo = {n: 1}, foo2 = foo;
foo.x = foo = {n: 2};
console.log(foo2.x); // { n: 2 }
该版本保留了对 foo
原始值的另一个引用在变量foo2
中。即使foo
在双重赋值中被覆盖 foo2
会继续引用原文foo
.
关于javascript - 解释一下这段javascript代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30332624/