目錄:數組
變量和數據類型是學習JavaScript
最早接觸到的東西,可是每每看起來最簡單的東西每每還隱藏着不少你不瞭解、或者容易犯錯的知識 ,好比下面幾個問題:瀏覽器
若是你還不能很好的解答上面的問題,那說明你尚未徹底掌握這部分的知識,那麼請好好閱讀下面的文章吧。bash
本文將從一個問題入手,經過介紹JavaScript
中的變量和類型相關知識以及 isNaN 的檢測機制。但願你看完這篇文章,能夠知道這個問題的答案。廢話少說,進入正題。函數
變量: 它不是指具體的值,只是一個用來存儲具體值的「容器」 或者「代名詞」 ,由於它存儲的值能夠改變,因此稱爲變量。學習
那如何理解變量呢?舉個簡單的例子:ui
var num = 10;
num = 15;
console.log(num + 5);
// 在控制檯打印出 20,這就體現到了 num 這個變量只是存儲具體值而已,一開始 num 存儲 10,以後賦值爲 15,結果就是 20。簡單來講,變量就是常常變的,重點在 「變」 這個字上。
複製代碼
下面只是簡單說明建立變量的方式,暫時不深刻講解,以後會往深裏學,往深裏講。spa
注:變量的命名儘可能見名知意,語義化更強一些。prototype
在JS中用來檢測數據類型的方式「此處簡單介紹,不深刻」:指針
本部分重點關注 typeof 檢測數據類型的細節點,暫時不去關注其餘檢測數據的方法,將從語法、返回值、發現點來說解 typeof 的使用與細節點。code
語法:typeof [value]
=> 檢測value的數據類型
返回值:使用typeof檢測出來的結果是一個字符串,字符串中包含着對應的數據類型,例如:"number"/"string"/"boolean"/"undefined"/"object"/"function"
發現點:
說到 isNaN 的做用,就不得不先說一下 NaN,首先從字面上理解爲 not a number,可是「它是數字類型的」,NaN 和誰都不相等,包括本身。那麼問題來了,如何檢測某個變量是否是有效數字呢?終於進入正題了,那就是 isNaN的做用。
isNaN:檢測當前值是否是有效數字,返回true,表明非有效數字,返回false,表明有效數字
重點是:調用 Number 這個方法,把非數字類型的值轉換爲數字,下面舉例子,以便讀者更好的理解 Number 這個方法。
其它基本類型轉換爲數字:直接使用Number
這個方法轉換的
【字符串轉數字】
Number('13') // => 13
Number('13px') // => NaN 若是當前字符串中出現任意一個非有效數字字符,結果則爲NaN
Number('13.5') // => 13.5 能夠識別小數
Number('13.5.0') // => NaN
複製代碼
【布爾轉數字】
Number(true) // => 1
Number(false) // => 0
複製代碼
【其它轉數字】
Number(null) // => 0
Number(undefined) // => NaN
複製代碼
引用數據類型轉換爲數字:先把引用值調取 toString
轉換爲字符串,而後再把字符串調取 Number
轉換爲數字
【對象轉數字】
({}).toString() // => '[object Object]' => NaN
複製代碼
【數組轉數字】
[12,23].toString() // => '12,23' => NaN
[12].toString() // => '12' => 12
[].toString() // => '' => 0
複製代碼
【正則轉數字】
/^$/.toString() // => "/^$/" => NaN
複製代碼
若是你能快速地看出下面代碼執行結果,而且徹底正確,就說明你已經徹底理解 isNaN 的檢測機制。
var num = 12;
isNaN(num); // 檢測num變量存儲的值是否爲有效數字 false
isNaN('13'); // => false
isNaN('樂少'); // => true
isNaN(true); // => false
isNaN(false); // => false
isNaN(null); // => false
isNaN(undefined); // => true
isNaN({age:9}); // => true
isNaN([12,13]); // => true
isNaN([12]); // => false
isNaN(/^$/); // => true
isNaN(function(){}); // => true
複製代碼
下面是 num 這個變量是已經聲明的,可是 num 變量存儲的值不能肯定。
方案一:
if(Number(num) == NaN){
alert('num不是有效數字!')
}
複製代碼
方案二:
if(isNaN(num)){
alert('num不是有效數字!')
}
複製代碼
方案三:
if(typeof num === 'number' && isNaN(num)){
// => 檢測是否爲有效數字,只有這一種方案
alert('num不是有效數字!')
}
複製代碼
看完整篇文章+我列出來的三個方案,我相信你心中已經有了明確的答案,我下面逐個方案進行分析:
方案一:假設 Number(num) 的結果是 NaN,可是代碼執行的結果是不會出現彈窗,由於 NaN和誰都不相等,條件永遠不成立(即便 num 確實不是有效數字,轉換的結果確實是 NaN ,可是NaN!= NaN的)
方案二:這個方案看起來已是正確答案,可是忽略了 其餘數據類型的值能夠轉爲數字類型,例如,假設 num 的值爲 '13',首先會調用 Number 將 '13' 變成 13,而後再使用 isNaN(13) 得出結果爲 false,可是 '13' 並非一個有效的數字。
方案三:我我的認爲這個方案是可以解決文章標題提出的問題,首先先判斷 變量是否爲 數字類型,而後再使用 isNaN 判斷變量是否是有效數字?&& 運算符,須要兩邊同時成立的時候,結果才爲 true,因此當 typeof num === 'number' 這個結果爲 false 的話,就說整個判斷條件的結果都爲 false。