你有多懂 == ?
面試很愛出,剛好正在閱讀作者很細心講解。
做個筆記,包含 == 比較的解釋。
自動轉型的規則
- 在兩個等號=的比較運算式下,若是雙方的資料類型不同時,則會進行「自動轉型」。
- 如果其中有一個值為「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 |