前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >a=b=c,但a不等于c?这是什么鬼

a=b=c,但a不等于c?这是什么鬼

作者头像
web前端教室
发布2018-02-07 11:47:01
1.3K0
发布2018-02-07 11:47:01
举报
文章被收录于专栏:web前端教室web前端教室
代码语言:js
复制
昨天在网上乱翻资料,发现一道题,很有意思,是这样婶的,
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}了么?”

很可惜,电脑不是人脑,它不会略过任何细节。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-09-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 web前端教室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档