Loop forEach
dan for
dapat digunakan untuk mencapai fungsi yang sama secara efektif untuk array. Sebagai contoh
for [var i = 0; i < array.length; i++]{ /* .. */ }
dan
array.forEach[function[item, index]{ /* .. */ }];
_Apakah ada perbedaan di antara mereka?
Perbedaan
Perbedaan paling mendasar antara for
loop dan forEach
metode adalah
Dengan for
- Anda dapat
_4 keluar dari looparray.forEach[function[item, index]{ /* .. */ }];
- Anda dapat menggunakan
_5 untuk melompati iterasiarray.forEach[function[item, index]{ /* .. */ }];
- Performanya jauh lebih cepat daripada
forEach
- Cakupan indeks, misalnya i, dicakup ke fungsi yang memuatnya.
_// 'i' is scoped to the containing function for [var i = 0; i < arr.length; i++] { .. }
Dengan forEach
- Anda dapat mensimulasikan
5 hanya dengan kembali dari fungsi yang diteruskan kearray.forEach[function[item, index]{ /* .. */ }];
forEach
- Namun, tidak ada cara untuk menghentikan ________23______ perulangan sama sekali
- Kinerja jauh lebih lambat dari
for
- Cakupan indeks, misalnya i, dicakup ke fungsi internal.
_// 'i' is scoped to the internal function arr.forEach[function [el, i] { .. }];
- Namun,
forEach
lebih ekspresif. Ini mewakili maksud Anda untuk beralih melalui setiap elemen array, dan memberi Anda referensi ke elemen tersebut, bukan hanya indeks
Uji kinerja
Tes kinerja dijalankan di jsperf. com tes untuk loop vs foreach
Berikut perbedaan performa saat menjalankan pengujian di Chrome 47 di Mac OS X
Cakupan perbedaan indeks secara detail
Katakanlah saya ingin melakukan sesuatu yang asinkron dengan elemen-elemen array
// The array:
var elements = ["element1", "element2", "element3"];
Beginilah seharusnya diterapkan menggunakanforEach
elements.forEach[function[element] {
// The asynchronous action simulator
setTimeout[function[] {
console.log[element];
}, 100];
}];
_Tanpa mengetahui tentang
// 'i' is scoped to the containing function
for [var i = 0; i < arr.length; i++] { .. }
4 saya akan mulai dengan loop klasik // 'i' is scoped to the containing function
for [var i = 0; i < arr.length; i++] { .. }
5for [var i = 0; i < elements.length; i++] {
setTimeout[function[] {
console.log[elements[i]];
}, 100];
}
Ini tidak berfungsi seperti yang diharapkan, karena alih-alih
// 'i' is scoped to the containing function
for [var i = 0; i < arr.length; i++] { .. }
6, // 'i' is scoped to the containing function
for [var i = 0; i < arr.length; i++] { .. }
7, dan // 'i' is scoped to the containing function
for [var i = 0; i < arr.length; i++] { .. }
8 di konsol, saya mendapatkan // 'i' is scoped to the containing function
for [var i = 0; i < arr.length; i++] { .. }
9 tiga kali. Tampaknya ada yang salah dengan variabel // 'i' is scoped to the internal function
arr.forEach[function [el, i] { .. }];
_0, karena fungsinya bekerja dengan baik dengan // 'i' is scoped to the internal function
arr.forEach[function [el, i] { .. }];
1. Sebenarnya tidak ada yang salah dengan // 'i' is scoped to the internal function
arr.forEach[function [el, i] { .. }];
0. Masalahnya adalah nilainya adalah 3 ketika // 'i' is scoped to the internal function
arr.forEach[function [el, i] { .. }];
3 dipanggil dan karena // 'i' is scoped to the internal function
arr.forEach[function [el, i] { .. }];
4 tidak ada, ia mencetak // 'i' is scoped to the containing function
for [var i = 0; i < arr.length; i++] { .. }
9 Saya bukan pengembang penuh waktu, jadi saya mengandalkan pengetahuan dasar saya untuk membawa saya melalui proyek yang memerlukan penulisan kode. Saya sangat senang ketika mengetahui tentang JavaScript. metode forEach[] sebagai pengganti for loop tradisional. Namun, saya dengan baik hati ditegur karena tidak mengikuti perkembangan JavaScript terbaru yang ditawarkan — mengacu pada for…of loop
Menurut mereka yang mengomentari artikel saya sebelumnya, teknik for...of
lebih unggul dalam kecepatan dan keterbacaan daripada .forEach[]
. Karena saya tidak menulis aplikasi skala besar di mana waktu pemrosesan benar-benar berperan, saya penasaran untuk mencari tahu. Seberapa cepat [atau lambat] setiap jenis struktur iterasi?
Jadi saya memutuskan untuk menguji berbagai hal dan membagikan hasil saya
Lingkaran Primer
Sebelum kita mulai, mari lakukan rekap 30 detik pada berbagai jenis struktur iterasi
- Sementara Loop. Mekanisme perulangan yang paling sederhana. Perulangan while akan dijalankan selama ekspresi yang diberikan bernilai
true
- Untuk Loop. Struktur iterasi yang berguna ketika jumlah iterasi diketahui. Deklarasi for loop memiliki tiga komponen. inisialisasi variabel, ekspresi untuk menentukan apakah loop akan berakhir, dan pernyataan yang dieksekusi di akhir setiap iterasi
- forEach[] Metode. Sebuah metode dari kelas array yang mengambil satu argumen, yang merupakan sebuah fungsi, dan menjalankan fungsi tersebut dengan setiap elemen di dalam array
- Untuk…dari Loop. Yang paling baru ditambahkan dari struktur iterasi, pernyataan ini memerlukan penetapan nama variabel sementara yang akan ditetapkan ke setiap elemen dalam array saat iterasi selesai
let arr = [];// while loop
let i=0;
while[i < arr.length] {
// do stuff
i++;
}// for loop
for[let i=0; i {
// do stuff
}];// for...of loop
for[const element of arr] {
// do stuff
}
Skenario Uji
Untuk menguji kecepatan setiap loop, saya membuat array 10, 100, 1.000, dan 1.000.000 bilangan bulat. Dalam setiap loop, tidak ada perhitungan yang dilakukan. Dua metode, console.time[]
dan console.timeEnd[]
, digunakan untuk melaporkan kecepatan masing-masing teknik
Hasil
Hasilnya cukup menarik dan tidak seperti yang saya harapkan. Semua waktu dalam milidetik
Berikut adalah beberapa takeaways utama saya dari latihan ini
while
loop menskalakan yang terbaik untuk array besarfor...of
_ loop adalah yang tercepat dalam hal set data kecil, tetapi skalanya buruk untuk set data besar.forEach[]
danfor...of
cukup dekat sehingga tidak ada pihak yang harus menggantungkan topi mereka pada kinerja sendirian di atas yang lain- Waktu eksekusi
.forEach[]
secara dramatis dipengaruhi oleh apa yang terjadi di dalam setiap iterasi - Standar
for...of
_1 loop biasa-biasa saja di seluruh papan
Saya yakin bahwa memvariasikan kasus uji akan memberikan wawasan yang lebih dalam. Namun, sebagai seseorang yang tidak hidup atau mati dalam sepersekian milidetik, ini sudah cukup memuaskan rasa ingin tahuku
Beri tahu saya pendapat Anda di komentar di bawah. Apakah Anda memiliki kasus penggunaan di mana satu metode jauh mengungguli yang lain?