<code>
var a = {
n:1
}
var b = a;
a.x = a = {
n:2
}
console.log(a.x)
console.log(b.x)
</code>
连等赋值为A=B=C;从右往左,所以是C=B,B=A;
所以这段代码应该是这样执行的:全局执行上下文创建后,创建变量对象时,创建一个变量a 它的值为一个引用地址的指针,指向n:1
然后创建一个变量b,它的值为变量a的引用地址指针,此时,a和b是完全一样的
然后执行下面的代码,按照早先的思路,连等赋值应该是从右往左执行的,应该是n:2这个值赋给a,然后a赋值给a.x,所以a.x应该为n;2,b.x应该为undefined;实际是错的。
先创建一个新的引用地址 n:2
.运算符是优先于=运算符的,所以先声明一个a的属性x,为undefined,此时a是指向b的,所以b现在也拥有一个x属性为undefied,然后将a变量的引用地址指针改变为n:2,因为a的变量引用地址指针变成了n:2,新的引用地址当中没有x这个属性,所以x为undefined.
然后a.x现在指向的是旧的引用地址,也就是b的引用地址中的x,然后将b.x赋值为n:2。所以最后,a.x应该为undefined,b.x为n:2
网友评论