1. 程式人生 > >javascript中的n++運算,它的運算過程到底是怎樣的

javascript中的n++運算,它的運算過程到底是怎樣的

var n=1;
n=n++;
console.log(n)   //1

之前我一直弄不懂為什麼n++最終沒有起到效果,原來我並沒有弄懂字尾++的運算過程。
先看一道題目:

var a=3,b;
b=a++*a++;
console.log(b)    //12

可以看出第一個a++是用3進行其他運算,第二個a++是用4進行其他運算,我們可以得出結論:
字尾++的運算過程:先在記憶體中快取變數原值用來參加其他運算(此時其他運算還未進行),再將該變數本身自加,然後再用快取的原值進行其他運算
這裡的其他運算是指除了++的所有運算,或者“,”和“;”。

所以最開始的例子應該這樣理解:

var n=1;
//n=n++運算開始
var temp=n;    //編譯器解析到“n=n++”中的“n++”後,會先在記憶體中快取n的原值,用來參與其他運算
n = n+1;       //編譯器解析到“n=n++”中的“=”後,會在做“=”運算前將n自加
n = temp;      //變數自加結束後,用快取的原值進行“=”運算
//n=n++運算結束
console.log(n) //1

這樣理解的話,自加其實是在“=”運算進行之前就結束了,所以最終n++就相當於沒有進行。

有人會問,多個++之間的優先順序怎麼算呢?不用擔心,js識別不了a++++和++a++這種語法。
多個++識別不了,那a+++a呢?其實這是“貪心演算法”:

編譯器會從左到右一個字元一個字元解析,如果已解析的字元已經能夠組成一個符號,再解析下一個字元,判斷下一個字元能否和已解析出的符號再次組合成一個符號,如果能,再不斷重複如上過程;如果不能,則使用最終解析出的符號。

所以a+++a等於(a++)+a,如下程式碼

var a=3,b;
b=a+++a;        //b=(a++)+a, b=3+4
console.log(b)  //7