let a = { n : 1 };
let b = a; // b = { n : 1 }
a.x = a = { n : 2 } // a.x = undefined -> a重新指向一个堆 -> a = { n : 2 }
// -> a.x指向还是 b指向的位置, -> b = { n : 1, x : { n:2 } }
console.log(a.x);
console.log(a);
console.log(b);
result:
undefined
{ n : 2 }
{ n : 1, x : { n : 2 } }
这一块对小白来说可能很懵,为什么 a.x 会输出 undefined ? 因为在js内运算符优先级中,优先级是高于的. (运算符优先级 - JavaScript | MDN (mozilla.org))
.拥有18的权重 , 赋值运算符只有2的权重。
所以执行顺序为
->
=> 在a第一个指向的堆内存中创建一个 x:undefined
->
=> a 在堆内存内新开了一个内存地址,指向了第二个堆
->
=> 此时 a.x 指向的还是第一个堆内存 ,所以当前赋值操作给第一个堆内存赋值。
总结:
console.log(a.x); //a指向第二个堆内存
console.log(a);
console.log(b);>//b向第一个堆内存