@panhonhang
2018-06-08T01:52:37.000000Z
字数 1040
阅读 805
数组具有一个最基本特征:索引。所有JavaScript的内置构造函数都是继承自 Object.prototype。在这个前提下,可以理解为使用 new Array() 或 [] 创建出来的数组对象,都会拥有 Object.prototype 的属性值。如果索引长度大于元素个数,那么我们称之为稀疏数组。
伪数组
定义:
1、拥有length属性,其它属性(索引)为非负整数(对象中的索引会被当做字符串来处理,这里你可以当做是个非负整数串来理解)
2、不具有数组所具有的方法
伪数组,就是像数组一样有 length 属性,也有 0、1、2、3 等属性的对象,看起来就像数组一样,但不是数组。
伪数组是一个 Object,而真实的数组是一个 Array。
《javascript权威指南》上给出了代码用来判断一个对象是否属于“类数组”。如下:
function isArrayLike(o) {
if (o && // o is not null, undefined, etc.
typeof o === 'object' && // o is an object
isFinite(o.length) && // o.length is a finite number
o.length >= 0 && // o.length is non-negative
o.length===Math.floor(o.length) && // o.length is an integer
o.length < 4294967296) // o.length < 2^32
return true; // Then o is array-like
else
return false; // Otherwise it is not
}
不过有个更简单的办法来判断,用 Array.isArray
Array.isArray(fakeArray) === false;
Array.isArray(arr) === true;
从外观上看伪数组,看不出来它与数组的区别,在JavaScript内置对象中常见的伪数组就是大名鼎鼎的auguments:
(function() {
console.log(typeof arguments); // 输出 object,它并不是一个数组
}());
另外在DOM对象中,childNodes也是伪数组
console.log(typeof document.body.childNodes); // 输出 object
除此之外,还有很多常用的伪数组,就不一一列举。
伪数组存在的意义,是可以让普通的对象也能正常使用数组的很多算法,