請解釋下NaN === NaN的結果

王铁柱6發表於2024-11-26

在 JavaScript 中,NaN === NaN 的結果是 false

儘管 NaN 代表“非數字”(Not a Number),兩個 NaN 之間並不相等。這是 JavaScript 規範中定義的行為,也符合 IEEE 754 浮點數標準。

原因:

NaN 可以由多種不同的非法數學運算產生,例如 0/0Infinity - InfinityMath.sqrt(-1) 等。雖然它們都表示非數字的結果,但它們並不一定代表相同的“非數字”值。因此,規範規定任何 NaN 與任何值(包括自身)比較都返回 false

如何判斷一個值是否為 NaN:

由於 NaN 與自身不相等,不能用 value === NaN 來判斷一個值是否為 NaN。正確的方法是使用全域性函式 isNaN()Number.isNaN()

  • isNaN(value): 會先嚐試將 value 轉換為數字,然後再判斷是否為 NaN。 如果 value 可以被轉換為數字,但轉換結果是 NaN,則返回 true。例如,isNaN('hello') 返回 true,因為 'hello' 轉換為數字是 NaN

  • Number.isNaN(value): 不會進行型別轉換,只判斷 value 是否嚴格等於 NaN。 這是更推薦的做法,因為它避免了 isNaN() 的隱式型別轉換帶來的潛在問題。 例如,Number.isNaN('hello') 返回 false,因為 'hello' 不是 NaN,而 isNaN('hello') 返回 true

示例:

console.log(NaN === NaN); // Output: false
console.log(isNaN(NaN)); // Output: true
console.log(Number.isNaN(NaN)); // Output: true

console.log(isNaN('hello')); // Output: true
console.log(Number.isNaN('hello')); // Output: false

let result = 0 / 0;
console.log(result === NaN); // Output: false
console.log(isNaN(result)); // Output: true
console.log(Number.isNaN(result)); // Output: true

總而言之,要判斷一個值是否為 NaN,請使用 Number.isNaN()。 不要使用 value === NaN

相關文章