一个js面试题的分析
一个js面试题的分析
佣兵0926 发表于2年前
一个js面试题的分析
  • 发表于 2年前
  • 阅读 579
  • 收藏 7
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 由结果推原因的分析,不一定对,不过自我感觉“很有道理”的样子,备忘下

网上看到“叶小钗”的一篇面试文章,里面谈到了一个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


共有 人打赏支持
粉丝 5
博文 56
码字总数 28941
×
佣兵0926
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: