使用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。