JS连续赋值

79 阅读1分钟
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内运算符优先级中,.运算符\color{red}{.运算符}优先级是高于=运算符\color{red}{=运算符}的. (运算符优先级 - JavaScript | MDN (mozilla.org))

.拥有18的权重 , 赋值运算符只有2的权重。

所以执行顺序为

-> a.x\color{red}{a.x} => 在a第一个指向的堆内存中创建一个 x:undefined
-> a=n:2\color{red}{ a = { n : 2 }} => a 在堆内存内新开了一个内存地址,指向了第二个堆
-> a.x=a\color{red}{a.x = a} => 此时 a.x 指向的还是第一个堆内存 ,所以当前赋值操作给第一个堆内存赋值。

总结:
console.log(a.x); //a指向第二个堆内存
console.log(a);
console.log(b);>//b向第一个堆内存