什麼是 falsy value?
當我們藉由邏輯判斷式(if…)時,會希望我們藉由 if 來判斷的東西回傳布林值(true or false),
這樣方便我們判斷該往哪一步前進。
至於 falsy value 而言,就是這個值丟進去 if 判斷式內,
都會被列為 false,要前往得到 false 後所執行的區塊。
false
像 false 就是很標準的被列為是 false 的值。
1 | if (false) { |
除了 false 以外,還有:
- undefined
- null
- 0
- -0
- 0n
- ‘’
- “”
- NaN
對於 0n 而言,他的型態為 BigInt,它也是會代表 falsy value 之一,比如:
1 | if (0n) { |
這個情況下,也等同於 0n 為 false。
何謂 NaN?
NaN 表示為 not a number,主要表示不為一個數,舉個例子來說:
1 | const a = "aaa"; |
a 這個變數是文字時,當 1/a 就會得到 NaN,因為數字除以文字根本不會得到一個數。
又或者
1 | Number("123"); |
當我們藉由 Number 包住文字型態的 123 時,JavaScript 會幫我們做轉型,
轉換成數字型態的 123,但當 Number 包住 xyz 時,
xyz 儘管轉型也不會是數字型態,所以此時我們就會得到 NaN。
對 NaN 而言,它也是 falsy value 代表之一。
究竟我們今天要怎麼判斷一個值是否為 NaN 呢?
我們可以藉由內建 isNaN 的函數來判斷:
1 | let a = 1; |
對於 a 而言,我們使用 isNaN 的函數來詢問他,會得到 false,
然而對於 NaN 而言,一樣的方式,我們會得到 true。
NaN 不為任何人(?)
除了用內建的函數來判斷之外,我們也可以藉由他的特性:
NaN 不為任何人,如果我們今天用 NaN === NaN 來詢問,
得到的答案會是 false。
所以儘管,我們定義一個 a 變數為 NaN,我們問他是不是 NaN,
它也只會回答 false。
1 | let a = NaN; |
所以其實我們不能用這樣的方法判斷是不是 NaN。
但我們卻可以用,本身值判斷是不是不等於自己,
因為如果是 NaN 的情況下,判斷 NaN 是否為自己本身,不會得到 true。
所以我們可以藉由詢問,自己是否不等於自己本身來判斷:
如果得到的答案是 true 時,這個值就是 NaN(因為特性的關係,NaN 不會等於自己),
而當我們答案得到 false 時,這個值就不是 NaN(表示他有特定的值)。
舉個例子:
1 | let a = 1; |
在判斷式內的確會得到 false,這樣 a 就不是 NaN,的確 a 的值為 1,不是 NaN。
1 | let a = NaN; |
在判斷式內的確會得到 true,這樣 a 就 NaN,的確 a 的值為 NaN。