NaN 即 Not a Number
, 不是一個數字, 那麼NaN到底是什麼呢? 話說在JavaScript中,有6大資料型別,分別包括string,number,boolean,undefined,null和object, 而對於JS來說,整數和浮點數都統稱為number型別,除此之外,number型別還有一個很特殊的值,即NaN, 它是用來表示是否屬於number型別的一種狀態: 是或否。而不是一個確切的值。
那麼,NaN值一般會在什麼情況下出現呢?一般有兩種情況:
(1) 一個表示式中如果有減號(-)、乘號(*) 或 除號(/) 等運算子時,JS引擎會在計算之前試圖將運算子兩邊的變數轉化為number型別,如果轉化失敗,表示式將返回NaN
(2) 直接使用 parseInt, parseFloat 或 Number 將一個非數字的值轉化為數字時,表示式返回NaN
1 2 3 4 5 6 7 |
"abc" - 3 // NaN parseInt("abc") // NaN parseFloat("abc") //NaN Number("abc") //NaN |
當一個表示式返回了NaN 時,表示該表示式中存在不可以轉化的變數,並返回了無效的結果,並不是返回了一個確切的值。
如果非要說NaN是一個值得話,那麼 NaN 就是除過數字的任意值,但絕不是確切的某一個值!
如果你還不理解,我們還可以用正規表示式來描述NaN值: [^d]
所以 NaN != NaN , 因為它是一個範圍,而不能代表一個確定的值
除此之外,與NaN相關的還有一個函式,即 isNaN() , 它是用來判斷某一個變數是不是數字或能否轉化為數字,僅此而已。
1 2 3 4 5 6 7 |
isNaN(123) //false isNaN("123") //false isNaN("abc") //true isNaN("ab3") //true |
有的朋友可能對NaN理解有偏差,想不明白下面這個問題:
1 2 3 |
既然 isNaN("abc") //true 那麼 "abc" == NaN 也應該為true, |
於是就覺得isNaN()不靠譜,然後自己封裝函式來判斷一個變數是否真正為NaN, 你想想, NaN連自身都不認,你指望它和誰相等?
說到這裡,有的朋友是不是想起了undefined和null, 好不容易理解 NaN 是怎麼回事,此時此刻,有木有覺得越來越不懂undefined和null了, 那我就順便聊一下他們吧~
undefined是JavaScript中6種資料型別中的一種,該型別只有一個值,也就是undefined。 undefined意為未定義
,即當使用var宣告瞭變數但未進行賦值時,這個變數的值就是undefined。undefined產生的原因有兩種:
(1)訪問物件不存在的屬性或方法
(2)宣告瞭變數但從未賦值
1 2 3 4 5 6 7 8 9 10 11 |
var v1,obj = {}; console.log(v1); //undefined console.log(obj.get); //undefined typeof v1; // "undefined" typeof v2; // "undefined" typeof obj.get; // "undefined" |
和NaN不同的是,undefined雖然也代表變數的一個狀態,但這個狀態值是確定唯一的,即當一個變數宣告瞭但沒有賦值時,它的狀態就是undefined,因此下面表示式是成立的:
1 2 3 |
var b; b == undefined; //true |
理解了undefined以後,再理解null就容易多了,null型別也只有一個值:null , 表示一個變數中沒有包含有效資料。null在這裡意為空值
、空物件
的意思,更確切的說,一個被賦值為null的變數沒有儲存有效的數值、字串、布林、陣列或物件等,可以通過給一個變數賦值為null來清空變數中的內容。產生null的原因只有一個:即對一個變數顯式的賦值為null 。
1 2 3 4 5 6 7 |
var p = null; console.log(p); //null typeof p ; // "object" typeof null; // "object" |
還是和NaN來比較,null也是一個確定切唯一的狀態值,當一個變數被賦值為null時,那麼它就和null相等,因此下面表示式也是成立的:
1 2 3 |
var obj = null; obj == null; //true |
(關於JS資料型別更多講解請參考:http://www.cnblogs.com/onepixel/p/5140944.html )