首页 > 谁能帮我解释一下这段 JavaScript 代码

谁能帮我解释一下这段 JavaScript 代码

var a = {n:1};
var b = a;

a.x = a = {n:2};

console.log(a.x);
console.log(b.x);

结果我是知道了,但不知道为什么。


由ES规范学JavaScript(二):深入理解“连等赋值”问题


该问题已经有啦
请移步
http://.com/q/1010000002637728


属性访问表达式优先级高于“=”号,优先执行a.x={n:2},再执行a={n:2},a的指向变了,此时a中并没有x属性了,而b的指向不便,原来的对象{n:1}被添加了x属性


新手也来答一下,

我对指针也不怎么了解,说的不对的地方勿喷啊。
首先说明一点问题:“属性访问表达式优先级高于运算符”
即a.x=1; 先运行a.x
//代码从上往下运行
var a = {n:1};
//a指向   {n:1} (通俗点说我们叫m空间吧)
var b = a;
//b指向a所指向的内容 即b指向{n:1} (m空间)
a.x = a = {n:2};
//1 a.x
//前面说了 属性访问表达式优先级高于运算符  先运行a.x
//这个时候的a还是指向{n:1} (m空间) 那么"m空间会创建一个x属性" 即m空间m.x 即{n:1,x:undefiend}
//2 a={n:2}
//然后执行a={n:2} 这个时候a的指向改变 a指向{n:2} (代号n空间) 这个时候的a 与上一步骤时候的a的指向已经不同了
//3 a.x(m空间)=a(n空间);
//这个时候m的x属性指向n空间  
//代码执行完毕 来查看答案m空间( {n:1,x:{n:2}} ) ,  n空间( {n:2} )
//变量指针指向  a指向n空间  b指向m空间


// 以上 输出结果可想而知

----原先以为是这样的----
首先,a 与 b 变量引用同一对象,然后,新对象{n: 2} 重写变量 a, 创建并赋值给 a 的成员 x,此时 a 与 b 引用的不是同一对象了。
所以,a.x 输出新对象。 b.x 输出 undefined。
----现在----
再想了一遍,或许是这样的,首先,ab 引用同一对象,然后 a.x = a = {n: 2} ,这里应该是先在 a 与 b 创建 x ,b.x 和 a.x 都指向 a ,a.x = a 把自己给重写了。于是 a.x 输出 undefined ,b.x 输出 {n: 2}。

【热门文章】
【热门文章】