关于类数组对象

JavaScript中有一些著名的类数组对象,它们看起来很像数组:

  • 拥有length属性

  • 元素按序保存在对象中,可以通过索引访问

但实际和数组又不是一回事:

  • 没有数组的很多方法

  • 也会有数组没有的方法
    (e.g. NodeList的item()方法)

  • 有些类数组对象是动态变化的
    (e.g. NodeList的值是基于DOM结构动态执行查询的结果)

  • ……

将类数组对象转换为数组对象

Array.prototype.slice.call(arraylike, 0);

这是一个遍地开花的方法,这里主要是想简单理解一下实现原理。

Array的通用方法

Array对象的很多方法都是通用方法,意思是其它非数组对象也可以直接借来使用,因为它们在设计时没有要求使用方法的对象必须是数组。

Array.prototype.slice()就是这样一个方法,只要对象有length属性并可以通过索引访问,就可以使用该方法。

当仅传入一个参数,且传入参数为空或0时,从索引为0的元素开始复制,直到最后一个元素,结果被保存在一个数组中返回。

Function.call()方法

这个方法使得你可以在一个对象上借用另一个对象的方法。

第一个参数即为实际调用方法的对象,其后的参数为依次传入方法的参数。

将NodeList对象转换为数组对象的限制

不知道现在还是否需要考虑这一点?

IE8之前的版本将NodeList实现为COM对象而非DOM对象,COM对象不能直接调用js方法,因此需要采取其他方式转化。

/* JavaScript高级程序设计-第十章 P250 */
function convertToArray(nodes) {
    var array = null;
    try {
        array = Array.prototype.slice.call(nodes, 0);
    } catch(ex) {
        array = new Array();
        for(var i=0; i<nodes.length; i++) {
            array.push(nodes[i]);
        }
    }
    return array;
}

紫一沙
18 声望0 粉丝