将NodeList转成Array

NodeList是一个Dom概念,其定义如下:

interface NodeList {
    Node               item(in unsigned long index);
    readonly attribute unsigned long    length;
};

它有一个方法和一个属性,可以通过item方法来获得指定的元素:

1
nodeList.item(1);

也可以像数组一样,用下标来访问:

1
nodeList[1];

但它不是数组,其原型链如下:

myNodeList ——> NodeList.prototype ——> Object.prototype ——> null

而数组的原型链则为:

myArray ——> Array.prototype ——> Object.prototype ——> null

NodeList没有数组的那些方法,对它进行遍历不是很方便,我们得先把它转成数组。

借助call以及Array.prototype.slice可以做到:

1
var myArray = Array.prototype.slice.call(myNodeList);

call是把Array.prototype中的this指向myNodeList,slice方法要求this所指的对象有一个length参数,而刚好NodeList就有。

Array.prototype.slice具体如何工作的,参见ecma