一.背景介紹
JavaScript一種直譯式腳本語言,是一種動態類型、弱類型、基於原型的語言,內置支持類型。它的解釋器被稱爲JavaScript引擎,爲瀏覽器的一部分,廣泛用於客戶端的腳本語言,最早是在HTML(標準通用標記語言下的一個應用)網頁上使用,用來給HTML網頁增加動態功能。
二.知識剖析
2.1 JS有哪些數據類型?
JavaScript語言的每一個值,都屬於某一種數據類型。JavaScript的數據類型,共有六種。分別是undefined、null、boolean、number、string、object(ES6新增第七種Symbol一種數據類型,它的實例是唯一且不可改變的。類型的值)
1)Undefined:Undefined類型只有一個值,即特殊值undefined。在使用var聲明變量,但未對其加以初始化時,這個變量值就是undefined。
2)Null:Null類型是第二個只有一個值的數據類型。其特殊值就是Null。從邏輯角度上看,null是一個空的對象指針。而這也正是使用typeof操作符檢測null值,會返回“object”的原因。
3)Boolean:即布爾類型,該類型有兩個值:true
false。需要注意的是,Boolean類型的字面值true和false是區分大小寫的。也就是說,True和False(以及其它的混合大小形式)都不是Boolean值,只是標識符。
4)Number:該類型的表示方法有兩種形式,第一種是整數,第二種爲浮點數。整數:可以通過十進制,八進制,十六進制的字面值來表示。浮點數:就是該數值中必須包含一個小數點,且小數點後必須有一位數字。
5)String:String類型用於表示由零或多個16位的Unicode字符組成的字符序列,即字符串。至於用單引號,還是雙引號,在js中還是沒有差別的。記得成對出現。
6)Object:Object數據類型,稱爲對象,是一組數據和功能(函數)的集合。可以用new操作符後跟要創建的對象類型的名稱來創建。也可以用字面量表示法創建。在其中添加不同名(包含空字符串在內的任意字符串)的屬性。
2.2 JS數據類型的常用方法
這裏介紹6種:Boolean()、toString()、String()、isNaN()、Number()、parseInt()。
實例:demo1
注:看demo的時候,打開控制檯看console.log()的結果。
三.常見問題
怎麼樣判斷各種數據類型?
四.解決方案
這裏介紹2種方法:typeof、Object.prototype.toString
1)typeof:用來判斷各種數據類型,有兩種寫法:typeofxxx,typeof(xxx)。
實例:demo2
總結:如果右邊的是基本類型,則typeof會嘗試得到最基本的類型,比如number,string等等,如果是函數名,那麼則返回function,這裏Object,Number,String,等等都可以看成函數名,如果右邊是一個基本的對象,則返回object(返回的都是小寫哦)。
注:我們發現typeof null,結果返回了object,這是一個很早之前的BUG,一直沿用至今。
試用範圍:如果通過typeof來判斷類型,適用於判定基本類型,或者判斷是否爲函數(function)。
2)Object.prototype.toString。
實例:demo3
需要注意的是,必須通過Object.prototype.toString.call來獲取,而不能直接new Date().toString(),從原型鏈的角度講,所有對象的原型鏈最終都指向了Object,按照JS變量查找規則,其他對象應該也可以直接訪問到Object的toString方法,而事實上,大部分的對象都實現了自身的toString方法,這樣就可能會導致Object的toString被終止查找,因此要用call來強制執行Object的toString方法。
五.拓展思考
JavaScript類型轉換有哪些?以及如何轉換?
更多請參考:http://www.runoob.com/js/js-type-conversion.html
六.參考文獻
七.更多討論
Q1:如何判斷是否是null值
使用typeof會返回object
instanceof會報錯
constructor會報錯
Object.prototype.toString.call返回[object Null]
Q2:typeof的侷限性
if(typeof a!=”undefined”){alert(“ok”)},而不要去使用 if(a) 因爲如果 a 不存在(未聲明)則會出錯,對於 Array,Null 等特殊對象使用 typeof 一律返回 object,這正是 typeof 的侷限性
Q3:判斷NaN:
var tmp = 0/0;
if(isNaN(tmp)){
alert(“NaN”);
}