有手就行-数组真伪API
前言
在js中数组类型大家应该都不陌生,那你是否知道数组其实是有真假之分的呢?
什么是伪数组。
伪数组
:1、拥有length属性
,其它属性(索引)为非负整数(对象中的索引会被当做字符串来处理,这里你可以当做是个非负整数串来理解
2、不具有
数组所具有的方法
常见的伪数组有:
- 原生js获取dom元素得到的集合,例如:使用document.getElementsByTagName获取的元素标签集合就是伪数组
- 函数的argument参数
创建伪数组和真数组实例。
<div></div>
<div></div>
<div></div>
<script>
var divs = document.getElementsByTagName("div"); //类数组
var arr = [1, 2]//真数组
</script>
对象隐式原型的构造函数判断
console.log(divs.__proto__.constructor);
//结果为:ƒ HTMLCollection() { [native code] }
//HTML 元素的集合
console.log(arr.__proto__.constructor);
//结果为:ƒ Array() { [native code] }
//构造函数Array
原理:
真数组都是由Array构造出来的对象,所以它的隐式原型的构造属性为Array
.toString()方法
console.log(divs.toString());
//结果为:[object HTMLCollection]
console.log(arr.toString());
//结果为:1,2
原理:
真数组
调用toString方法会强转为字符
串,但是伪数组
调用toString方法返回的结果中括号后面
的为它的构造函数类型
Object.prototype.toString.call方法
console.log(Object.prototype.toString.call(divs));
//结果为:[object HTMLCollection]
console.log(Object.prototype.toString.call(arr));
//结果为:[object Array]
原理:
利用call改变Objcet方法的this指向,从而使真伪数组都可使用,返回的结果中括号后面
的为它的构造函数类型
。
instanceof判断
console.log(divs instanceof Array);
//结果为:false
console.log(arr instanceof Array);
//结果为:true
原理:
检测构造函数(Array)
的 prototype
属性是否出现
在该实例对象
的原型链
上。
Array.isArray()判断
console.log(Array.isArray(divs));
//结果为:false
console.log(Array.isArray(arr));
//结果为:true
原理:
最常见的判断是否是一个数组
数组方法来判断
try {
console.log(divs.push(1));//报错
} catch (err) {
console.log("divs没有push方法");
}
console.log(arr.push(1));//返回了3
原理:
伪数组没有数组具有的方法,则伪数组调用数组方法时抛出错误信息。
isPrototypeOf
console.log(Array.prototype.isPrototypeOf(divs));
//结果为:false
console.log(Array.prototype.isPrototypeOf(arr));
//结果为:true
原理:
判断对象是否在指定对象的原型链上