文档章节

一个js面试题的分析

佣兵0926
 佣兵0926
发布于 2015/12/07 00:34
字数 550
阅读 682
收藏 7

网上看到“叶小钗”的一篇面试文章,里面谈到了一个js的面试题,自己做着试了下,全错!于是根据结果,反推了下原因。

题目:

var a = {n: 1};var b = a;
a.x = a = {n: 2}
console.log(a.x);
console.log(b.x)

这里面至少考了2个点:

1、js的引用类型数据

2、运算符优先级

对于一个老手来说,这里的坑主要在第二条,运算符优先级。

a.x = a = {n: 2}

2个等号,优先级相同,就先来后到,从左到右,等效于

a.x={n:2};
a={n:2};

为什么不能等效于

a.x=a;
a={n:2};

个人这么分析

js在执行赋值语句时,

如果等号右边是单个变量或者常量,直接执行赋值语句

如果是表达式,就看运算符优先级,如果优先级高于赋值语句,比如加法、减法等,就等高优先级运算之后,将结果赋值

如果又是一个赋值语句,那么优先级并不比自己高,就不能让它先计算,而是自己先往右继续寻找,直到找到一个独立的常量或者变量。

在这个例子中

a.x = a = {n: 2}

js引擎,不会把a直接赋值给a.x,因为a不是独立的,它从属于另外一个赋值语句,且是它的主体

a = {n: 2}

这个赋值语句,计算优先级和自己相同,先来后到,那么这个赋值语句就不能执行,自己还是继续往右找:a不能赋值,=是运算符,更不可能,继续往右,就是

{n: 2}

它是一个正真独立的常量,所以第一个等号就赋值成它,也就是

a.x={n:2};

的出处,执行完第一个赋值语句,再执行第二个

a = {n: 2}

第二个比较直接就没什么好说的了

所以,源代码中

a.x = a = {n: 2}

改成

a.x = (a = {n: 2})

运算结果也还是不变

原文:http://www.cnblogs.com/yexiaochai/p/4366051.html


© 著作权归作者所有

共有 人打赏支持
上一篇: em使用补充
佣兵0926
粉丝 4
博文 56
码字总数 28941
作品 0
广州
私信 提问
太原面经分享:如何用js实现返回斐波那契数列的第n个值的函数

面试攒经验,let's go! 值此高考来临之际,闲不住的我又双叒叕出发去面试攒经验了,去了公司交待一番流程后,面试官甩给了我一张A4纸,上面写着一道js算法笔试题(一开始我并不知道这是在考...

闰土大叔
06/07
0
0
阿里巴巴Web前端开发面试题赋答案

最近发现阿里巴巴的Web前端开发面试题,共分三部分:CSS部分,JavaScript部分,紧急处理部分,分享给大家做个参考~ 第一部分:用CSS实现布局 让我们一起来做一个页面 首先,我们需要一个布局...

Qianduaner
2013/09/06
0
0
javascript多线程

遇到一个面试问题: javascript实现多线程计算,列举下常用的方案 ?我回答了使用一些第三方库实现多线程。但感觉答得不好。。请问这道题的考点是什么。。方案是什么?

gdxz110
2013/09/29
1K
10
前端面试&笔试&错题指南(三)

JavaScript排坑指南(三) JavaScript总是给人以惊喜,学习不止,进步不断,今天继续补充JS容易搞错的几道笔试/面试题,为了秋招继续努力,欢迎一起为秋招努力的小伙伴共勉 ------------------...

Vincent Ko
08/12
0
0
由一道关于变量作用域的面试题,来加深对var和let的理解

最近,有一道JavaScript面试题挺流行的,很多朋友去面试的时候都遇到了。这道题目大致是这个样子的: 以下这段代码执行后,结果为什么不是依次输出0到9?如果要让它实现这样的输出,你会怎么...

一斤代码
07/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7下Tomcat启动慢的原因及解决方案

CentOS7下Tomcat启动慢的原因及解决方案 现象   在一次CentOS 7系统中安装Tomcat,启动过程很慢,需要几分钟,经过查看日志,发现耗时在这里:是session引起的随机数问题导致的。Tocmat的S...

linjin200
11分钟前
0
0
表格单元格td设置宽度无效的解决办法

<!--如果这样设置无效,--> <td width="120">123456789000000000000</td><!--那么套个div再设置宽度就有效了。--> <td><div style="width: 60px;overflow: hidden;text-overflow: e......

SummerGao
11分钟前
0
0
06.Beetl标签函数include ---《Beetl视频课程》

本期视频实现了评论列表分页; 内容简介:使用了标签函数include完成分页抽取 一起学beetl目录:https://my.oschina.net/u/1590490?tab=newest&catalogId=6214598 作者:GK 标签函数 includ...

Gavin-King
14分钟前
0
0
Valid Anagram(leetcode242)

Given two strings s and t , write a function to determine if t is an anagram of s. Example 1: Input: s = "anagram", t = "nagaram"Output: true Example 2: Input: s = "rat", t = ......

woshixin
17分钟前
0
0
Parameter 'loginname' not found. Available parameters are [arg1, arg0, param

原来是这样写的 @Select("select * from user where login_name=#{loginName} and password=#{password}") User findWithLoginnameAndPassword(int loginName,String password); 一直报找不到......

kuchawyz
20分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部