[关闭]
@panhonhang 2018-06-08T01:52:37.000000Z 字数 1040 阅读 793

JavaScript中的数组与伪数组的区别


数组具有一个最基本特征:索引。所有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

除此之外,还有很多常用的伪数组,就不一一列举。

伪数组存在的意义,是可以让普通的对象也能正常使用数组的很多算法,

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注