js判斷數據類型


又是好久沒有寫博客了,但一直都在堅持寫筆記,筆記里的東西還是不拿出來獻丑了,自己一個人看就好了,哈哈~

js中判斷數據類型有很多種,今天我就整理一下我所知道的方法。

 

1.typeof

首先在控制台試試下面的幾道小題

typeof null //object
typeof undefined // undefined
typeof false // boolean
typeof 123 // number
typeof 'abc' //string

ok,五種基本數據類型,除了null,其他的輸出不用解釋。

null被認為是一個空對象引用,所以,會返回object,這算是一個語言實現的錯誤。

再來看下面的例子

typeof new Number(12); //object
typeof Number(13) //number
typeof NaN // number

此例子還可以用String和Boolean試一下,都是可以的。

解釋一下:
    第一個雖然Number,String,Boolean是基本數據類型,但他們可以通過new創建,而通過new創建,后台會自動轉化為對象,使他們看起來像對象。因此,第一個是返回object
    第二個由於沒有用new,創建的就是基本數據類型,所以還是number類型
    第三個NaN是屬於Number類型的,這里需要注意NaN與任何數據都不相等,包括它本身。

再試試用typeof判斷引用類型

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();

 

這些是我目前知道的,如果有更好的方法求賜教~~有什么不對的地方求指教~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM