一道很简单的JS题
1 | var foo={n:1}; |
按照我的理解:var foo={n:1}
foo.x=foo={n:2}
;
我们知道JS的逻辑运算是从右到左的。
这样就很好理解了:
这样很明显了foo.x=2;
但是结果却是 foo.x=undefined
运算符优先级的正确姿势
这里我们在第二步foo.x=foo={n:2}
这里应该考虑到运算符的优先级
在这里。成员访问.
的优先级高于赋值=
;
- 这里应该先计算
foo.x
- 接着按照
从右往左
的赋值运算顺序先执行foo={n:2}
使foo的指针指向{n:2}; - 然后计算foo.x=foo;
这里就相当于 把对象A的x属性指向{x:2};
即为:
所以当我们调用 console.log(foo.x)
当调用console.log(foo.x)的时候 访问对象B。
在对象B发现没有这个x属性,就会顺着__proto__
沿着原型链向上寻找。知道最顶层Obeject.prototype
也没有发现Obeject.prototype.x这个属性。自然也就输出undefined
JS运算符的优先级 大值顺序
1 | 括号>成员访问(. [])>函数调用>后置递增减>逻辑运算 |