一个js面试题的分析

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


你可能感兴趣的:(一个js面试题的分析)