[TOC] 不知道這個小知識點用得多不多,曾經在書上看到過,所以有一些印象,前段時間順手寫出類似如下的代碼 斷點調試之後發現無論如何都不相等,方法parseInt()返回的結果確實是NaN,但是與右側的NaN比較返回的結果卻是false,這時候才突然想起來NaN有不等於自身的特性,所以簡單收集一下資 ...
目錄
不知道這個小知識點用得多不多,曾經在書上看到過,所以有一些印象,前段時間順手寫出類似如下的代碼
var result;
if (parseInt('abc')==NaN) {
return "相等";
} else {
return "不等";
}
斷點調試之後發現無論如何都不相等,方法parseInt()返回的結果確實是NaN,但是與右側的NaN比較返回的結果卻是false,這時候才突然想起來NaN有不等於自身的特性,所以簡單收集一下資料做個整理
原因
瞭解原因之前我們先明確一個問題,什麼時候回出現NaN,理論上來說有兩種情況
- 表達式計算
- 類型轉換
我們逐個分析
表達式計算
當運算中使用了 + - * / 等運算符的時候,js會自動進行轉換,講參與計算的變數轉換成js的基本類型之一的Number類型,如果轉換失敗就會返回NaN。比如說:
console.log(12 + 'a'); //NaN
類型轉換
比較典型的就是最初的例子里使用的parseInt(),除此之外還有parseFloat()和Number(),傳入一個非數變數結果就是NaN,很好理解,順便一提parse系列方法與Number()有些不同。
parseInt('123abc'); // 123
Number('123abc'); // NaN
總結
從上面兩種產生NaN的情況來看,NaN是一種異常的結果,也就是“not a number”,雖然它也是一個變數,但它是描述性變數,'a'不是一個數字(not a number),'b'也不是一個數字(not a number),但是'a'和'b'並不相等,所以NaN != NaN也就成立了。