運算子
- 1.?一元運算子
- 1.1) 遞增 / 遞減運算子
- 遞增和遞減遵循的規則
- 1.2)一元加和減
- 2.?位運算子
- 2.1)按位非
- 2.2) 按位與
- 2.3) 按位或
- 2.4) 按位異或
- 2.5) 左移
- 2.6) 有符號右移
- 2.7) 無符號右移
- 3.? 布爾運算子
- 3.1) 邏輯非
- 3.2) 邏輯與
- 3.3) 邏輯或
- 4.?乘性運算子
- 4.1) 乘法運算子
- 4.2) 除法運算子
- 4.3)取模運算子
- 5.?指數運算子
- 6.?加性運算子
- 6.1) 加法運算子
- 6.2)減法運算子
- 7.?關系運算子
- 8.?相等運算子
- 8.1)等于和不等于
- 8.2) 全等和不全等
- 9.?條件運算子
- 10.?賦值運算子
- 11.?逗號運算子
- 12.?常見運算子優先級
1.?一元運算子
1.1) 遞增 / 遞減運算子
前綴遞增和遞減
let a = 1, b = 2;
let c = ++a; // c = 2
let d = --b; // b = 1
后綴遞增和遞減
let a = 1;
let c = a--; // c = 1;
let d = a; // d = 0;
前后綴的主要區別:
??后綴遞增和遞減在陳述句求值后才發生,
這四個運算子均可用于任何值,即可以用字串,布林值和物件等,
遞增和遞減遵循的規則
- 對于字串,如果是有效的數值形式,則轉換為數值再應用改變,變數型別從字串變成數值,
- 對于字串,如果不是有效的數值形式,則將變數的值設定為 NaN ,變數型別從字串變成 數值,
- 對于布林值,如果是 false,則轉換為 0 再應用改變,變數型別從布林值變成數值,
- 對于布林值,如果是 true,則轉換為 1 再應用改變,變數型別從布林值變成數值,
- 對于浮點值,加 1或減 1,
- 如果是物件,則呼叫其 valueOf() 方法取得可以操作的值,對得到的 值應用上述規則,如果是 NaN,則呼叫 toString() 并再次應用其他規則,變數型別從物件變成數值,
1.2)一元加和減
一元加和減如果用在普通的數值運算上與數學用法沒有區別,
如果將一元加和減應用到非數值,則會執行與使用 Number() 轉型函式一樣的型別轉換:
??布林值 false 和true轉換為0和1
??字串根據特殊規則進行決議
??物件會呼叫它們的valueOf() 和 / 或 toString() 方法以得到可以轉換的值
2.?位運算子
位運算子用于數值的底層操作,也就是操作記憶體中表示資料的位元(位)
2.1)按位非
按位非運算子用波浪符(~)表示,它的作用是回傳數值的補數(即對數值取反并減一,不過位運算子運算速度更快),
let num1 = 25; // 二進制 00000000000000000000000000011001
let num2 = ~num1; // 二進制 11111111111111111111111111100110
console.log(num2); // -26
2.2) 按位與
按位與運算子用和號(&)表示,有兩個運算元,本質上,按位與就是將兩個數的每一個位對齊, 然后基于真值表中的規則,對每一位執行相應的與操作(1 & 1 = 1,其他均為 0),
let result = 25 & 3;
// 25 = 0000 0000 0000 0000 0000 0000 0001 1000
// 3 = 0000 0000 0000 0000 0000 0000 0000 0011
// = 0000 0000 0000 0000 0000 0000 0000 0001
console.log(result); // 1
2.3) 按位或
按位或運算子用管道符(|)表示,有兩個運算子,遵循基于真值表中的規則,每一位執行操作(0 | 0 = 0,其他均為 1),
let result = 25 | 3;
// 25 = 0000 0000 0000 0000 0000 0000 0001 1001
// 3 = 0000 0000 0000 0000 0000 0000 0000 0011
// = 0000 0000 0000 0000 0000 0000 0001 1011
console.log(result); // 27
2.4) 按位異或
按位異或用脫字符(^)表示,有兩個運算子,遵循基于真值表中的規則,每一位執行操作(當兩個相同的時候回傳 0 ,其他回傳 1),
let result = 25 ^ 3;
// 25 = 0000 0000 0000 0000 0000 0000 0001 1001
// 3 = 0000 0000 0000 0000 0000 0000 0000 0011
// = 0000 0000 0000 0000 0000 0000 0001 1010
console.log(result); // 26
2.5) 左移
左移運算子用兩個小于號(<<)表示,會按照指定的位數將數值的所有位向左移動(左移會以 0 填充這些空位,會保留它所運算元的符號),
let oldValue = 2; // 等于二進制 10
let newValue = oldValue << 5; // 等于二進制 1000000,即十進制 64
2.6) 有符號右移
有符號右移由兩個大于號(>>)表示,會將數值的所有 32位都向右移,同時保留符號(正或負), 有符號右移實際上是左移的逆運算,
(右移后空位會出現在左側,且在符號位之后, ECMAScript會用符號位的值來填充這些空位,以得到完整的數值)
let oldValue = 64; // 等于二進制 1000000
let newValue = oldValue >> 5; // 等于二進制 10,即十進制 2
2.7) 無符號右移
無符號右移用 3個大于號表示(>>>),會將數值的所有 32位都向右移,
對于正數,無符號右移與有符號右移結果相同,
對于負數,與有符號右移不同,無符號右移會給空位補 0,而不管符號位是 什么,
let oldValue1 = 64; // 等于二進制 1000000
let newValue1 = oldValue1 >>> 5; // 等于二進制 10,即十進制 2
let oldValue2 = -64; // 等于二進制 11111111111111111111111111000000
let newValue2 = oldValue2 >>> 5; // 等于二進制00000111111111111111111111111110, 等于十進制 134217726
3.? 布爾運算子
布爾運算子一共有 3個:邏輯非、邏輯與和邏輯或,
(均可以用于任何型別的運算元)
3.1) 邏輯非
邏輯非運算子由一個嘆號(!)表示,
這個運算子始侄訓傳布林值,無論應用到的是什么資料型別,邏輯非運算子首先將運算元轉換為布林值,然后再對其取反,
遵循如下規則:
- 如果運算元是物件,則回傳 false
- 如果運算元是空字串,則回傳 true
- 如果運算元是非空字串,則回傳 false
- 如果運算元是數值 0,則回傳 true
- 如果運算元是非 0數值(包括 Infinity),則回傳 false
- 如果運算元是 null,則回傳 true
- 如果運算元是 NaN,則回傳 true
- 如果運算元是 undefined,則回傳 true
邏輯非運算子也可以用于把任意值轉換為布林值,
同時使用兩個嘆號(!!),相當于呼叫了轉型函式 Boolean(),
3.2) 邏輯與
邏輯與運算子由兩個和號(&&)表示,應用到兩個值,遵循真值表規則(兩個都為 true 的時候回傳 true,其他時候回傳 false)
遵循如下規則:
- 如果第一個運算元是物件,則回傳第二個運算元
- 如果第二個運算元是物件,則只有第一個運算元求值為 true 才會回傳該物件
- 如果兩個運算元都是物件,則回傳第二個運算元
- 如果有一個運算元是 null,則回傳 null
- 如果有一個運算元是 NaN,則回傳 NaN
- 如果有一個運算元是 undefined,則回傳 undefined
3.3) 邏輯或
邏輯或運算子由兩個管道符(||)表示,遵循真值表規則(兩個都為 false 的時候回傳 false,其他時候回傳 true),
遵循如下規則:
- 如果第一個運算元是物件,則回傳第一個運算元
- 如果第一個運算元求值為 false,則回傳第二個運算元
- 如果兩個運算元都是物件,則回傳第一個運算元
- 如果兩個運算元都是 null,則回傳 null
- 如果兩個運算元都是 NaN,則回傳 NaN
- 如果兩個運算元都是 undefined,則回傳 undefined
4.?乘性運算子
4.1) 乘法運算子
乘法運算子由一個星號(*)表示,可以用于計算兩個數值的乘積,
乘法運算子在處理特殊值時也有一些特殊的行為:
- 如果 ECMAScript 不能表示乘積,則回傳 Infinity 或 -Infinity
- 如果有任一運算元是 NaN,則回傳 NaN
- 如果是 Infinity 乘以 0,則回傳 NaN,
- 如果是 Infinity 乘以非0的有限數值,則根據第二個運算元的符號回傳 Infinity 或 -Infinity
- 如果是 Infinity 乘以 Infinity,則回傳 Infinity
- 如果有不是數值的運算元,則先在后臺用 Number() 將其轉換為數值,然后再應用上述規則
4.2) 除法運算子
除法運算子由一個斜杠(/)表示,用于計算第一個運算元除以第二個運算元的商,
除法運算子針對特殊值也有一些特殊的行為:
- 如果ECMAScript不能表示商,則回傳 Infinity 或 -Infinity
- 如果有任一運算元是 NaN,則回傳 NaN
- 如果是 Infinity 除以 Infinity,則回傳 NaN
- 如果是 0 除以 0,則回傳 NaN
- 如果是非 0的有限值除以 0,則根據第一個運算元的符號回傳 Infinity 或 -Infinity
- 如果是 Infinity 除以任何數值,則根據第二個運算元的符號回傳 Infinity 或 -Infinity
- 如果有不是數值的運算元,則先在后臺用 Number() 函式將其轉換為數值,然后再應用上述規則,
4.3)取模運算子
取模(余數)運算子由一個百分比符號(%)表示,
取模運算子對特殊值也有一些特殊的行為:
- 如果運算元是數值,則執行常規除法運算,回傳余數,
- 如果被除數是無限值,除數是有限值,則回傳 NaN,
- 如果被除數是有限值,除數是 0,則回傳 NaN
- 如果是 Infinity 除以 Infinity,則回傳 NaN
- 如果被除數是有限值,除數是無限值,則回傳被除數
- 如果被除數是 0,除數不是 0,則回傳 0
- 如果有不是數值的運算元,則先在后臺用 Number() 函式將其轉換為數值,然后再應用上述規則
5.?指數運算子
ECMAScript 7新增了指數運算子,Math.pow()現在有了自己的運算子**,結果是一樣的,
console.log(Math.pow(3, 2); // 9
console.log(3 ** 2); // 9
console.log(Math.pow(16, 0.5); // 4
console.log(16** 0.5); // 4
指數運算子也有自己的指數賦值運算子**=,
let squared = 3;
squared **= 2;
console.log(squared); // 9
6.?加性運算子
加性運算子有兩個,加法和減法運算子,
6.1) 加法運算子
對于普通數值就是求和,對于其他的也有著特殊的規則,
如果兩個運算元都是數值,加法運算子執行加法運算并根據如下規則回傳結果:
- 如果有任一運算元是 NaN,則回傳 NaN
- 如果是 Infinity 加 Infinity,則回傳 Infinity
- 如果是-Infinity 加 -Infinity,則回傳 -Infinity
- 如果是 Infinity 加 -Infinity,則回傳 NaN
- 如果是+0 加 +0,則回傳 +0
- 如果是-0 加 +0,則回傳 +0
- 如果是-0 加 -0,則回傳 -0
如果有一個運算元是字串,則要應用如下規則:
- 如果兩個運算元都是字串,則將第二個字串拼接到第一個字串后面
- 如果只有一個運算元是字串,則將另一個運算元轉換為字串,再將兩個字串拼接在一起
如果有任一運算元是物件、數值或布林值,則呼叫它們的 toString() 方法以獲取字串,然后再應用前面的關于字串的規則,
對于 undefined 和 null,則呼叫 String() 函式,分別獲取 “undefined” 和 “null”
6.2)減法運算子
對于普通的數值就是求差,也有著一些特殊的規則,
- 如果兩個運算元都是數值,則執行數學減法運算并回傳結果
- 如果有任一運算元是 NaN,則回傳 NaN
- 如果是 Infinity 減 Infinity,則回傳 NaN
- 如果是-Infinity 減-Infinity,則回傳 NaN
- 如果是 Infinity 減-Infinity,則回傳 Infinity
- 如果是 -Infinity 減 Infinity,則回傳 -Infinity
- 如果是+0 減 +0,則回傳 +0
- 如果是 +0 減 -0,則回傳 -0
- 如果是 -0 減 -0,則回傳 +0
- 如果有任一運算元是字串、布林值、null 或 undefined,則先在后臺使用 Number()將其轉 換為數值,然后再根據前面的規則執行數學運算,如果轉換結果是 NaN,則減法計算的結果是 NaN
- 如果有任一運算元是物件,則呼叫其 valueOf() 方法取得表示它的數值,如果該值是 NaN,則 減法計算的結果是 NaN,如果物件沒有 valueOf() 方法,則呼叫其 toString() 方法,然后再將得到的字串轉換為數值
7.?關系運算子
關系運算子執行比較兩個值的操作,包括小于(<)、大于(>)、小于等于(<=)和大于等于(>=)
這幾個運算子都回傳布林值,
用到不同資料型別時也會發生型別轉換和其他行為:
- 如果運算元都是數值,則執行數值比較
- 如果運算元都是字串,則逐個比較字串中對應字符的編碼
- 如果有任一運算元是數值,則將另一個運算元轉換為數值,執行數值比較
- 如果有任一運算元是物件,則呼叫其 valueOf()方法,取得結果后再根據前面的規則執行比較, 如果沒有valueOf()運算子,則呼叫toString()方法,取得結果后再根據前面的規則執行比較
- 如果有任一運算元是布林值,則將其轉換為數值再執行比較
8.?相等運算子
提供了兩組運算子:
第一組是等于和不等于,它們在比較之前執行轉換,
第二組是全等和不全等,在比較之前不執行轉換,
8.1)等于和不等于
等于運算子用兩個等于號(==)表示,如果運算元相等,則會回傳 true,
不等于 運算子用嘆號和等于號(!=)表示,如果兩個運算元不相等,則會回傳 true,這兩個運算子都會先進行型別轉換(通常稱為強制型別轉換)再確定運算元是否相等,
在轉換運算元的型別時,相等和不相等運算子遵循如下規則:
- 如果任一運算元是布林值,則將其轉換為數值再比較是否相等,false 轉換為 0,true 轉換 為 1
- 如果一個運算元是字串,另一個運算元是數值,則嘗試將字串轉換為數值,再比較是否相等
- 如果一個運算元是物件,另一個運算元不是,則呼叫物件的 valueOf() 方法取得其原始值,再根據前面的規則進行比較
在進行比較時,這兩個運算子會遵循如下規則:
- null 和 undefined 相等
- null 和 undefined 不能轉換為其他型別的值再進行比較
- 如果有任一運算元是 NaN,則相等運算子回傳 false,不相等運算子回傳 true,記住:即使兩 個運算元都是 NaN,相等運算子也回傳 false,因為按照規則,NaN 不等于 NaN
- 如果兩個運算元都是物件,則比較它們是不是同一個物件,如果兩個運算元都指向同一個物件,則相等運算子回傳 true,否則,兩者不相等
8.2) 全等和不全等
全等和不全等運算子與相等和不相等運算子類似,只不過它們在比較相等時不轉換運算元,
- 全等運算子由 3個等于號(===)表示,只有兩個運算元在不轉換的前提下相等才回傳 true,
- 不全等運算子用一個嘆號和兩個等于號(!==)表示,只有兩個運算元在不轉換的前提下不相等才 回傳 true
let result1 = ("55" == 55); // true,轉換后相等
let result2 = ("55" === 55); // false,不相等,因為資料型別不同
9.?條件運算子
條件運算子由 = ?: 組成,用法如下:
let num1 = 5, num2 = 6;
let max = (num1 > num2) ? num1 : num2;
/*
相當于
let max;
if (num1 > num2) {
max = num1;
}
else {
max = num2;
}
*/
console.log(max); // 6
10.?賦值運算子
- 簡單賦值(=)
- 乘后賦值(*=)
- 除后賦值(/=)
- 取模后賦值(%=)
- 加后賦值(+=)
- 減后賦值(-=)
- 左移后賦值(<<=)
- 右移后賦值(>>=)
- 無符號右移后賦值(>>>=)
這些運算子僅僅是簡寫語法,使用它們不會提升性能,
11.?逗號運算子
- 逗號運算子可以用來在一條陳述句中執行多個操作
let num1 = 1, num2 = 2, num3 = 3;
- 用逗號運算子來輔助 賦值,在賦值時使用逗號運算子分隔值,最侄訓回傳運算式中最后一個值
let num = (5, 1, 4, 8, 0); // num 的值為 0
12.?常見運算子優先級
在這里數字小的優先級高
| 運算子 | 順序 | 優先級 |
|---|---|---|
| 小括號 | () | 1 |
| 一元 | ! ++ -- | 2 |
| 算數 | 先* / % 后 + - | 3 |
| 關系 | > >= < <= | 4 |
| 相等 | == != === !== | 5 |
| 位 | & ^ | | 6 |
| 邏輯 | 先&& 后|| | 7 |
| 賦值 | = | 8 |
| 逗號 | , | 9 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/301780.html
標籤:其他
