在 JavaScript 中,NaN === NaN
的結果是 false
。
儘管 NaN
代表“非數字”(Not a Number),兩個 NaN
之間並不相等。這是 JavaScript 規範中定義的行為,也符合 IEEE 754 浮點數標準。
原因:
NaN
可以由多種不同的非法數學運算產生,例如 0/0
、Infinity - Infinity
、Math.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
。