JavaScript 運算式與運算子 & 型別轉換筆記二
位元運算子
位元運算子被轉化為 32 bits
的整數,並以二進位(0、1)的形式做處理,並將超過32 bits
的整數捨棄多餘位元,運算後回傳數值。
轉換之前: 11100110111110100000000000000110000000000001
轉換之後: 10100000000000000110000000000001
例如 8二進制表示法為 1000
, 5二進制表示法為 0101
,並以 toString(2)
轉換二進制。
let a = 8
let b = 5
a.toString(2) // "1000"
b.toString(2) // "0101"
因此在使用位元運算子結果如下:
8 & 5 // 將1000與0101轉二進制(bit)後做AND運算 結果0000 8 | 5 // 將1000與0101轉二進制(bit)後做OR運算 結果11018 ^ 5 // 將1000與0101轉二進制(bit)後做XOR運算 結果1101
XOR運算子(^)
兩個二進制位元(0、1),兩者不一樣時才等於1,其於是0
1 ^ 0 //1
0 ^ 1 //1
0 ^ 0 //0
1 ^ 1 //0
XOR運算子(~)
將二進制位元的值反轉,0轉為1,1轉為0。
let a=8
let b=5
~a // -9
~b // -6
簡單說因為二補數的關係,得到的值必須為原來的值再+1,接著因為最左邊的判斷正負的 bit 從 0 被轉為 1,故得負值。所以 ~8 會得到 -9。
左移運算(>>)
將第一個運算元的二進制位元(bit)向左移n位,第二個運算元為向左移位的數值,並右邊空出來的位元以 0 補齊,保持正負數一致。
8 << 2 //32 ,8的二進制位元為 1000 向左移位二位元後 00100000
右移運算(<<) & 右移運算(<<<)
將第一個運算元的二進制位元(bit)向右移n位,第二個運算元為向右移位的數值,並左邊空出來的位元以 0 補齊,保持正負數一致。
但右移運算(<<<),並左邊空出來的位元以 0 補齊,只有正數。
5 >> 2 //1 ,5的二進制位元為 0101 向右移位二位元後 0001
-5 >>> 2 //1073741822 ,5的二進制位元為 -0101 向右移位二位元後 1111...1110
邏輯運算子
用布林值 ( Boolean )來做邏輯判斷並回傳結果 true
或 false
。
如果運算元值是布林就做判斷結果,運算元不是布林值時,先透過Boolean()
轉換後再做判斷。
邏輯 AND ( && )
(條件/運算式A) && (條件/運算式B)
,當 &&
兩邊運算元都是 true
,則回傳true
,但有任一方為 false
則回傳false
。
let a = 123
let b = "abc"
let c = null
let d = undefinedconsole.log( a && b ) // "abc"
console.log( b && c ) // null
console.log( d && c ) // undefined
若第一個運算元是 true
,回傳第二個運算元,否則回傳第一個運算元。
因為 &&
尋找 false
布林值。
邏輯 OR ( || )
(條件/運算式A) || (條件/運算式B)
,當 ||
兩邊運算元都是 true
,則回傳true
,但只有在兩邊為 false
才會回傳false
。
let a = 123
let b = "abc"
let c = null
let d = undefinedconsole.log( a || b ) // 123
console.log( b || c ) // "abc"
console.log( c || d ) // undefined
若第一個運算元是 true
,回傳第一個運算元,否則回傳第二個運算元。
因為 ||
尋找 true
布林值。
邏輯 NOT( ! )
將true
與 false
做反轉,如一開始是 true
反轉為 false
,反之 false
反轉為 true
。
可使用 !!
來取代 Boolean()
即可判斷某值布林的結果。
!true // false
!false // true!!'false' == !!'true' // true
短路解析
運算式是由左向右判斷的, 會以下列規則進行 短路判斷:
false
&& 任何值 => 結果都是false
可用來執行某條件成立時才做某件事,類似if
判斷式。true
|| 任何值 => 結果都是true
可用來設定變數的初使值。
條件(三元)運算子
這個運算式是由一個問號 ?及一個冒號 :組成的。運算式中有兩個運算元的值,語法如下:
條件 ? 值1 : 值2
若條件成立為 true
回傳值1,否則回傳值2。
let money = 10000000000;
let ans = ( money > Infinity ) ? alert('我有錢') : alert('我很窮')
逗點運算子
主要是讓逗號可以分隔運算式(由左至右),並且回傳最後的運算式的值。
如果需要在一個運算式裡包含多組運算元,就可以用逗號來分隔。
常出現的地方是 for
迴圈如下:
for (let i = 0, j = 10; i < 10; i++, j--) {...}
運算子優先級
下列列出運算子的優先, 從高到低。
也可以使用括號來強制指定優先級。