JavaScript 算數運算符
算術運算符以數值(字面量或變量)作為其操作數,并返回一個單個數值。標準算術運算符是加法(+),減法( - ),乘法(*)和除法(/)?!?MDN
算數運算符是用來做算數運算的,如 +
這個符號,就是用來做加法操作。
1. N元運算
N
代表一個數,如一元運算,二元運算。
N元運算
表示由N個值產生一個新的值的規則。
如 *
就是一個二元運算符,他由兩個數相乘產生第三個數。
JavaScript 中有三元運算符、二元運算符、一元運算符。
注意:網絡上可以搜索到 JavaScript 中有更多元的運算,基本上都是使用三目(元)表達式嵌套來完成的,嚴格上說這不屬于更多元的運算。
與算數相關的只有二元與一元運算符:
二元運算符:
+
加法-
減法*
乘法/
除法%
求余**
冪 (ES2016 提案)
一元運算符:
+
一元正號-
一元負號++
遞增--
遞減
2. 二元運算符
2.1 加法(+)
加法用來做求和,將 +
左右兩邊的數值相加,也可以用來連接字符串。
var num1 = 2;
var num2 = 3;
var total = num1 + num2;
console.log(total); // 輸出:5
var firstName = 'hello';
var lastName = 'world';
var name = firstName + ' ' + lastName;
console.log(name); // 輸出:"hello world"
數字的加法就是和自然數學里的加法一樣,做累加操作。
+
碰到字符串就會把兩邊字符連接到一起,形成一個新的字符串。
2.2 減法(-)
減法操作是將 -
左邊的數減去 -
右邊的數,結果就是差值。
var totalApple = 10; // 一共有10個蘋果
var take = 4; // 小明拿走了四個蘋果
var left = totalApple - take; // 還有 10 - 4 個蘋果
console.log(left); // 輸出:6
2.3 乘法(*)
乘法操作將 *
左右兩邊的數相乘,結果就是積。
var result = 5 * 6;
console.log(result); // 輸出:30
2.4 除法(/)
除法操作將 /
左邊的數作為被除數,右邊的數作為除數,最后求出結果。
var result = 6 / 2;
console.log(result); // 輸出:3
在許多強類型的語言中,整數相除即便無法除盡,結果必然是整數,但在 JavaScript 中,整數相除如果無法除盡,也會返回小數部分。
console.log(2 / 5); // 輸出:0.4
上面這個結果在 Java
中會返回 0,但是在 JavaScript 中會反回 0.4。
注意:如果拿正負 0 作為除數,則結果會返回 Infinity 與 -Infinity。
2.5 求余(%)
求余事實上就是取模運算,也就是取余數。如 8 對 3 取模,結果為 2,按小學數學中的說法就是 8 除 3 得 2余2
,余2就是結果。
var result = 8 % 3;
console.log(result); // 輸出:2
2.6 冪(**)
冪是 ES2016 提供的新運算符,用來做乘方運算。
**
左邊是底數,右邊是指數,如 2 ** 3
按數學中的表示就是 23,即求 2 的 3 次方。
var total = 2 ** 3; // 2 的 3次方,結果為 2 * 2 * 2 ,即8
console.log(total); // 輸出:8
在 JavaScript 中的冪運算與其他語言有些許區別,規范中指出禁止使用帶有歧義的冪運算表達式。
如底數前不能跟隨一元運算符。
console.log(-8 ** 2); // 在JavaScript會報錯
以上冪運算是會報錯的,因為 JavaScript 無法知道是要在計算完 8 的 2 次方后求反,還是計算 -8 的 2 次方。
使用括號可以提供具體的意義,消除歧義:
console.log((-8) ** 2); // -8的2次方
console.log(-(8 ** 2)); // 計算完8的2次方后求反
3. 一元運算符
3.1 一元正號
一元正號通常不參與數學運算,而是用作類型轉換,一元正號可以很方便的將其他類型轉換成數字。
var num1 = +3;
var num2 = +'3';
var num3 = +true;
var num4 = +false;
var num5 = +null;
var timestamp = +new Date(); // 直接得到時間戳
3.2 一元負號
一元負號也可以將其他類型的數據轉換成數字,但是轉換完后會在前面加上負號。
var num1 = -3;
var num2 = -'3';
var num3 = -true;
var num4 = -false;
var num5 = -null;
var timestamp = -new Date();
通常比較多的使用場景是對數字取反,讓數值在正負值切換。
3.3 遞增
遞增操作會讓數值本身增加 1。
var num = 0;
num++;
console.log(num); // 輸出:1
num++;
console.log(num); // 輸出:2
這樣看,遞增操作有點像x = x + 1
這種操作,其實只有在后置使用時的效果是和x = x + 1
一樣的,也就是++x
。
前置使用的時候,會先做遞增操作,再返回數值。
后置使用時候,會先返回數值,再做遞增操作。
var num = 0;
var total = 1 + (num++);
console.log(total, num); // 輸出:1 1
這個是前置使用的情況,可以看到 num 的值是 1,total 的值也是 1,也就是說 total 再累加的時候為(1 + 0),這個時候 num 的值為 0,再這個值返回后對 num 進行了遞增,所以輸出 num 結果為 1。
var num = 0;
var total = 1 + (++num);
console.log(total, num); // 輸出:2 1
這個是后置使用的情況,total 輸出結果為 2,在求和的時候就是(1 + 2),num 是在遞增后再被使用的。
3.4 遞減
遞增操作會讓數值本身減去 1。
與遞增一樣,遞減也具有前置使用與后置使用的情況。
var num = 1;
var total = 1 + (num--);
console.log(total); // 輸出:2
var num2 = 1;
var total2 = 1 + (--num);
console.log(total2); // 輸出:0
4. 優先級
算術符的優先級與自然數學中的相似,按照先乘除后加減
的規則來,具體的可以參考下表:
優先級 | 運算類型 | 符號 |
---|---|---|
6 | 括號 | ( … ) |
5 | 后置遞增 | … ++ |
后置遞減 | … -- | |
4 | 一元加法 | + … |
一元減法 | - … | |
前置遞增 | ++ … | |
前置遞減 | -- … | |
3 | 冪 | … ** … |
2 | 乘法 | … * … |
除法 | … * … | |
取模 | … % … | |
1 | 加法 | … + … |
減法 | … - … |
括號
> 后置遞增/后置遞減
> 一元加法/一元減法/前置遞增/前置遞減
> 冪
> 乘法/除法/取模
> 加法/減法
可以見到,括號的優先級是最高的,所以建議在自己不確定優先級的時候,盡量使用括號決定優先級。
如:
var res = 1 + 2 / 3 * 4 % 5 ** 7;
上面這個表達式的運算順序,即便是知道優先級,也不是一眼就能看出來的,所以建議即便是知道優先級,也使用括號將計算順序做區分。
將想要的計算順序用括號包裹后:
var res = 1 + (((2 / 3) * 4) % (5 ** 7));
4. 小結
算數運算符主要參與運算,N 元運算就是用 N 個值產生一個新的值,運算符有自己的特性和優先級,當表達式較長的時候,建議使用括號包裹來控制執行順序。