首先看一段代码:
var a = {n:1};
var b = a;
a.x = a = {n:2};
console.log(a.x);
console.log(b.x);
按照正常思维逻辑,我们会有以下猜想: // 错误猜想
- 开辟一块内存地址存储{n: 1}, 变量a指向此地址
- 变量b引用a
- 赋值操作从右向左,开辟一块新内存地址存储{n: 2}, 变量a改变指向到此地址(因为b持有对a的引用,b指向也改变), 执行左边第二个赋值操作,a.x = a, 无限循环直到浏览器引擎限制
- a,b输出相同,都为一个无限循环的对象{n:2, x:{n:2, x:{...}}}
但是事实是:
console.log(a.x); // --> undefined
console.log(b.x); // --> {n:2}
纳尼?居然是道送命题,看了网上大神们的分析,正确的思路应该是这样:
-
开辟一块内存地址存储{n: 1}, 变量a指向此地址
-
变量b引用a
-
先声明a对象的x属性(a指向{ n: 1 },对a赋值,指向{ n: 2 },再对a.x赋值(原来的a,也就是b,也就是{ n: 1 })
-
由于a指向了新的内存地址{ n: 2 }, b指向原地址,原地址存储对象中的x属性被复制,所以最后a === { n: 2 }, b === { n: 1, x: {n: 2} }
重点:.运算符优先于=赋值运算
具体细节参考:www.cnblogs.com/xxcanghai/p…