我们都知道JavaScript(ES5)中有6种数据类型:String,Number,Boolean,Object,Null,Undefined

有时候我们需要检测一个变量是什么类型,这篇文章就全面的讲解的各种检测方法。

检测基本数据类型

基本数据类型有String,Number,Boolean,Null,Undefined五种,检测基本数据类型时使用typeof来检测。

1
2
3
4
5
6
console.log(typeof 'sunhui');		// string
console.log(typeof 123); // number
console.log(typeof true); //boolean
console.log(typeof undefined); //undefined
console.log(typeof null); //object
console.log(typeof {"name":"sunhui"}); // object

注意:在检测null的时候typeof返回object,因此我们需要换另外一种方法来检测null

简单粗暴:

1
if(obj === null)

检测引用类型

在使用typeof来检测对象的时候,返回结果总是object,有时候我们需要确切的知道该对象是哪个构造函数的实例,就需要用到instanceof了。

JavaScript里的构造函数有两种,一种是原生的构造函数Array,Function,Number,Boolean,另一种是自定义的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//判断数组
var a = [1,2,3];
console.log(a instanceof Array); // true
//判断函数
var b = function(){
console.log("yes");
}
console.log(b instanceof Function); //true
// 判断布尔值
var c = true;
console.log(c instanceof Boolean); //false
// 判断数值
var d = 123;
console.log(d instanceof Number); //false
//判断自定义构造函数
function Man(name){
this.name = name;
}
var man = new Man("sunhui");
console.log(man instanceof Man); // true

你应该注意到了,在上述代码中使用instanceof来判断基本数据类型booleannumber的时候,会返回false,这是因为instanceof的作用是判断一个对象是否属于某种类型,而基本数据类型不是对象。所以不能使用instanceof方法来判断。

上面已经有了判断变量是否为Arrayfunction的方法。但是这种方法不够安全。主要的问题是当变量在不同的frame之间传递时,各个frame之间同类构造函数并不相等,比如两个frame上的Array构造函数,虽然都是Array构造函数,但两者并不相等。

因此我们需要一种有绝对把握的检测方法。

ECMAScript5提供了isArray()方法来判断变量是否为数组

1
2
var a = [1,2,3];
console.log(Array.isArray(a)); // true

支持isArray的浏览器有:IE 9+,Firefox 4+,Safari 5+,Opera 10.5+,Chrome。
检测数组的方法有了,那怎么检测函数呢?其实使用typeof检测函数时,就会返回function,问题是在Safari5-以及Chrom7-中检测正则表达式时也会返回function,因此我们还需要一种准确检测函数的方法。

最强检测方法

直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function a(){console.log("yes");}
console.log(Object.prototype.toString.call(a)); // [object Function]
var b = 123;
console.log(Object.prototype.toString.call(b)); // [object Number]
var c = "sunhui";
console.log(Object.prototype.toString.call(c)); // [object String]
var d = true;
console.log(Object.prototype.toString.call(d)); // [object Boolean]
var e = [1,2,3];
console.log(Object.prototype.toString.call(e)); // [object Array]
var f;
console.log(Object.prototype.toString.call(f)); // [object Undefined]
var g = null;
console.log(Object.prototype.toString.call(g)); // [object Null]
var h = {"name":"sunyuhui"};
console.log(Object.prototype.toString.call(h)); // [object Object]

看到了吗??简直万能啊。

上述的检测方法是在变量上调用ObjecttoString方法。将返回一个遵循[object NativeConstructorName]格式的字符串。其中NativeConstructorName指的就是变量的构造函数名。

END