1、instanceof
instanceof
运算符用于检验构造函数的prototype
属性是否出现在对象的原型链中的任何位置,返回一个布尔值。
let a = []
a instanceof Array
//true
let b = {}
b instanceof Array
//false
instanceof
通过判断某个数值是否出现在与其对应的数据类型的原型链上来作为依据,在大多数情况下是可以准确判断出一个值的数据类型是什么的,但是我们要知道,prototype
属性是可以被修改的,所以可能会出现第一次判断为true
之后,再修改了prototype
的值之后再去判断,就会出现false
的情况
2、construator
实例的构造函数属性constructor指向实例本身,那么通过constructor属性也可以判断是否为一个数组。
let a = [1,3,4];
a.constructor === Array;//true
以上2种方法,对于已知实例类型,可以很方便的进行判断,需要注意的是,construator
和instanceof
一样,判断会存在多个全局环境的问题,典型的就是iframe
标签会同时存在一个或者多个全局环境,会影响到这2种方法的判断结果
3、Object.prototype.String.call()
Object.prototype.toString().call()
可以获取到对象的不同类型,例如
//检验是否为数组
let a = [1,2,3]
Object.prototype.toString.call(a) === '[object Array]';//true
//检验是否是函数
let b = function () {};
Object.prototype.toString.call(b) === '[object Function]';//true
//检验是否是数字
let c = 1;
Object.prototype.toString.call(c) === '[object Number]';//true
//检验是否为对象
let d = {};
Object.prototype.toString.call(d) === '[object Object]' //true
4、Array.isArray()
Array.isArray() 用于确定传递的值是否是一个数组,返回一个布尔值。
let a = [1,2,3]
Array.isArray(a);//true
此方法是ES5提供的新方法,对于某些不支持ES5的浏览器可能就不使用,那么我们需要配合Object.prototype.toString.call()
对他进行封装一下
function checkArray(arg){
if (!Array.isArray) {
Array.isArray = function(arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
};
}
}