javascript是个弱类型的语言,工作中难免会遇到对数据的类型判断的问题(不过一般都是跟php确认一下,让他们返回正确的数据类型)。想了想还是把类型识别的常用方法总结一下,方便以后查阅。
typeof
先说结论:
- 可以识别基本数据类型(Null除外),即Undefined,Boolean,Number,String
- 不能识别具体的对象类型(Function除外)
1 | typeof "tommmy"; //"string" |
instanceof
先说结论:
- 可以判断内置对象类型
- 不能判断基本数据类型
- 可以判断自定义对象类型
1 | ['a','b'] instanceof Array; //true |
Object.prototype.toString.call
先说结论:
- 可以识别基本数据类型及内置的对象类型
- 不能识别自定义对象类型
1 | Object.prototype.toString.call("abc"); //[object String]; |
constructor原型链判断proto
先说结论:
- 可以判断基本数据类型(Undefined和Null除外,因为他俩没构造函数)
- 可以判断内置对象类型
- 可以判断自定义对象类型
首先我们可以在浏览器里打印 console.dir(new Number),查看其返回:
在其proto内看到其constructor为function Number(),故可以此来判断1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26"abc".constructor === String; //true
(123).constructor === Number; //true
true.constructor === Boolean; //true
new Date().constructor === Date; //true
//方便测试,来个测试方法
function constructorName(obj){
//排除null和undefined
return obj && obj.constructor && obj.constructor.toString().match(/function\s*([^(]*)/)[1];
}
constructorName(1); //"Number"
constructorName("abc"); //"String"
constructorName(true); //"Boolean"
constructorName(null); //null
constructorName(undefined); //undefined
constructorName({}); //"Object"
constructorName([]); //"Array"
constructorName(new Date); //"Date"
constructorName(/\d/); //"RegExp"
constructorName(function(){}); //"Function"
//自定义对象类型可以判断
function abc(x){
this.x = x;
}
constructorName(new abc11(3)); //"abc"
简单总结
- 对于除null之外的其他4个基本数据类型,可以使用
typeof
,方便快捷 - 如果想判断内置的对象类型,比如常见的Array,Object,正则日期等,直接是使用
instanceof
来判断 - 对于恼人的null来讲,只好请出
Object.prototype.toString.call(null)
来返回[object Null]
来做精准判断了 - 还有用
constructor
来判断?看着就头大,不到万不得已,还是不用了吧