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

//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]

更快和更短:

// nl is the nodelist
var a=[], l=nl.length>>>0;
for( ; l--; a[l]=nl[l] );

一些优化:

在一个变量中保存节点列表的长度 在设置之前显式地设置新数组的长度。 访问索引,而不是推动或不变。

代码(jsPerf):

var arr = [];
for (var i = 0, ref = arr.length = nl.length; i < ref; i++) {
 arr[i] = nl[i];
}

假设nodeList = document.querySelectorAll("div"),这是将节点列表转换为数组的简洁形式。

var nodeArray = [].slice.call(nodeList);

看我怎么用。

在ES6中,你可以使用:

Array.from let array = array .from(节点列表) 传播算子 Let array =[…节点列表]