之前写了关于a++的运算过程,这些天看面试题的时候又发现了一些有深坑的运算符。今天写一下“+=”运算符和“.”运算符。
先看这样一道面试题吧。
var a = 2;
a += a += a++;
console.log(a) //6
是不是像绕口令?
之前我分析过a++其实是缓存了一个temp=a的原值,再把a自身加一,再用temp进行其他计算,
实际上a+=也是如此,一样是缓存a的原值用来参与计算,等效于a=temp+ 。
先看a+=a++,它的过程如下:
var temp = a;
a = a + 1; //a++运算
a = temp + temp; //a+=a++运算
所以a += a += a++其实就等价于:
a = temp + temp + temp; //6
下面我们再来看一道题:
var a = {};
a.x = a = {n:1};
console.log(a.x) //undefined
这道题跟之前的题目有个很大的不同,就是用到了”.”运算符,它是所有运算中优先级最高的,会在赋值进行之前先运算。所以运算过程如下:
//先解析a.x, 给a指向的空对象添加属性x
a = {x:undefined};
//再解析a={n:1},a的指向变成了另一个对象{n:1}
a = {n:1}
//再解析a.x=a,这里注意,a.x一开始已经解析过了,这里的a指向的是{x:undefined}
{x:undefined}.x = a;
运算结束后a = {n:1},自然没有x属性了