Самый быстрый способ конвертировать JavaScript NodeList в массив? - PullRequest
235 голосов
/ 08 июля 2010

В ранее отвеченных вопросах говорилось, что это был самый быстрый способ:

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

Ответы [ 12 ]

3 голосов
/ 08 июля 2010

Ознакомьтесь с этой записью в блоге здесь , в которой говорится об одном и том же. Из того, что я понял, дополнительное время может быть связано с ходьбой по цепочке прицелов.

1 голос
/ 13 августа 2018

Вот диаграммы, обновленные на дату публикации (диаграмма "неизвестная платформа" - Internet Explorer 11.15.16299.0):

Safari 11.1.2 Firefox 61.0 Chrome 68.0.3440.75 Internet Explorer 11.15.16299.0

Исходя из этих результатов, кажется, что метод preallocate 1 является самой безопасной кросс-браузерной ставкой.

...