你有多懂 == ?
面試很愛出,剛好正在閱讀作者很細心講解。
做個筆記,包含 == 比較的解釋。
自動轉型的規則
- 在兩個等號=的比較運算式下,若是雙方的資料類型不同時,則會進行「自動轉型」。
- 如果其中有一個值為「Boolean」的情況下,會將
true
轉型為「數字」的 1,false
則會變成數字的 0 - 如果遇到字串與數字做比較的情況下,則會將字串透過
Number()
嘗試轉型為數字後,再進行比較。 - 如果其中一方是「物件」型別,而另一方是基本型別的情況下,則會先透過物件的
valueof()
方法取得對應的基本型別的值,再進行比較。
補充
- undefined 只會和 null 比較時為 true。
- NaN不等於 NaN,這點不論是兩個等號或三個等號的結果都一樣。
- 當兩個「物件」進行比較時,要看兩者是否指向同一個「實體」,只有在指向同一個「實體」時才會回傳true。
範例
了解基本規則比較轉換後,直接看Code
1 | [] == [] // 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 | isNaN(NaN) // true |
Number.isNaN()
是更嚴格的版本,它只會在參數真的為 NaN
時返回 true
,而不會像 isNaN()
將非數字類型也當作 NaN
。
1 | Number.isNaN(NaN) // true |
NaN
與其他數字的比較當 NaN
與任何其他數字(包括 0
和 Infinity
)進行比較時,結果總是 false
。
1 | NaN > 0 // false |
NaN
的轉型在某些運算中,如果出現無法計算的結果,會自動返回 NaN
。例如:
1 | Math.sqrt(-1) // NaN |