今天来谈谈判断数据类型的几种方法:
一、typeof操作符判断数据类型
typeof返回的字符串(能够判断的数据类型)
一、普通对象与函数对象
Object, Function是Js自带的函数对象
1. function f1(){ }
2. var f2 = function(){ }
3. var f3 = new Function('str', 'console.log(str)');
4. var o1 = {};
5. var o2 = new Object();
6. var o3 = new f1();
结果如下:
因此 typeof 可判断基本的数据类型,但无法判断引用类型(除了function类),也就是继承自object类型的具体类型,比如Array、Date、自定义类等。
二、instanceof操作符判断数据类型
a istanceof A :判断a是否是A的实例,其实是在判断a._proto_ === A.prototype,所以用这种方法判断数据类型存在一个问题,举例来说:
- var arr = [];
- arr instanceof Array // true
- arr instanceof Object // true
原因:
arr._proto_ === Array.prototype;
Array.prototype._proto_ === Object.prototype;
Object.prototype._proto_ === null;
基于原型链的查找机制。
因此,我们用 instanceof 也不能完全精确的判断object类的具体数据类型。
三、Arrary.isArray()方法判断是否为数组
这是S5中新增的数组方法,用来检测数组类型。但在IE9以下浏览器不支持。可以解决当网页存在多个全局执行环境下用instanceof操作符判断类型的问题。
var arr = [];
Array.isArray(arr); //true
四、Object.prototype.toString.call()精确判断数据类型
可以用来精确判断数据类型,包括Boolean、Number、String、Function、Array、Date、RegExp、Object、Error等类型。返回类似’[object type]‘的字符串,
type指前面提到过的Boolean、String等类型。
缺点:无法检测开发人员自定义的构造函数创建的实例类型。
如:
function Person(name){
this.name = name;
}
var p1 = new Person('san');
Object.prototype.toString.call(p1) //'[object Object]'