falsy value

什麼是 falsy value?

當我們藉由邏輯判斷式(if…)時,會希望我們藉由 if 來判斷的東西回傳布林值(true or false),

這樣方便我們判斷該往哪一步前進。

至於 falsy value 而言,就是這個值丟進去 if 判斷式內,

都會被列為 false,要前往得到 false 後所執行的區塊。

false

像 false 就是很標準的被列為是 false 的值。

1
2
3
if (false) {
//當條件成立才會做的區塊,但由於falsy value在if判斷式內,這將不會執行這區塊。
}

除了 false 以外,還有:

  • undefined
  • null
  • 0
  • -0
  • 0n
  • ‘’
  • “”
  • NaN

對於 0n 而言,他的型態為 BigInt,它也是會代表 falsy value 之一,比如:

1
2
if (0n) {
}

這個情況下,也等同於 0n 為 false。

何謂 NaN?

NaN 表示為 not a number,主要表示不為一個數,舉個例子來說:

1
2
const a = "aaa";
console.log(1 / a);

a 這個變數是文字時,當 1/a 就會得到 NaN,因為數字除以文字根本不會得到一個數。

又或者

1
2
3
Number("123");

Number("xyz");

當我們藉由 Number 包住文字型態的 123 時,JavaScript 會幫我們做轉型,

轉換成數字型態的 123,但當 Number 包住 xyz 時,

xyz 儘管轉型也不會是數字型態,所以此時我們就會得到 NaN。

對 NaN 而言,它也是 falsy value 代表之一。

究竟我們今天要怎麼判斷一個值是否為 NaN 呢?

我們可以藉由內建 isNaN 的函數來判斷:

1
2
3
let a = 1;
isNaN(a);
isNaN(NaN);

對於 a 而言,我們使用 isNaN 的函數來詢問他,會得到 false,

然而對於 NaN 而言,一樣的方式,我們會得到 true。

NaN 不為任何人(?)

除了用內建的函數來判斷之外,我們也可以藉由他的特性:

NaN 不為任何人,如果我們今天用 NaN === NaN 來詢問,

得到的答案會是 false。

所以儘管,我們定義一個 a 變數為 NaN,我們問他是不是 NaN,

它也只會回答 false。

1
2
let a = NaN;
a === NaN;

所以其實我們不能用這樣的方法判斷是不是 NaN。

但我們卻可以用,本身值判斷是不是不等於自己,

因為如果是 NaN 的情況下,判斷 NaN 是否為自己本身,不會得到 true。

所以我們可以藉由詢問,自己是否不等於自己本身來判斷:

如果得到的答案是 true 時,這個值就是 NaN(因為特性的關係,NaN 不會等於自己),

而當我們答案得到 false 時,這個值就不是 NaN(表示他有特定的值)。


舉個例子:

1
2
3
4
5
6
let a = 1;
if (a !== a) {
console.log("it's NaN");
} else {
console.log("it's not NaN");
}

在判斷式內的確會得到 false,這樣 a 就不是 NaN,的確 a 的值為 1,不是 NaN。


1
2
3
4
5
6
let a = NaN;
if (a !== a) {
console.log("it's NaN");
} else {
console.log("it's not NaN");
}

在判斷式內的確會得到 true,這樣 a 就 NaN,的確 a 的值為 NaN。


參考資料:

MDN - Falsy