從兩段代碼說起
var num1 = 2;
var num2 = 20;
var num3 = --num1 + num2;
var num4 = num1 + num2;
console.log(num1 +'-' + num2 +'-'+ num3 +'-' + num4)
將四個數分別打印是多少?
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2;
var num4 = num1 + num2;
console.log(num1 +'-' + num2 +'-'+ num3 +'-' + num4)
這段代碼運行之后將四個數分別打印又是多少?
如果你能果斷地說出答案並且能自圓其說,那也就沒必要繼續看下去了。
遞增運算符和遞減運算符
我們都知道,JavaScript中的遞增運算符是 ++,遞減運算符是 --。簡單來說,遞增運算符就是將變量+1,遞減運算符就是讓變量-1,可是前置和后置結果是不一樣的,也是很容易混淆的。
前置型遞增(遞減)
前置型簡單理解就是先計算再賦值。例如
var a = 1;
var b = ++a;
console.log(a); //2
console.log(b); //2
上面的表達式也可以理解為:
var a = 1;
a = a + 1;
var b = a;
后置型遞增(遞減)
后置型簡單理解就是先賦值再計算。例如
var a = 1;
var b = a++;
console.log(a); //2
console.log(b); //1
上面的表達式也可以理解為:
var a = 1;
var i = a;
a = a + 1;
var b = i;
原理
前置和后置型運算符之所以有上面的區別,是因為運算符的優先級。在各運算符按照優先級的不同由高到低排列順序中:
- 后置型遞增(遞減)運算符的優先級是17
- 前置型遞增(遞減)運算符的優先級是16
- 賦值運算符=的優先級是3
所以,++和--會優先於=執行。但是這邊我自己也還有個疑問,前置型的還可以用優先級解釋,但是后置型的怎么解釋呢,講道理它也比=的優先級高啊,這個我還有點疑問。
然后根據MDN上對遞增(++)的解釋:
- 如果后置(postfix)使用,即運算符位於操作數的后面(如 x++),那么將會在遞增前返回數值。
- 如果前置(prefix)使用,即運算符位於操作數的前面(如 ++x),那么將會在遞增后返回數值。
根據這個解釋,在例子中
var a = 1;
console.log(a++) //1
a++實際上是等於a遞增之前的數值的,也就是1,這個在開發中容易被忽略,要謹記。
總結
回到最上面的代碼,第一段代碼分別會打印:1-20-21-21,第二段代碼會打印:1-20-22-21
我們開發中需要記住的是:前置型是先計算再返回數值,后置型是先返回數值再計算。
