相等與隱含轉型
相等與隱含轉型
嚴格相等
嚴格相等會判斷等號兩邊的 值 與 型別 皆相同
以下為特例,NaN 為非數值,所以不管是嚴格或是寬鬆相等都會回傳 false
1 | console.log(NaN === NaN) // false |
而 0 代表 false,!0 會轉為 true,因此會變成 Number(1) == Number(!0)
而 1 == 1
,所以結果會是 true
1 | console.log('1' == !0) // true |
寬鬆相等
布林、字串在寬鬆相等時會自動轉型為 數值,這個行為又稱為 隱含轉型
1 | console.log(17 == '0x11') // true |
當 true 字串轉型為數值時,會變成 NaN,因此兩者不相等
1 | console.log(true == 'true') // false |
Null、undefined
Null 和 undefined 在比對上不會被轉為數字型別來做比對
但是在寬鬆相等下,Null 和 undefined 會相等
1 | console.log(Number(null)) // 0 |
物件與非物件
物件與非物件的比對,會依照 左邊的型別,對右邊使用包裹物件進行轉換
以下範例來說,左邊是一個字串 10,因此會用 String 包裹物件將兩邊進行轉換
1 | console.log('10' == [10]) // true |
純物件會使用 String 包裹物件進行轉換,但通常物件不會這樣進行比對
1 | console.log(String({A: 'A'})) // '[object Object]' |
物件與物件
物件與物件的比對是使用傳參考的方式進行比對,因為參考位置不同,所以結果也就不相同,相關觀念可參考 物件傳參考
1 | console.log({} == {}) // false |
Truthy 與 Falsy
Truthy(真值)指的是布林值轉換後為真的值,反之則為 Falsy(假值)
需要特別注意的是 假值 的部分:
- undefined、null 屬於 Falsy
""
屬於假值,但" "
屬於真值- NaN 屬於假值,和任何東西比對(包含自己)都是 false
- 假值本身如果套用包裹物件後會轉為物件,並為真值
1 | if(new Object(undefined)) { |
關於真值假值的判斷可以參考 JS Comparison Table
邏輯運算子
邏輯運算子常被運用在布林值的轉換,當第一個數值轉換為 true
&&
:回傳 第 2 個值,否則回傳 第 1 個值||
:回傳 第 1 個值,否則回傳 第 2 個值
1 | var a = '123'; // true |
例(1)
而因為 && 優先序高於 ||,所以會先比對完 && 後,再由左至右比對,因此下列範例的流程會是
c && c
=> 0c || 0
=> 00 || a
=> 1
1 | var a = 1; |
例(2)
a && b
=> bc && a
=> cb || c
=> b
1 | var a = 1; |
例(3)
- 1000 < 10000 => true
- true 轉型後是 1
- 1 < 10 => true
1 | console.log(1000 < 10000 < 10) // true |