我对变量赋值有疑问
var foo = {n: 1};
foo.x = foo = {n: 2};
console.log(foo.x) // undefined
为什么foo.x
是undefined
?
答案 0 :(得分:4)
=
赋值运算符是右关联运算符,意味着从右到左计算一系列赋值。也就是说,语言对待
x = y = x+2;
好像是写的
x = (y = x+2);
首先为y
分配添加结果(5
),然后为x
分配该分配的值,该值也是5
。< / p>
你问题中的第一个例子是同一个故事,但事情有点复杂:
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
。