这段代码的输出结果想不明白,求高手帮忙分析下

    let a = {n: 1}
    let b = a;
    a.x = a = {n: 2}
    console.log(a.x);
    console.log(b.x);

第二个输出结果b.x我能理解,因为a和b是同一个引用,

但是一个的输出结果实在想不明白,求大神帮忙分析下

阅读 2.1k
6 个回答

a=5是一个表达式,会返回一个值

>  a=5
<  5

所以 b=a=5 是从右向左依次赋值的。
那么 a.x = a = {n: 2} 相当于

a = {n:2} // -> a : {n:2}
a.x = a   // -> a : {n:2,x:{n:2}}

大概这个意思吧

    [尽量不要用连续赋值操作][1]

let a = {n: 1} //地址一
let b = a;  // 引用 地址一
a.x = a = {n: 2} //将这一步拆开的执行顺序
   --  a = {n: 2} //此时的a为地址二
   --  a.x = a // 即{n: 2}; 连等时此a还是引用的地址一
console.log(a.x); //a的值在连等时已经变成了地址二
console.log(b.x); //b还是地址一
//总结起来就是此a非彼a

了解js引擎对于连等式的读取顺序就懂了

推荐问题
宣传栏