首頁 > web前端 > js教程 > 主體

JavaScript 中的 NaN

hzc
發布: 2020-06-29 10:42:46
轉載
3091 人瀏覽過
  1. 什麼是NaN
  2. 什麼時候會回傳NaN
  3. #判斷NaN
  4. 參考

什麼是NaN

在MDN 的NaN 文章中有描述:

  • #全域屬性NaN 表示Not-A-Number 的值。
  • NaN 是一個全域物件的屬性。
  • NaN 屬性的初始值就是 NaN,和 Number.NaN 的值一樣。
  • 在 ES5 中, NaN 屬性是一個不可設定(non-configurable),不可寫(non-writable)的屬性。但在 ES3 中,這個屬性的值是可以被改變的,但是也應該避免覆寫。
  • 通常都是在計算失敗時,作為Math 的某個方法的回傳值出現的(例如:Math.sqrt(-1))或是嘗試將一個字串解析成數字但失敗了的時候(例如:parseInt("blabla"))。

NaN 的型別

typeof NaN   // "number"
登入後複製

也就是說 NaN 是一種特殊的 Number 類型值。

何時會回傳NaN

JavaScript 權威指南中『3.1.3 JavaScript 中的算數運算』章節裡有描述:

無窮大除以無窮大、將任意負數做開方運算或算數運算子與不是數字或無法轉換為數字的運算元一起使用時都會傳回NaN

可分開解釋為以下等情況:

  • 無窮大除以無窮大
  • 給任意負數做開方運算
  • 算數運算子與不是數字或無法轉換為數字的運算元一起使用
  • 字串解析成數字

以下結果都是NaN

Infinity / Infinity;   // 无穷大除以无穷大
Math.sqrt(-1);         // 给任意负数做开方运算
'a' - 1;               // 算数运算符与不是数字或无法转换为数字的操作数一起使用
'a' * 1;
'a' / 1;
parseInt('a');         // 字符串解析成数字
parseFloat('a');
登入後複製

這裡的『無法轉換為數字的操作』又是什麼鬼?

先看下面可以轉換為數字的操作範例:

Math.sqrt('4');        // 2
2 * '2';               // 4
'4' / 2;               // 2
登入後複製

無法轉換為數字的操作

這裡涉及到JavaScript 的類型轉換 的概念。

JavaScript 權威指南『3.8 型轉換』章節有描述:

#如果JavaScript 期望使用一個數字,它將給定的值將轉換為數字(如果轉換結果無意義的話將返回NaN)。

可以使用Number() 方法做明確型別轉換,舉例:

Number('1');           // 1
Number(null);          // 0
Number('a');           // NaN
登入後複製

也可以用一元運算子 做隱式轉換,舉例:

+'1';                  // 1
+null;                 // 0
+'a';                  // NaN
登入後複製

也可以使用全域函數parseInt()parseFloat() 解析整數和浮點數,舉例:

parseInt('12');        // 12
parseInt('12a');       // 12
parseInt('a12');       // NaN
parseInt(null);        // NaN
登入後複製

parseInt()parseFloat() 可以簡單理解為:

#盡可能解析更多數值字符,並且忽略後面的內容;如果第一個非空格字元是非數字,則會傳回NaN

需要注意的是Number()parseInt()``parseFloat () ,對某些輸入值的處理不同,如null

非數字型別轉換為數字類型,如下表總結:

NaN0100#1.2NaN09NaNNaN
#數字
##undefined
#null
true
false
"" (空字串)
"1.2" (非空,數字)
"one" (非空,非數字)
[] (任意物件)
[9] (一個數字元素)
['a'] (其他陣列)
function(){} (任意函數)

#如何判斷NaN首先全域的isNaN( ) 函數無法嚴格判斷輸入值是否為

NaN

isNaN()

的怪異行為在MDN 的isNaN() 文章中對

非數值參數
所表現的『怪異行為』有解釋:

它會先嘗試將這個參數轉換為數值,然後才會對轉換後的結果是否是

NaN
進行判斷。

因此,對於能被強制轉換為有效的非 NaN 數值來說,傳回

false
值也許會讓人感覺莫名其妙。

如下例:

isNaN('37');      // false: 可以被转换成数值 37
isNaN('');        // false: 空字符串被转换成 0
登入後複製

嚴格判斷NaN參考MDN 中

Number.isNaN()

的Polyfill 程式碼:

推薦教學:《

JS教學###》###

以上是JavaScript 中的 NaN的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:jianshu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板