Pertanyaan yang sebelumnya dijawab di sini mengatakan bahwa ini adalah cara tercepat:
//nl is a NodeList
var arr = Array.prototype.slice.call(nl);
Dalam melakukan pembandingan pada browser saya, saya menemukan bahwa ini lebih dari 3 kali lebih lambat dari ini:
var arr = [];
for(var i = 0, n; n = nl[i]; ++i) arr.push(n);
Keduanya menghasilkan output yang sama, tetapi saya merasa sulit untuk percaya bahwa versi kedua saya adalah cara tercepat yang mungkin, terutama karena orang mengatakan sebaliknya di sini.
Apakah ini kekhasan di browser saya (Chromium 6)? Atau ada cara yang lebih cepat?
EDIT: Untuk siapa pun yang peduli, saya memilih yang berikut (yang tampaknya paling cepat di setiap browser yang saya uji):
//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: Saya menemukan cara yang lebih cepat
// nl is the nodelist
var arr = [];
for(var i = nl.length; i--; arr.unshift(nl[i]));
javascript
arrays
nodelist
jairajs89
sumber
sumber
arr[arr.length] = nl[i];
mungkin lebih cepat daripadaarr.push(nl[i]);
karena menghindari panggilan fungsi.var i = nl.length, arr = new Array(i); for(; i--; arr[i] = nl[i]);
Jawaban:
Yang kedua cenderung lebih cepat di beberapa browser, tetapi poin utamanya adalah Anda harus menggunakannya karena yang pertama bukan cross-browser. Meskipun Masa Mereka Berubah
@kangax ( pratinjau IE 9 )
Contoh:
sumber
Dengan ES6, kita sekarang memiliki cara sederhana untuk membuat Array dari NodeList:
Array.from()
fungsi.sumber
console.log(Array.from([1, 2, 3], x => x + x)); // expected output: Array [2, 4, 6]
Berikut cara keren baru untuk melakukannya menggunakan operator penyebaran ES6 :
sumber
ERROR TypeError: el.querySelectorAll(...).slice is not a function
Beberapa optimasi:
Kode ( jsPerf ):
sumber
Hasilnya akan sepenuhnya tergantung pada browser, untuk memberikan putusan yang obyektif, kita harus membuat beberapa tes kinerja, berikut adalah beberapa hasil, Anda dapat menjalankannya di sini :
Chrome 6:
Firefox 3.6:
Firefox 4.0b2:
Safari 5:
Pratinjau Platform IE9 3:
sumber
for (var i=o.length; i--;)
... apakah 'untuk loop' dalam tes ini mengevaluasi ulang properti panjang pada setiap iterasi?Browser paling cepat dan lintas adalah
Seperti yang saya membandingkan di
http://jsbin.com/oqeda/98/edit
* Terima kasih @CMS untuk idenya!
sumber
Di ES6 Anda dapat menggunakan:
Dari Array
let array = Array.from(nodelist)
Operator yang tersebar
let array = [...nodelist]
sumber
Sekarang Anda dapat melakukan document.querySelectorAll ('div'). ForEach (function () ...)
sumber
NodeList
tidak berfungsi tetapiObject
:Object.prototype.forEach = Array.prototype.forEach; document.getElementsByTagName("img").forEach(function(img) { alert(img.src); });
lebih cepat dan lebih pendek:
sumber
>>>0
? Dan mengapa tidak menempatkan tugas pada bagian pertama dari for loop?l
adalah0
, loop akan berakhir, oleh karena itu0
elemen th tidak akan disalin (ingat ada unsur pada indeks0
)>>>
mungkin tidak diperlukan di sini tetapi digunakan untuk menjamin panjang nodelist itu mematuhi array spec; itu memastikan bahwa itu adalah bilangan bulat 32-bit yang tidak ditandatangani. Lihat di sini ecma-international.org/ecma-262/5.1/#sec-15.4 Jika Anda menyukai kode yang tidak dapat dibaca, gunakan metode ini dengan saran @ CamiloMartin!var
dalam bagian pertamafor
loop karena 'pengangkatan variabel'. Deklarasivar
akan 'diangkat' ke atas fungsi, bahkan jikavar
garis muncul di suatu tempat lebih rendah, dan ini dapat menyebabkan efek samping yang tidak jelas dari urutan kode. Misalnya beberapa kode dalam fungsi yang sama yang terjadi sebelum for for loop mungkin bergantung padaa
danl
tidak dideklarasikan. Karena itu untuk kemungkinan yang lebih besar, nyatakan vars Anda di bagian atas fungsi (atau jika pada ES6, gunakanconst
ataulet
sebaliknya, yang tidak mengangkat).Lihat posting blog ini di sini yang membahas hal yang sama. Dari apa yang saya kumpulkan, waktu tambahan mungkin ada hubungannya dengan berjalan di rantai lingkup.
sumber
Array.prototype.slice
tergantung pada browser. Saya ingin tahu algoritma apa yang digunakan oleh masing-masing browser.Ini adalah fungsi yang saya gunakan di JS saya:
sumber
Berikut adalah bagan yang diperbarui pada tanggal posting ini (bagan "platform tidak dikenal" adalah Internet Explorer 11.15.16299.0):
Dari hasil ini, tampaknya metode preallocate 1 adalah taruhan lintas-browser yang paling aman.
sumber
Dengan asumsi
nodeList = document.querySelectorAll("div")
, ini adalah bentuk ringkas dari konversinodelist
ke array.Lihat saya menggunakannya di sini .
sumber