判断变量类型的一些方法

久了不用,就会发现,以前会的东西都会忘记掉(或者是完全想不起来了),不知道你们有没有遇到过这个情况 - -!

这里只是对判断变量类型方法的一些记录,方便以后能够随时查看。

typeof

要判断变量类型,首先想到的就是typeof,但用了才知道,其结果完全不是理想中的:

1
2
3
4
5
6
typeof {};  //"object"
typeof []; //"object"
typeof ""; //"string"
typeof 0; //"number"
typeof function(){};//"function"
typeof true;//"boolean"

由上面代码可以看出,数组也是对象,所以typeof不是我们理想中的解决方案。

当然,有的童鞋可能会说,由于lengthArray特有的属性(非绝对),那是不是可以用length+typeof来判断。

当然,这是可以的:

1
2
3
4
5
var arr = [1,2];
if(typeof arr === 'object'){
console.log(typeof arr.length === "number" ? "array" : "object");//这里输出 "array"
}
//...其他的就不一一罗列了

不过这个方法不通用,如果{key:value}对象中有 length 字段呢,如:

1
2
3
4
5
6
//这种情况对于上面的代码就不适用了
var obj = {
name:"square",
length:50,
width:50
};

instanceof

第二种解决方案就是使用instanceof,不过使用instanceof会出现[] instanceof Object === true的情况。这样就需要优先判断Array

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var a = [1,2,3];
var b = {name:'zhangsan',sex:123};
var fn = function(){};
var detectType = function(o){
if(o instanceof Array){
return 'Array'
}else if( o instanceof Object ){
return 'Object';
}else{
return 'param is no object type';
}
}
console.log( detectType(a) ); // Array
console.log( detectType(b) ); // Object
console.log( detectType(1) ); // param is no object type
console.log( detectType(true) ); // param is no object type
console.log( detectType('a') ); // param is no object type

Object.prototype.toString.call

还有一种最靠谱的办法就是Object.prototype.toString.call:

1
2
3
4
5
6
7
8
9
10
Object.prototype.toString.call([])              //"[object Array]"
Object.prototype.toString.call(Object) //"[object Function]"
Object.prototype.toString.call(function x(){}) //"[object Function]"
Object.prototype.toString.call("") //"[object String]"
Object.prototype.toString.call({}) //"[object Object]"
Object.prototype.toString.call(null) //"[object Null]"
Object.prototype.toString.call(undefined) //"[object Undefined]"
Object.prototype.toString.call(/test/) //"[object RegExp]"
Object.prototype.toString.call(new Date()) //"[object Date]"

参考文档

  1. Object.prototype.toString()