JavaScript數據類型判斷--使用toString方法

使用typeof

javascript提供了typeof關鍵字來判斷一個對象的具體類型,但是typeof有一定的侷限性。

var a="string"; console.log(a); //string
var a=1; console.log(a); //number
var a=false; console.log(a); //boolean
var a; console.log(typeof a); //undfined
var a = function(){}; console.log(typeof a) //function 


//------
typeof null; //object
typeof new Data(); //object
typeof new Array(); //object
...

由上述可以看出,typeof 只能精確的判斷出 string,number, boolean, function,undefined, 其他的都是object。

所以,下述講一個很有效的方法。


使用toString方法

toString方法是Object對象中就帶有的方法,而js中所有的對象繼承自Object,所以所有的對象都會有該方法。

//先看一個例子
var type = function(obj){
    return Object.prototype.toString.call(obj);
};

type("abc"); //"[object String]"
type(3); //"[object Number]"
type(true); //"[object Boolean]" 
type([1,3,4]); //"[object Array]"
type(new Date()); //"[object Date]"
type(null); //"[object Null]"
type(undefined); //"[object Undefined]"


(function(){
    type(arguments); //"[object Arguments]" 而不是 Array.
})(1,2,3)

//以上的這些對象都重載了Object 中的toString方法。所以需要調用Object 的toString方法而不能用本身的重載後的toString方法。
//對於自定義的Object,如果沒有重載toString,顯示的則都是Object.

function foo(){
    console.log("blabla...");
}

type(new foo()); //"[object Object]"
type(foo()) ;   //"[object Function]"
...

那麼,問題來了,爲什麼自己定義的對象foo是object而不是foo類型呢?而瀏覽器內置的一些對象比如Array,Date之類的類型就跟類名相同呢?答案在於Object的toString上面。查看官方規範如下(參見:ECMAScript):

這裏寫圖片描述

這裏面已經講的很清楚了,我就不再翻譯了。
那麼,如果要現實自己定義的類的類型呢?比如new foo()顯示爲:[object Foo] ,爲暫時想到的辦法是用這個方法再結合實例對象的toString方法,此時的toString應該自己重載。

綜上,以後就用:

Object.prototype.toString.call(obj) 

來判斷一個對象的類型吧。關於call的用法,請自行Google。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章