Apakah Anda pikir ada perbedaan besar dalam untuk ... dalam dan untuk loop? Jenis "untuk" apa yang Anda pilih untuk digunakan dan mengapa?
Katakanlah kita memiliki array array asosiatif:
var myArray = [{'key': 'value'}, {'key': 'value1'}];
Jadi kita bisa beralih:
for (var i = 0; i < myArray.length; i++)
Dan:
for (var i in myArray)
Saya tidak melihat perbedaan besar. Apakah ada masalah kinerja?
javascript
andrii
sumber
sumber
myArray.forEach(callback[, thisarg])
.if(myArray.hasOwnProperty(i)){true}
['foo', 'bar', 'baz'].forEach(function(element, index, array){ console.log(element, index, array); });
OK untuk menggunakan cukup banyak di mana-mana kecuali di IE8- dan sejauh ini sintaks yang paling eleganfor...of
pernyataan dalam ECMAScript 6 , misalnya:for (let i of myArray) console.log(i);
Jawaban:
Pilihannya harus didasarkan pada idiom mana yang paling dipahami.
Array diulang menggunakan:
Objek yang digunakan sebagai array asosiatif diulang menggunakan:
Kecuali Anda memiliki alasan untuk menghancurkan bumi, patuhi pola penggunaan yang telah ditetapkan.
sumber
for
, bukan mengevaluasi a.length setiap kali dalam loop.i < l
, tidaki < a
, dalam kondisi for-loop Anda.Douglas Crockford merekomendasikan dalam JavaScript: The Good Parts (halaman 24) untuk menghindari penggunaan
for in
pernyataan.Jika Anda menggunakan
for in
untuk mengulang nama properti di suatu objek, hasilnya tidak diurutkan. Lebih buruk: Anda mungkin mendapatkan hasil yang tidak terduga; itu termasuk anggota yang diwarisi dari rantai prototipe dan nama metode.Semuanya kecuali properti dapat disaring
.hasOwnProperty
. Contoh kode ini melakukan apa yang awalnya Anda inginkan:sumber
name
variabel:for(var name in object)...
, sebaliknya, jika kode yang ada di dalam fungsi misalnya,name
variabel akhir sampai menjadi properti dari obyek global (tugas ke identifier dideklarasikan melakukan itu), juga di ECMAScript baru 5 Mode Ketat, kode itu akan melempar aReferenceError
.FYI - Pengguna jQuery
each(callback)
Metode jQuery menggunakanfor( ; ; )
loop secara default, danfor( in )
hanya akan digunakan jika panjangnyaundefined
.Oleh karena itu, saya akan mengatakan aman untuk mengasumsikan urutan yang benar ketika menggunakan fungsi ini.
Contoh :
Kelemahan dari menggunakan ini adalah bahwa jika Anda melakukan beberapa logika non UI, fungsi Anda akan lebih portabel untuk kerangka kerja lainnya. The
each()
fungsi mungkin terbaik dicadangkan untuk digunakan dengan pemilih jQuery danfor( ; ; )
mungkin dianjurkan sebaliknya.sumber
ada perbedaan kinerja tergantung pada jenis loop apa yang Anda gunakan dan pada browser apa.
Contohnya:
hampir dua kali lebih cepat pada beberapa browser dibandingkan:
Namun, kecuali jika array Anda BESAR atau Anda memutarnya secara konstan, semuanya cukup cepat. Saya sangat ragu bahwa array looping adalah hambatan dalam proyek Anda (atau untuk proyek lain dalam hal ini)
sumber
for(var i = myArray.length; i--;)
Perhatikan bahwa metode Array.forEach asli sekarang banyak didukung .
sumber
Jawaban yang diperbarui untuk 2012 versi terbaru dari semua browser utama - Chrome, Firefox, IE9, Safari dan Opera mendukung larik asli ES5. ForEach
Kecuali Anda memiliki alasan untuk mendukung IE8 secara native (dengan mengingat ES5-shim atau bingkai Chrome dapat diberikan kepada pengguna ini, yang akan memberikan lingkungan JS yang tepat), lebih bersih jika hanya menggunakan sintaksis bahasa yang tepat:
Dokumentasi lengkap untuk array.forEach () ada di MDN.
sumber
Keduanya tidak sama ketika array jarang.
sumber
Menggunakan forEach untuk melewati rantai prototipe
Hanya tambahan cepat untuk jawaban @ nailer di atas , menggunakan forEach dengan Object.keys berarti Anda dapat menghindari iterasi melalui rantai prototipe tanpa harus menggunakan hasOwnProperty.
sumber
Saya berpendapat kedua bahwa Anda harus memilih metode iterasi sesuai dengan kebutuhan Anda. Saya akan menyarankan Anda sebenarnya untuk tidak pernah melalui asli
Array
denganfor in
struktur. Ini jauh lebih lambat dan , seperti yang ditunjukkan Chase Seibert saat ini, tidak kompatibel dengan kerangka kerja Prototype.Ada tolok ukur yang sangat baik pada berbagai gaya perulangan yang harus Anda perhatikan jika Anda bekerja dengan JavaScript . Jangan melakukan optimasi awal, tetapi Anda harus menyimpannya di belakang kepala Anda.
Saya akan menggunakan
for in
untuk mendapatkan semua properti dari suatu objek, yang sangat berguna saat men-debug skrip Anda. Misalnya, saya suka membuat garis ini berguna ketika saya menjelajahi objek yang tidak dikenal:Itu membuang konten dari seluruh objek (bersama-sama dengan badan metode) ke log Firebug saya. Sangat berguna.
sumber
ini adalah sesuatu yang saya lakukan.
ini adalah bagaimana Anda akan menggunakannya
ini akan bekerja pada array dan objek (seperti daftar elemen HTML)
Saya baru saja membuat ini jadi saya terbuka untuk saran :)
sumber
Saya akan menggunakan metode yang berbeda berdasarkan pada bagaimana saya ingin referensi item.
Gunakan foreach jika Anda hanya ingin item saat ini.
Gunakan untuk jika Anda memerlukan pengindeks untuk melakukan perbandingan relatif. (Yaitu, bagaimana ini dibandingkan dengan item sebelumnya / berikutnya?)
Saya tidak pernah memperhatikan perbedaan kinerja. Saya akan menunggu sampai memiliki masalah kinerja sebelum mengkhawatirkannya.
sumber
Dengan for (var i di myArray) Anda juga dapat mengulang objek, saya akan berisi nama kunci dan Anda dapat mengakses properti melalui myArray [i] . Selain itu, semua metode yang akan Anda tambahkan ke objek akan dimasukkan dalam loop, juga, yaitu, jika Anda menggunakan kerangka kerja eksternal seperti jQuery atau prototipe, atau jika Anda menambahkan metode ke objek prototipe secara langsung, pada satu titik saya akan menunjuk ke metode-metode itu.
sumber
Awas!
Misalnya, jika Anda memiliki beberapa tag skrip dan sedang mencari informasi dalam atribut tag, Anda harus menggunakan properti .length dengan for for karena itu bukan array sederhana melainkan objek HTMLCollection.
https://developer.mozilla.org/en/DOM/HTMLCollection
Jika Anda menggunakan pernyataan foreach untuk (var i di yourList) itu akan mengembalikan properti dan metode HTMLCollection di sebagian besar browser!
Bahkan jika getElementsByTagName harus mengembalikan NodeList, sebagian besar browser mengembalikan HTMLCollection: https://developer.mozilla.org/en/DOM/document.getElementsByTagName
sumber
Karena dalam loop pada Array tidak kompatibel dengan Prototipe. Jika Anda berpikir Anda mungkin perlu menggunakan perpustakaan itu di masa depan, masuk akal untuk berpegang teguh pada loop.
http://www.prototypejs.org/api/array
sumber
Saya telah melihat masalah dengan "untuk masing-masing" menggunakan objek dan prototipe dan array
pemahaman saya adalah bahwa untuk masing-masing adalah untuk properti objek dan BUKAN array
sumber
Jika Anda benar-benar ingin mempercepat kode Anda, bagaimana dengan itu?
itu agak memiliki logika sementara dalam pernyataan untuk dan itu kurang berlebihan. Juga firefox memiliki Array.forEach dan Array.filter
sumber
Kode yang lebih pendek dan terbaik menurut jsperf adalah
sumber
Gunakan array Array (). ForEach untuk memanfaatkan paralelisme
sumber
Array.prototype.forEach
tidak akan mengeksekusi beberapa panggilan ke callback secara paralel.untuk (;;) adalah untuk Array : [20,55,33]
for..in adalah untuk Objects : {x: 20, y: 55: z: 33}
sumber
Hati-hati!!! Saya menggunakan Chrome 22.0 di Mac OS dan saya mengalami masalah dengan untuk setiap sintaks.
Saya tidak tahu apakah ini masalah browser, masalah javascript atau beberapa kesalahan dalam kode, tapi ini SANGAT aneh. Di luar objek itu bekerja dengan sempurna.
sumber
Ada perbedaan penting antara keduanya. For-in iterate atas properti dari suatu objek, jadi ketika case adalah array, ia tidak hanya akan beralih pada elemen-elemennya tetapi juga pada fungsi "remove" yang dimilikinya.
Anda bisa menggunakan for-in dengan
if(myArray.hasOwnProperty(i))
. Namun, ketika mengulangi array saya selalu lebih suka untuk menghindari ini dan hanya menggunakan pernyataan for (;;).sumber
Meskipun keduanya sangat mirip, ada perbedaan kecil:
dalam hal ini outputnya adalah:
STANDAR UNTUK LOOP:
ARRAY [0] = A
ARRAY [1] = B
ARRAY [2] = C
sedangkan dalam hal ini outputnya adalah:
FOR-IN LOOP:
ARRAY [1] = B
ARRAY [2] = C
ARRAY [10] = D
ARRAY [ABC] = 123
sumber
Pernyataan dalam untuk memungkinkan untuk perulangan melalui nama-nama semua properti dari suatu objek. Sayangnya, itu juga loop melalui semua anggota yang diwarisi melalui rantai prototipe. Ini memiliki efek samping yang buruk dari melayani fungsi metode ketika bunga ada di anggota data.
sumber