文档章节

一个js面试题的分析

佣兵0926
 佣兵0926
发布于 2015/12/07 00:34
字数 550
阅读 679
收藏 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


© 著作权归作者所有

共有 人打赏支持
佣兵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
由一道关于变量作用域的面试题,来加深对var和let的理解

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

一斤代码
07/23
0
0
前端面试&笔试&错题指南(三)

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

Vincent Ko
08/12
0
0
5个典型的JavaScript面试题(上)

本文由伯乐在线 -XfLoops 翻译,黄利民 校稿。未经许可,禁止转载! 英文出处: Aurelio De Rosa。欢迎加入 翻译组。 IT 行业对JavaScript开发者有着很大的需求。如果你具备这种角色所需的知...

伯乐在线
2014/12/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

ES6 Promise

Promise promise是异步编程的一种解决方案 1 什么是异步? 异步模式,每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则...

NDweb
14分钟前
0
0
Python百分登顶年度编程语言排行榜

今天 IEEE Spectrum 发布了 2018 年度顶级编程语言排行榜。该榜单可根据流行趋势、职业方向、语言类型等多个标准各自细分生成榜单,也可以综合多个标准进行排列,使用者可以根据自己的需求过...

六库科技
18分钟前
0
0
consul笔记

安装和启动就不说了,很简单。 注册一个服务: http://localhost:8500/v1/agent/service/register put请求,json格式内容如下 { "ID": "userServiceId", //服务id "Name": "userService", //服...

朝如青丝暮成雪
18分钟前
0
0
iOS CollectionView 的那些事

UICollectionView是开发中用的比较多的一个控件,本文记录UICollectionView在开发中常用的方法总结,包括使用UICollectionViewFlowLayout实现Grid布局、添加Header/Footer、自定义layout布局...

aron1992
19分钟前
0
0
linux tar.gz zip 解压缩 压缩命令

http://apps.hi.baidu.com/share/detail/37384818 download ADT link http://dl.google.com/android/ADT-0.9.6.zip download SDK link http://dl.google.com/Android/android-sdk_r11-linux_......

owensliu
21分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部