又是很久沒有寫博客了,但一直都在堅持寫筆記,筆記裏的東西仍是不拿出來獻醜了,本身一我的看就行了,哈哈~html
js中判斷數據類型有不少種,今天我就整理一下我所知道的方法。數組
1.typeof瀏覽器
首先在控制檯試試下面的幾道小題框架
typeof null //object typeof undefined // undefined typeof false // boolean typeof 123 // number typeof 'abc' //string
ok,五種基本數據類型,除了null,其餘的輸出不用解釋。函數
null被認爲是一個空對象引用,因此,會返回object,這算是一個語言實現的錯誤。this
再來看下面的例子spa
typeof new Number(12); //object typeof Number(13) //number typeof NaN // number
此例子還能夠用String和Boolean試一下,都是能夠的。prototype
解釋一下:
第一個雖然Number,String,Boolean是基本數據類型,但他們能夠經過new建立,而經過new建立,後臺會自動轉化爲對象,使他們看起來像對象。所以,第一個是返回object
第二個因爲沒有用new,建立的就是基本數據類型,因此仍是number類型
第三個NaN是屬於Number類型的,這裏須要注意NaN與任何數據都不相等,包括它自己。code
再試試用typeof判斷引用類型htm
typeof {} //object typeof /\d/ //object typeof [] //object typeof new Date() //object typeof function() {} //function
可見使用typeof除了判斷function是精確的,而其餘引用型數據都是object,但須要注意的是在有些低版本瀏覽器,會將正則誤判斷爲function。
所以,又有了instanceof判斷引用類型。
2.instanceof
({}) instanceof Object; //如下都爲true [] instanceof Array (new Date()) instanceof Date (function() {}) instanceof Function (/\d/) instanceof RegExp
恩,很好,徹底能夠是咱們所想要的方法。順便看看下面的例子:
new Number(12) instanceof Number // true Number(13) instanceof Number // false 123 instanceof Number // false
嘿嘿。不對了吧,這就須要提到instanceof的原理了,instanceof實際上是用來判斷一個變量是否爲某個對象的實例。
解釋一下
正如上面說所說,基本數據類型經過使用new建立時,會在後臺轉化爲對象,使他們看起來像對象,
第一個用new建立因此是Number的實例,返回true
第二個只是用Number()建立數字,是基本類型,不是Number的實例
第三個更不用說啦!
還有一種方法是使用constructor
3.constructor
constructor能夠返回對象相應的構造函數
[].constructor == Array; //以下都爲true {}.constructor == Object; "string".constructor == String; (123).constructor == Number; true.constructor == Boolean;
可是,須要注意的是方法2和方法3必須是在當前頁面聲明。由於,他們假定都是隻有一個全局執行環境的。若是一個頁面使用多個框架,那麼就存在兩個以上的全局執行環境,也就存在兩個以上不一樣版本的Array構造函數。若是當咱們使用一個框架向另外一個框架傳入數組,那麼,他們具備不一樣的構造函數,所以,會影響判斷結果。
那麼,如何簡單而又準確判斷數據類型呢?下面方法是我經常使用的。
4.Object.prototype.toString.call()
Object.prototype.toString.call() === '[object String]' //true 其餘類型(包括基本類型)就不一一驗證了
調用Obeject原型上的toString方法,該方法獲取this對象上的[[Class]]屬性,這個屬性會返回該對象的類型。
用上面的方法能夠較準確的判斷數據類型,這也是我常常使用判斷引用類型的方法。
如下參考自http://www.cnblogs.com/mofish/p/3388427.html
5.使用特性判斷
例如:
function isArray(obj) { return obj && typeof obj === 'object' && typeof obj.length === 'number' && typeof obj.splice === 'function' && !(obj.propertyIsEnumerable('length')); }
有length和splice並不必定是數組,由於能夠爲對象添加屬性,而不能枚舉length屬性,纔是最重要的判斷因子。
此外,若是是要判斷數組,還能夠使用ES5裏的方法Array.isArray();
這些是我目前知道的,若是有更好的方法求賜教~~有什麼不對的地方求指教~~