之前在这里回答的问题都说这是最快的方式:

//nl is a NodeList
var arr = Array.prototype.slice.call(nl);

在我的浏览器上进行基准测试时,我发现它比下面的慢了3倍多:

var arr = [];
for(var i = 0, n; n = nl[i]; ++i) arr.push(n);

它们都产生相同的输出,但我发现很难相信我的第二个版本是最快的方式,特别是因为这里有人说不是这样的。

这是我的浏览器(Chromium 6)的一个怪癖吗?或者有没有更快的方法?

编辑:对于那些关心的人,我选择了以下(似乎是我测试过的所有浏览器中最快的):

//nl is a NodeList
var l = []; // Will hold the array of Node's
for(var i = 0, ll = nl.length; i != ll; l.push(nl[i++]));

EDIT2:我找到了一个更快的方法

// nl is the nodelist
var arr = [];
for(var i = nl.length; i--; arr.unshift(nl[i]));

当前回答

这是我在JS中使用的函数:

function toArray(nl) {
    for(var a=[], l=nl.length; l--; a[l]=nl[l]);
    return a;
}

其他回答

这里有一行,我不确定它是否安全,但它对我有用,它用一个数组覆盖了节点列表变量,因为我不再使用节点列表,因为我把它转换成一个数组。我发现这个解决方案更简洁,因为它只使用了一个变量。

这一点。openButtons =[…this.openButtons]

这是我在JS中使用的函数:

function toArray(nl) {
    for(var a=[], l=nl.length; l--; a[l]=nl[l]);
    return a;
}

在ES6中,我们现在有一个简单的方法来从一个NodeList创建一个数组:Array.from()函数。

// nl is a NodeList
let myArray = Array.from(nl)

结果完全取决于浏览器,为了给出客观的判断,我们必须做一些性能测试,这里有一些结果,你可以在这里运行:

Chrome 6:

Firefox 3.6:

Firefox 4.0 b2:

Safari 5:

IE9平台预览3:

2021年更新:nodeList.forEach()现在是标准的,所有当前的浏览器都支持(桌面和移动端都支持95%左右)。

所以你可以简单地做:

document.querySelectorAll('img').forEach(highlight);

其他情况下

如果你出于某种原因想要将它转换为一个数组,而不仅仅是迭代它——这是一个完全相关的用例——你可以使用[…destructuring]或array .from自ES6开始

let array1 = [...mySetOfElements];
// or
let array2 = Array.from(mySetOfElements);

这也适用于其他不是nodelist的类似数组的结构

例如document.getElementsByTagName返回的HTMLCollection 具有length属性和索引元素的对象 可迭代对象(如Map和Set)




过时的2010年答案

第二种方法在某些浏览器中速度更快,但重点是你必须使用它,因为第一种方法不能跨浏览器。即使时代在变

@kangax (IE 9预览版)

Array.prototype.slice现在可以转换了 某些宿主对象(例如NodeList的) 到数组,这是大多数 现代浏览器已经能够做到这一点 有一段时间了。

例子:

Array.prototype.slice.call(document.childNodes);