JS 中有四种方式判断数据类型,它们分别是:typeof
、instanceof
、constructor
、Object.prototype.toString
。
在 ES5 中,新增了几种方式可以用来进行数组的判断,它们是 Object.prototype.isPrototypeOf
、 Array.isArray
和 Object.getPrototypeOf
。
typeof 操作符
typeof 操作符返回一个字符串,表示未经计算的操作数的类型
很遗憾,对于任何引用类型的数据(包括 null
),typeof
统一返回 Object
字符串,所以不能用它来判断 JS 中的数组。
instanceof 操作符
instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
于是可以通过 instanceof 检测数据的原型链中是否存在 Array 构造函数来判断数据是否是数组。
var arr = [];
arr instanceof Array; // true
constructor 属性
对象实例有一个 constructor
属性,constructor
指向对象实例的构造函数。于是,我们可以通过判断数据的 constructor
是否为 Array
构造函数即可。
var arr = [];
arr.constructor === Array; // true
要注意:constructor
是可以被修改的,所以这种判断方式不可靠。
Object.prototype.toString 方法
toString
可以用于检测对象的类型,它返回一个字符串。为了每个对象都能通过 Object.prototype.toString
来判断,需要借助函数的 call
或者 apply
方法。
var arr = [];
Object.prototype.toString.call(arr); // [Object Array]
Array.isArray 方法
这个方法没什么好说的,直接调用即可,会返回一个布尔值。
Object.getPrototypeOf 方法
Object.getPrototypeOf 方法返回指定对象的原型的值。
根据 ES5 新增的这个方法,我们可以把数组的原型对象与需要判断对象的原型进行比较,如果两者是全等关系,那么可以认为它是数组。
var arr = [];
Object.getPrototypeOf(arr) === Array.prototype; // true
Object.prototype.isPrototypeOf 方法
isPrototypeOf 方法用于测试一个对象是否存在于另一个对象的原型链上。
借用 ES5 新增的 isPrototypeOf
方法,可以直接了当的通过 Array
调用来判断目标数据是否是数组类型。
var arr = [];
Array.prototype.isPrototypeOf(arr); // true
写在最后
ES5 新增的两种方法都与原型链有关,理解并掌握原型相关内容还是判断数组的关键。方便理解与记忆的话,可以把 isArray
和 isPrototypeOf
放在一起,他们返回的都是布尔值,并且用途也相似。
getPrototypeOf
方法则是用来找到被检测数据的原型,拿到原型后还要与 Array.prototype
进行比较。