① instanceof 操作符判断
用法:arr instanceof Array
instanceof 主要是用来判断某个实例是否属于某个对象
function obj(){}let o1 = new obj();console.log(o1 instanceof obj); // true
那么我们用instanceof 来判断数组的方法如下:
let arr = [];console.log(arr instanceof Array); // true
但是 instanceof 会有一个问题,> 它的问题在于假定只有一个全局执行的环境。如果网页中包含多个框架,那实际上就存在> 两个以上不同的全局执行环境,> 从而存在两个以上不同版本的Array构造函数。如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有不同的构造函数。
②对象构造函数的 constructor判断
用法:arr.constructor === Array
Object的每个实例都有构造函数 constructor,用于保存着用于创建当前对象的函数
function obj(){}let o1 = new obj();console.log(o1.constructor === obj); // true
如上所示,obj 的实例 o1 的 constructor 跟 obj 对象是相等的
那么我们就可以用此来判断数组了
let arr = [];console.log(arr.constructor === Array); // true
③Array 原型链上的 isPrototypeOf
用法:Array.prototype.isPrototypeOf(arr)
Array.prototype 属性表示 Array 构造函数的原型
其中有一个方法是 isPrototypeOf() 用于测试一个对象是否存在于另一个对象的原型链上。
let arr = [];console.log(Array.prototype.isPrototypeOf(arr)); // true
④Object.getPrototypeOf
用法:Object.getPrototypeOf(arr) === Array.prototype
Object.getPrototypeOf() 方法返回指定对象的原型
所以只要跟Array的原型比较即可
let arr = [];console.log(Object.getPrototypeOf(arr) === Array.prototype); // true
⑤Object.prototype.toString
用法:Object.prototype.toString.call(arr) === ‘[object Array]’
虽然Array也继承自Object,但js在Array.prototype上重写了toString,而我们通过toString.call(arr)实际上是通过原型链调用了。
let arr = [];console.log(Object.prototype.toString.call(arr) === '[object Array]'); // true
PS:为什么不直接对对象使用toString方法?
检测对象arr调用toString方法arr.toString()的结果和Object.prototype.toString.call(obj)的结果不一样,这是为什么?
这是因为toString为Object的原型方法,而Array 、Function等类型作为Object的实例,都重写了toString方法。不同的对象类型调用toString方法时,根据原型链的知识,调用的是对应的重写之后的toString方法(Function类型返回内容为函数体的字符串,Array类型返回元素组成的字符串…..),而不会去调用Object上原型toString方法(返回对象的具体类型),所以采用arr.toString()不能得到其对象类型,只能将arr转换为字符串类型;因此,在想要得到对象的具体类型时,应该调用Object上原型toString方法。
⑥Array.isArray
用法:Array.isArray(arr)
ES5中新增了Array.isArray方法,IE8及以下不支持
Array.isArray ( arg )
isArray 函数需要一个参数 arg,如果参数是个对象并且 class 内部属性是 “Array”, 返回布尔值 true;否则它返回 false。采用如下步骤:
如果 Type(arg) 不是 Object, 返回 false。
如果 arg 的 [[Class]] 内部属性值是 “Array”, 则返回 true。
返回 false.
let arr = [];console.log(Array.isArray(arr)); // true
