在学习的过程遇到连等赋值,执行顺序是从右至左,在网上看到一个小例子感到有些困惑,如下:
var a = {n:1};
var b = a;
a.x = a = {n:2};
console.log(a.x); // --> undefined
console.log(b.x); // --> {n:2}
查了一些文章,没太看懂, 但在赋值的过程中顺序和优先级这两点很重要,在此例中是:
- 连等赋值的顺序是从右往左
- 点号的优先级高于等号
改成了普通赋值模拟了一下上例,如下:
var a = {n:1};
var b = a;
a.x = {n:2}; // 此时 a === b 为true,对象内容都为{n: 1, x: {n: 2}}
a = {n:2}; // 这时 a 的指针指向一个新对象,并不是某个属性
console.log(a.x); // 因为 a 里没有 x 的属性,所以返回值为 undefined
console.log(b.x); // b 依然指向之对的地址,属性 x 为 {n:2}
测试了一下,把a.x = a = {n:2}; 改成a = a.x = {n:2};得到的结果是一样的,但是赋值过程有点区别:
var a = {n:1};
var b = a;
a.x = {n:2}; // 此时 a === b 为true,对象内容都为{n: 1, x: {n: 2}}
a = a.x; // 这时 a 的指针指向一个新对象的时候,同时也失去了 x 属性
console.log(a.x); // 因为 a 里没有 x 的属性,所以返回值为 undefined
console.log(b.x); // b 依然指向之对的地址,属性 x 为 {n:2}
得到的结论是,无论a.x = a = {n:2}; 还是a = a.x = {n:2}; 优先执行a.x的赋值,再执行a的赋值,而被赋值后的a里只有一个n属性,所以x为undefined。
新人学习,欢迎各位大神指点,谢谢 ^_^