在网上看到了这样的代码:
var a = {n:1};
var b = a;
a.x = a = {n:2};
console.log(a);
console.log(a===b);
console.log(b);
然后输出结果是:
{n:2}
false
{n:1,x:{n:2}}
看了之后感觉很懵啊,就是不太懂为什么会这样子。之后发现是这样的
- 首先a->{n:1}, b->{n:1}
- 看下这个语句
a.x = a = {n:2}
- 根据运算符的规则,那么首先执行a.x,也就是最左侧准备被赋值的对象是{n:1},被赋值的属性是{n:1}这个对象的x,同时{n:1}也是b指向的对象。
- 接着执行赋值,从右往左,这时候a->{n:2},然后a.x->a,注意这个时候因为a.x的a还是{n:1}这个对象(因为 . 运算符优先),也就是相当于b.x->a。这时候结果就是{n:1,x:{n:2}}。
另外注意一个点就是,b.x指向的是a,因此修改a的任意属性都会反映到b.x上,同理修改b.x的属性也会反映到a上。
网友评论