think
think copied to clipboard
表达式的值-连续赋值问题
看到这样的一道题目:
var a = {n:1};
a.x = a = {n:2};
console.log(a.x); // --> undefined
这是为什么呢?
因为赋值语句是从右到左的,也就是先计算右值,所以a.x = a = {n:2}
这句,就拆分为:a.x = (a = {n:2})
也就是先执行的a = {n:2}
赋值,再赋值给a.x。
最开始我以为是a = {n:2}
这个表达式赋值后,它的值是undefined
。但经过实验,发现赋值语句的值并不是这样:
也就是赋值表达式的值,等于被赋值之后的左值。
为了便于理解,我们加入一个变量b来保存a的值:
var a = {n:1};
var b = a;
a.x = a = {n:2};
console.log(a.x); // --> undefined
console.log(b.x); // --> {n:2}
语句先执行的a = {n:2}
,语句的返回值是{n:2}
,也即a.x = {n:2}
。但是此时,这里的a.x
中的a指向的是{n:1}
, 所以这个对象多了属性x,值为{n:2}
, 由于b指向的是这个对象,所以b.x的值输出为{n:2}
。语句执行完后,a的指向被修改成了指向{n:2}
这个对象,这个对象没有x属性,所以输出undefined
。