本文共 1551 字,大约阅读时间需要 5 分钟。
在js中数组类型大家应该都不陌生,那你是否知道数组其实是有真假之分的呢?
2、
伪数组
:1、拥有length属性
,其它属性(索引)为非负整数(对象中的索引会被当做字符串来处理,这里你可以当做是个非负整数串来理解不具有
数组所具有的方法
常见的伪数组有:
console.log(divs.__proto__.constructor);//结果为:ƒ HTMLCollection() { [native code] }//HTML 元素的集合console.log(arr.__proto__.constructor);//结果为:ƒ Array() { [native code] }//构造函数Array
原理:
真数组都是由Array构造出来的对象,所以它的隐式原型的构造属性为Array
console.log(divs.toString()); //结果为:[object HTMLCollection] console.log(arr.toString()); //结果为:1,2
原理:
真数组
调用toString方法会强转为字符
串,但是伪数组
调用toString方法返回的结果中括号后面
的为它的构造函数类型
console.log(Object.prototype.toString.call(divs)); //结果为:[object HTMLCollection] console.log(Object.prototype.toString.call(arr)); //结果为:[object Array]
原理:
利用call改变Objcet方法的this指向,从而使真伪数组都可使用,返回的结果中括号后面
的为它的构造函数类型
。
console.log(divs instanceof Array);//结果为:falseconsole.log(arr instanceof Array);//结果为:true
原理:
检测构造函数(Array)
的 prototype
属性是否出现
在该实例对象
的原型链
上。
console.log(Array.isArray(divs));//结果为:falseconsole.log(Array.isArray(arr));//结果为:true
原理:
最常见的判断是否是一个数组
try { console.log(divs.push(1));//报错 } catch (err) { console.log("divs没有push方法"); } console.log(arr.push(1));//返回了3
原理:
伪数组没有数组具有的方法,则伪数组调用数组方法时抛出错误信息。
console.log(Array.prototype.isPrototypeOf(divs)); //结果为:false console.log(Array.prototype.isPrototypeOf(arr)); //结果为:true
原理:
判断对象是否在指定对象的原型链上
转载地址:http://jwezi.baihongyu.com/