你有多懂 == ?

面試很愛出,剛好正在閱讀作者很細心講解。
做個筆記,包含 == 比較的解釋。


自動轉型的規則

  • 在兩個等號=的比較運算式下,若是雙方的資料類型不同時,則會進行「自動轉型」。
  • 如果其中有一個值為「Boolean」的情況下,會將true轉型為「數字」的 1,false則會變成數字的 0
  • 如果遇到字串與數字做比較的情況下,則會將字串透過Number()嘗試轉型為數字後,再進行比較。
  • 如果其中一方是「物件」型別,而另一方是基本型別的情況下,則會先透過物件的valueof()方法取得對應的基本型別的值,再進行比較。

補充

  • undefined 只會和 null 比較時為 true。
  • NaN不等於 NaN,這點不論是兩個等號或三個等號的結果都一樣。
  • 當兩個「物件」進行比較時,要看兩者是否指向同一個「實體」,只有在指向同一個「實體」時才會回傳true。

範例

了解基本規則比較轉換後,直接看Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[] == [] // false

[] == ![] // true

[] == '' // true

[] == 0 // true

[''] == '' // true

[0] == 0 // true

[0] == '' // false

'' == 0 // true

null == undefined // true
//null 和 undefined 是 JavaScript 中兩個特殊的基本類型,它們彼此之間的比較會返回 true。

[null] == '' // true
//陣列 [null] 轉型後變成空字串'',然後再與空字串比較,結果為 true。

[null] == 0 // true
//陣列 [null] 轉型後變成空字串'',而空字串轉成數字為 0,因此結果為 true。

[undefined] == '' // true
//與 null 類似,[undefined] 在轉型時也會被轉成空字串'',結果為 true。

[undefined] == 0 // false
//undefined 轉為數字時為 NaN,而與 0 的比較結果為 false。


NaN

在 JavaScript 中,NaN (Not-a-Number) 是一個特殊的數字類型,表示運算或轉型結果無法產生有效的數字。
NaN 在比較運算時具有一些特殊的行為,尤其是它不等於自身。接下來我們看看幾個 NaN 比較的範例:

NaN == NaN根據 JavaScript 的規則,NaN 與任何值(包括自己)進行比較時,結果都為 false。這是因為 NaN 代表一個無效的數值,沒有辦法與任何東西(包括自己)相等。

1
NaN == NaN // false

判斷 NaN

由於 NaN 不等於自己,判斷一個值是否是 NaN 時,我們可以使用 isNaN() 函數。它可以用來判斷一個值是否為 NaN,而不使用直接比較。

1
2
3
isNaN(NaN)       // true
isNaN(123) // false
isNaN('hello') // true (字串無法轉型為數字)

Number.isNaN() 是更嚴格的版本,它只會在參數真的為 NaN 時返回 true,而不會像 isNaN() 將非數字類型也當作 NaN

1
2
3
Number.isNaN(NaN)       // true
Number.isNaN(123) // false
Number.isNaN('hello') // false

NaN 與其他數字的比較當 NaN 與任何其他數字(包括 0Infinity)進行比較時,結果總是 false

1
2
3
4
NaN > 0    // false
NaN < 0 // false
NaN >= 0 // false
NaN <= 0 // false

NaN 的轉型在某些運算中,如果出現無法計算的結果,會自動返回 NaN。例如:

1
2
3
Math.sqrt(-1)  // NaN
0 / 0 // NaN
parseInt('abc')// NaN

8天重新認識JavaScript