判断一个对象是真数组的几种方法
在js中对对象进行判断时需了解到它是否是一个真数组,例如arguments等类似的虽然以数组的样式(下标值)在存储,但它是一个类数组对象。下面列举几种常见的判断是否为真数组的几种方法
起手式:定义一个类数组和真数组
<div></div>
<div></div>
<div></div>
<script>
var divs = document.getElementsByTagName("div"); //类数组
var arr = [1, 2]//真数组
</script>
1、对象隐式原型的构造函数判断
console.log(divs.__proto__.constructor);//ƒ HTMLCollection() { [native code] }
console.log(arr.__proto__.constructor);//ƒ Array() { [native code] }
真数组都是Array构造出来的对象,所以它的隐式原型的构造属性可以找到Array
2、Object.prototype.toString()方法
用法:Object.prototype.toString.call(arr) === ‘[object Array]’
虽然Array也继承自Object,但js在Array.prototype上重写了toString,而我们通过toString.call(arr)实际上是通过原型链调用了。
console.log(Object.prototype.toString.call(arr));// '[object Array]'
console.log(Object.prototype.toString.call(divs));//[object HTMLCollection]
通过Object.prototype.toString()判断原型上是什么,真数组为Array。
3、instanceof判断
console.log(divs instanceof Array);//false
console.log(arr instanceof Array);//true
运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
instanceof是判断一个构造函数的prototype属性所指向的对象是否在另一个被检测对象的原型链上。
例如obj instanceof F,它的运行机制为:obj.proto.proto… => F.prototype,沿着对象obj的原型链查找是否存在对象F.prototype,若存在则返回true,若查找到原型链的终点Object.prototype仍未找到,则返回false。
4、Array.isArray()判断
用法:Array.isArray(arr)
ES5中新增了Array.isArray方法,IE8及以下不支持
isArray 函数需要一个参数 arg,如果参数是个对象并且 class 内部属性是 “Array”, 返回布尔值 true;否则它返回 false。
console.log(Array.isArray(divs));//false
console.log(Array.isArray(arr));//true
最常见的判断是否是一个数组
5、数组方法来判断
try {
console.log(divs.push(1));//报错
} catch (e) {
console.log(e);
} finally {
console.log("divs没有push方法");
}
console.log(arr.push(1));//返回了3
利用数组对象里的方法判断,如果不是数组对象,使用方法会报错
6、判断对象是否在指定对象的原型链上
console.log(Array.prototype.isPrototypeOf(divs));//false
console.log(Array.prototype.isPrototypeOf(arr));//true