昨天在网上乱翻资料,发现一道题,很有意思,是这样婶的,
var a = {n:1};
a.x = a = {n:2};
console.log(a.x);
答案是多少?先想想再往下看
好吧,先说结论,我也答错了,
我直觉的认为结果是 {n:2},
但结果是,
为什么会这样呢?我往下看了关于答案的解答,写的绕来绕去的,但其实也很简单。
这里面有二个关键点,
1、js中的 . 运算符的优先级要高于 = ;
2、js中的对象是“按引用传递的”;
把这个问题拆分一下,
看到了么?结果还是undefined。
因为:
1、a.x之后,又把a的值整个的改了;
2、改完之后a里面彻底没有x了;
3、a.x肯定报undefined;
这么写出来相信大家都能看懂,但为什么使用连等号就会引起误解呢?
因为js中的 . 运算符的优先级要高于 =号,
1、在连等中,先声明了a对象的x属性,而x属性此时还没有赋值;
2、然后连等号又接着把a改为{n=2}了,此时a.x依然没有值;
3、此时执行a.x,结果必然是undefined
还不明白的同学,可以百度查一下“js 运算符优先级”,复习一下相关的内容。
这里有一个思维误区,就是人脑不比机器,人脑会自动略过一些细节,而自动得出最具有合理性的答案,
“已经把{n:2}赋值给a了,那再把a赋值给a.x,那a.x的值不就是{n:2}了么?”
很可惜,电脑不是人脑,它不会略过任何细节。