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

昨天在网上乱翻资料,发现一道题,很有意思,是这样婶的,
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}了么?”

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

原文发布于微信公众号 - web前端教室(webfeel)

原文发表时间:2017-09-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java学习

Java每日一练(2017/8/10)

最新通知 ●回复"每日一练"获取以前的题目! ●【新】Android视频更新了!(回复【安卓视频】获取下载链接) ●【新】Ajax知识点视频更新了!(回复【学习...

2584
来自专栏机器之心

人生苦短,为什么我要用Python?

本教程的目的是让你相信两件事:首先,Python 是一种非常棒的编程语言;其次,如果你是一名科学家,Python 很可能值得你去学习。本教程并非想要说明 Pyt...

1061
来自专栏瓜大三哥

HLS Lesson20-实例分析

1.改善吞吐率:本质是通过改善并行度实现的 ? 当pipeline作用于函数的时候,从IO角度来看数据是没有空隙的,而作用于循环时候,则相邻的两个循环之间会有一...

2126
来自专栏人工智能LeadAI

python与数据科学应用

数据科学简介与应用 数据科学主要以统计学、机器学习、数据可视化以及(某一)领域知识为理论基础,其主要研究内容包括数据科学基础理论、数据预处理、数据计算和数据管...

3805
来自专栏CDA数据分析师

人生苦短,为什么我要用Python?

本教程的目的是让你相信两件事:首先,Python 是一种非常棒的编程语言;其次,如果你是一名科学家,Python 很可能值得你去学习。本教程并非想要说明 Pyt...

723
来自专栏编程

C语言发展历史,C语言特点,C语言利于弊,入门须知三招

C语言的发展历史: ? 20世纪70年代初,贝尔实验室的Dennis Richie 等人在B语言基础上开发出C语言,最初是作为UNIX的开发语言; 20世纪70...

3349
来自专栏云飞学编程

Python的面向过程、面向函数、面向对象的区别浅谈

有人之前私信问我,python编程有面向过程、面向函数、面向对象三种,那么他们区别在哪呢?这个问题,让我想起我在学习编程的时候,我的老师给我举的例子。分享给大家...

1652
来自专栏转载gongluck的CSDN博客

python笔记:#001#python简介

认识 Python 人生苦短,我用 Python —— Life is short, you need Python ? 目标 Python 的起源 为什么要...

3598
来自专栏数据结构与算法

P2002 消息扩散

题目背景 本场比赛第一题,给个简单的吧,这 100 分先拿着。 题目描述 有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问...

38110
来自专栏java学习

java每日一练(2017/8/9)

最新通知 ●回复"每日一练"获取以前的题目! ●【新】Android视频更新了!(回复【安卓视频】获取下载链接) ●【新】Ajax知识点视频更新了!(回复【学习...

2888

扫码关注云+社区

领取腾讯云代金券