在《JavaScript高階程式設計 第三版》中,在 邏輯操作符 與 位操作符 章節感覺被沒有講解清楚。
位操作符用於在最基本的層次上,即按記憶體中表示數值的位來運算元值。在JS中只能當做 數值 進行位運算
1.按位與(AND)(位操作符)
按位與操作符由一個和號字元(&)表示,它有兩個操作符數。從本質上講,按位與操作就是將兩個數值的每一位對齊,然後根據規則,對相同的位置上的兩個數執行AND操作。
簡而言之,按位與操作符只在兩個數值的對應位都是1時才返回1,任何一位是0,結果都是0。
var result = 25 & 3
console.log(result) // 1
複製程式碼
25和3轉化為32位的二進位制碼時,對應位上只有一位同時是1,而其它位的結果都是0,因此最終結果等於1.
2.按位或(OR)(位操作符)
按位或操作符由一個豎線符號(|)表示,同樣也有兩個運算元。 簡而言之,按位或操作在有一個位是1的情況下就返回1,而只有在兩個位都是0的情況下返回0。 如果在前面按位與的例子中對25和3執行按位或操作。如下:
var result = 25 | 3
console.log(result) // 27
複製程式碼
這兩個數值都包含4個1,因此可以把每個1直接放到結果中。二進位制碼 11011 等於十進位制27。
JS中位運算子返回的是數值。JS中的位操作符只有1個功能:進行位運算。
var number = 2
var logic = number < 5 | number > 0
console.log(number < 5) // true
console.log(logic) // 1 返回數值
複製程式碼
var logic = true | true
console.log(logic) // 1 可以看出 位操作符 只有1個功能:進行位運算。
複製程式碼
測試1
var str1 = '9'
var str2 = '5'
console.log(str1 & str2) // 1
console.log(typeof (str1 & str2)) // 結果為 number 型別
複製程式碼
測試2
var number1 = 9
var number2 = 5
console.log(number1 & number2) // 1
複製程式碼
測試3
var obj1 = {
valueOf: function() {
return 9
}
}
var obj2 = {
valueOf: function() {
return 5
}
}
console.log(obj1 & obj2) // 1
複製程式碼
9的二進位制:1001 5的二進位制:0101 &操作結果:0001 = 1
我們可以發現,string型別、number型別、object型別操作結果相等,都會進行相應的數值轉換。如果運算元不是數值型別,就會根據一定規則先把它轉換成數值,若不能轉化成數值則為NaN。
console.log(NaN & NaN) // 0
console.log('string' & 'string') // 字串轉化為NaN,結果為0
console.log(10 & NaN) // 10 & 0, 結果為0
console.log(Infinity & -Infinity) // 0
複製程式碼
3.強制轉換型別(!!)
不論它的後面接的是什麼數值,它的結果會被強制轉換成bool型別
!!1 = true
!!0 = false
!!null = false
!!'' = false
!!'ccc' = true
!!{} = true
複製程式碼
總結:
(1) JS中只能當做數值(不是數值會先轉換為數值)進行位運算,與 ^(按位異或)、~(按位非)、<<(左移)、>>(右移)、>>>(無符號右移)功能一樣,若運算元為非數值,則轉換為數值。
(2) 若操作number的型別的NaN、-Infinity、Infinity則會被轉換為數值0.