从一道JS题认识JS运算符优先级

一道很简单的JS题

今天在群里看到一套题,具体是这样

1
2
3
var foo={n:1};
foo.x=foo={n:2};
console.log(foo.x);

按照我的理解:
var foo={n:1}
0_1472960988417_upload-a8097323-d217-4ae4-b0ad-f59714908701


foo.x=foo={n:2};
我们知道JS的逻辑运算是从右到左的。
这样就很好理解了:
0_1472961495561_upload-8372f8e3-96bb-4d5c-a683-28819ffe291c


这样很明显了foo.x=2;

但是结果却是 foo.x=undefined


运算符优先级的正确姿势

这里我们在第二步foo.x=foo={n:2}这里应该考虑到运算符的优先级
在这里。成员访问.的优先级高于赋值=

  • 这里应该先计算foo.x
    0_1472965889433_upload-34700c4e-b7c9-404f-b742-28573fe50941
  • 接着按照从右往左的赋值运算顺序先执行foo={n:2}
    使foo的指针指向{n:2};
  • 然后计算foo.x=foo;
    这里就相当于 把对象A的x属性指向{x:2};
    即为:
    0_1472967840039_upload-eaee39d0-5ec6-425f-976d-f0c4f1c42506

所以当我们调用 console.log(foo.x)
当调用console.log(foo.x)的时候 访问对象B。
在对象B发现没有这个x属性,就会顺着__proto__沿着原型链向上寻找。知道最顶层Obeject.prototype 也没有发现Obeject.prototype.x这个属性。自然也就输出undefined

JS运算符的优先级 大值顺序

1
括号>成员访问(. [])>函数调用>后置递增减>逻辑运算