var arr = Array.prototype.slice.call( htmlCollection )
будет иметь тот же эффект, используя "родной" код.
редактировать
Так как это получает много просмотров, обратите внимание (на комментарий @ oriol), что следующее более краткое выражение эффективно эквивалентно:
var arr = [].slice.call(htmlCollection);
Но обратите внимание на комментарий @ JussiR, который, в отличие от «многословной» формы, создает в процессе пустой, неиспользуемый и действительно неиспользуемый экземпляр массива. То, что компиляторы делают с этим, находится за пределами возможностей программиста.
редактировать
Начиная с ECMAScript 2015 (ES 6) существует также Array.from :
var arr = Array.from(htmlCollection);
редактировать
ECMAScript 2015 также предоставляет оператор распространения , который функционально эквивалентен Array.from
(хотя обратите внимание, что Array.from
в качестве второго аргумента поддерживается функция отображения).
var arr = [...htmlCollection];
Я подтвердил, что оба вышеперечисленных работают NodeList
.
Сравнение производительности для упомянутых методов: http://jsben.ch/h2IFA
for (var a=[], i=collection.length; i;) a[--i] = collection[i];
так что не так много «против» там :-)