Saya tahu apa itu for... in
loop (iterates over key), tetapi mendengar pertama kali tentang for... of
(iterates over value).
Saya bingung dengan for... of
loop. Saya tidak mendapatkan kata sifat. Ini adalah kode di bawah ini:
var arr = [3, 5, 7];
arr.foo = "hello";
for (var i in arr) {
console.log(i); // logs "0", "1", "2", "foo"
}
for (var i of arr) {
console.log(i); // logs "3", "5", "7"
// it is does not log "3", "5", "7", "hello"
}
Apa yang saya dapatkan adalah, for... of
mengulangi nilai properti. Lalu mengapa itu tidak masuk (kembali) "3", "5", "7", "hello"
bukan "3", "5", "7"
? tetapi for... in
loop berulang di atas setiap tombol ( "0", "1", "2", "foo"
). Di sini for... in
loop juga beralih pada foo
kunci. Tetapi for... of
tidak mengulangi nilai foo
properti yaitu "hello"
. Kenapa begitu?
Singkat cerita:
Di sini saya konsol for... of
loop. Seharusnya log "3", "5", "7","hello"
tapi di sini log "3", "5", "7"
. Mengapa
javascript
arrays
object
Mukund Kumar
sumber
sumber
for ... of
dibawa ke bahasa untuk memperbaiki masalah dengan menggunakanfor ... in
dengan Array.Array.prototype
dapat diubah sedemikian rupa sehingga properti tambahan tersedia, membuatnya tidak aman untuk mengulanginya karena Anda bisa mendapatkan kunci non numerik yang tidak Anda harapkan.of
(untuk ... dari lilitan) , karena ini menanyakan tentang perilaku spesifik fitur tersebut, daripada meminta gambaran umum secara umum.for <key> in
" dan "for <value> of
" dan menyadari bahwa IE tidak mendukungfor..of
Jawaban:
for in
loop atas nama properti enumerable dari suatu objek.for of
(Baru dalam ES6) tidak menggunakan iterator khusus objek dan loop atas nilai-nilai yang dihasilkan oleh itu.Dalam contoh Anda, array iterator menghasilkan semua nilai dalam array (mengabaikan properti non-indeks).
sumber
for ... of
distandarisasi dalam ES6.for... of
:: arrays :: arrays selalu memiliki panjang, jadi Anda dapat berpikirfor..
[elemen ke-n]of..
[elemen q]for..in..keys
=== kunci asing === gunakanfor...in
untuk kunci! Karena itu, gunakanfor...of
untuk nilai.Saya menemukan jawaban lengkap di: https://www.typescriptlang.org/docs/handbook/iterators-and-generators.html (Meskipun untuk skrip jenis, ini juga sama untuk javascript)
sumber
index
. Dan kemudian untuk "of" akan menjadivalues
masing-masing indeks / kunci / item.let thisItem = items[all];
variabel,for...of
bantu pintas itu!for...in
sepertiObject.keys()
, coba tebak? Array adalah objek, sot yang juga akan mengembalikan indeces mereka. :)Untuk ... dalam lingkaran
The for ... in loop meningkatkan kelemahan loop for dengan menghilangkan logika penghitungan dan kondisi keluar.
Contoh:
Tapi, Anda masih harus berurusan dengan masalah menggunakan indeks untuk mengakses nilai-nilai array, dan itu bau; itu hampir membuatnya lebih membingungkan dari sebelumnya.
Juga, for ... in loop dapat membawa Anda ke masalah besar ketika Anda perlu menambahkan metode tambahan ke array (atau objek lain). Karena untuk ... dalam loop loop atas semua properti enumerable, ini berarti jika Anda menambahkan properti tambahan ke prototipe array, maka properti itu juga akan muncul dalam loop.
Cetakan:
Inilah sebabnya mengapa ... dalam loop tidak disarankan saat mengulang array.
Untuk ... dari loop
Untuk ... dari loop digunakan untuk mengulang semua jenis data yang dapat diulang.
Contoh:
Cetakan:
Ini membuat for ... of the loop versi paling ringkas dari semua for for loop.
Tapi tunggu, masih ada lagi! Untuk ... loop juga memiliki beberapa manfaat tambahan yang memperbaiki kelemahan for dan for ... in loop.
Anda dapat menghentikan atau menghancurkan for ... of loop kapan saja.
Cetakan:
Dan Anda tidak perlu khawatir tentang menambahkan properti baru ke objek. Untuk ... dari loop hanya akan mengulang pada nilai-nilai dalam objek.
sumber
for (var index=0; index<arr.length; index++)
loop (di manaindex
penghitung adalah bilangan bulat, tidak seperti dalam contoh Anda).Perbedaan
for..in
danfor..of
:Keduanya
for..in
danfor..of
merupakan perulangan konstruksi yang digunakan untuk beralih pada struktur data. Satu-satunya perbedaan adalah atas apa yang mereka lakukan:for..in
iterates atas semua kunci properti enumerable dari suatu objekfor..of
iterates atas nilai - nilai objek iterable. Contoh objek yang dapat diubah adalah array, string, dan NodeLists.Contoh:
Dalam contoh ini kita dapat mengamati bahwa
for..in
loop berulang di atas kunci objek, yang merupakan objek array dalam contoh ini. Tombolnya adalah 0, 1, 2 yang sesuai dengan elemen array yang kita tambahkan danaddedProp
. Ini adalah bagaimanaarr
objek array terlihat di devtools chrome:Anda melihat bahwa
for..in
perulangan kami tidak lebih dari sekadar mengulangi nilai-nilai ini.The
for..of
loop dalam contoh kita iterates atas nilai-nilai dari struktur data. Nilai dalam contoh khusus ini adalah'el1', 'el2', 'el3'
. Nilai-nilai yang menggunakan struktur data iterable akan kembalifor..of
tergantung pada jenis objek iterable. Sebagai contoh sebuah array akan mengembalikan nilai-nilai semua elemen array sedangkan string mengembalikan setiap karakter individu dari string.sumber
The
for...in
pernyataan iterates atas sifat enumerable suatu objek, dalam urutan yang sewenang-wenang. Properti enumerable adalah properti yang flag [[Enumerable]] internalnya benar, maka jika ada properti enumerable dalam rantai prototipe,for...in
loop akan beralih pada mereka juga.The
for...of
pernyataan iterates atas data yang mendefinisikan objek iterable akan mengulangi lebih.Contoh:
Seperti sebelumnya, Anda dapat melewatkan menambahkan
hasOwnProperty
difor...of
loop.sumber
Pernyataan for-in iterate atas properti enumerable suatu objek, dalam urutan sewenang-wenang.
Loop akan mengulangi semua properti enumerable dari objek itu sendiri dan yang diwarisi objek dari prototipe konstruktornya
Anda dapat menganggapnya sebagai "untuk masuk" pada dasarnya mengulang dan mencantumkan semua kunci.
sumber
for in
hanya akan menunjukkan kunci jika ditambahkan oleh kami, itu tidak akan menunjukkan formatUnicornString.prototype
.Ada beberapa tipe data yang sudah didefinisikan yang memungkinkan kita untuk beralih di atasnya dengan mudah misalnya Array, Map, String Objects
Normal untuk yang diulang di atas iterator dan sebagai respons memberi kita kunci yang ada di urutan penyisipan seperti yang ditunjukkan pada contoh di bawah ini.
Sekarang jika kita mencoba yang sama dengan for , maka sebagai respons itu memberi kita nilai bukan kunci. misalnya
Jadi melihat kedua iterator kita dapat dengan mudah membedakan perbedaan keduanya.
Jadi jika kita mencoba untuk mengulangi objek normal, maka itu akan memberi kita kesalahan misalnya-
Sekarang untuk iterating over kita perlu mendefinisikan ES6 Symbol.iterator misalnya
Inilah perbedaan antara For in dan For of . Berharap itu bisa menghapus perbedaan.
sumber
Perbedaan lain antara kedua loop, yang belum pernah disebutkan sebelumnya:
Sumber
Jadi jika kita ingin menggunakan destructure dalam satu loop, untuk mendapatkan kedua indeks dan nilai setiap elemen array , kita harus menggunakan
for...of
loop dengan metode Arrayentries()
:sumber
for each...in
sudah usang (poin pertama), tetapi saya tidak menulis tentang itu ... Saya menulis bahwa "Destrukturisasifor...in
sudah ditinggalkan. Gunakanfor...of
saja." (poin kedua): developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Apakah Anda setuju dengan saya @GalMargalit?Semua orang memang menjelaskan mengapa masalah ini terjadi, tetapi masih sangat mudah untuk melupakannya dan kemudian menggaruk kepala Anda mengapa Anda mendapat hasil yang salah. Terutama ketika Anda sedang mengerjakan set data besar ketika hasilnya tampak baik-baik saja pada pandangan pertama.
Menggunakan
Object.entries
Anda memastikan untuk melewati semua properti:sumber
Saya melihat banyak jawaban bagus, tetapi saya memutuskan untuk menggunakan 5 sen hanya untuk mendapatkan contoh yang bagus:
Untuk dalam lingkaran
iterates atas semua alat peraga enumerable
Untuk loop
iterates atas semua nilai iterable
sumber
Ketika saya pertama kali mulai mempelajari for and in loop , saya juga bingung dengan output saya, tetapi dengan beberapa penelitian dan pemahaman Anda dapat memikirkan loop individual seperti berikut: The
let profile = { name : "Naphtali", age : 24, favCar : "Mustang", favDrink : "Baileys" }
Kode di atas hanya membuat objek yang disebut profil , kita akan menggunakannya untuk kedua contoh kita , jadi, jangan bingung ketika Anda melihat objek profil pada contoh, ketahuilah itu dibuat.
untuk ... dari loop * dapat mengembalikan properti , nilai atau keduanya , Mari kita lihat caranya. Dalam javaScript, kita tidak bisa mengulangi objek secara normal seperti pada array, jadi, ada beberapa elemen yang bisa kita gunakan untuk mengakses salah satu dari pilihan kita dari suatu objek.
Object.keys ( objek-nama-berjalan-di sini ) >>> Mengembalikan kunci atau properti suatu objek.
Nilai Objek ( object-name-goes-here ) >>> Mengembalikan nilai suatu objek.
Di bawah ini adalah contoh penggunaannya, perhatikan Object.entries () :
sumber
The
for-in
loopfor-in
loop digunakan untuk melintasi properti enumerable dari koleksi, dalam urutan acak . Koleksi adalah objek tipe wadah yang itemnya dapat menggunakan indeks atau kunci.for-in
loop mengekstraksi properti enumerable ( kunci ) koleksi sekaligus dan beralih satu per satu. Properti enumerable adalah properti koleksi yang dapat muncul dalamfor-in
loop.Secara default, semua properti dari Array dan Object muncul dalam
for-in
loop. Namun, kita bisa menggunakan metode Object.defineProperty untuk mengonfigurasi properti koleksi secara manual.Dalam contoh di atas, properti
d
darimyObject
dan indeks3
darimyArray
tidak muncul dalamfor-in
lingkaran karena mereka dikonfigurasi denganenumerable: false
.Ada beberapa masalah dengan
for-in
loop. Dalam kasus Array,for-in
loop juga akan mempertimbangkanmethods
menambahkan pada array menggunakanmyArray.someMethod = f
sintaks, bagaimanapun,myArray.length
tetap4
.The
for-of
loopIni adalah kesalahpahaman bahwa
for-of
loop mengulangi nilai-nilai koleksi.for-of
loop berulang di atasIterable
objek. Iterable adalah objek yang memiliki metode dengan namaSymbol.iterator
langsung di atasnya satu-satu prototipe.Symbol.iterator
Metode harus mengembalikan Iterator . Iterator adalah objek yang memilikinext
metode. Metode ini ketika dipanggil kembalivalue
dandone
properti.Ketika kita mengulangi objek iterable menggunakan
for-of
loop,Symbol.iterator
metode akan dipanggil setelah mendapatkan objek iterator . Untuk setiap iterasifor-of
loop,next
metode objek iterator ini akan dipanggil sampaidone
dikembalikan olehnext()
panggilan mengembalikan false. Nilai yang diterima olehfor-of
loop untuk setiap iterasi jikavalue
properti dikembalikan olehnext()
panggilan.The
for-of
loop baru dalam ES6 dan begitu adalah Iterable dan Iterables . TheArray
tipe konstruktor memilikiSymbol.iterator
metode pada prototipe. TheObject
konstruktor sayangnya tidak memilikinya tetapiObject.keys()
,Object.values()
danObject.entries()
metode mengembalikan iterable ( Anda dapat menggunakanconsole.dir(obj)
untuk memeriksa metode prototipe ). Keuntungan darifor-of
loop adalah bahwa objek apa pun dapat dibuat iterable, bahkan customDog
danAnimal
kelas Anda.Cara mudah untuk membuat objek dapat diubah adalah dengan mengimplementasikan ES6 Generator alih-alih implementasi kustom iterator.
Tidak seperti
for-in
,for-of
loop dapat menunggu untuk menyelesaikan tugas async di setiap iterasi. Ini dicapai dengan menggunakanawait
kata kunci setelah dokumentasifor
pernyataan .Satu hal hebat tentang
for-of
loop adalah bahwa ia memiliki dukungan Unicode. Menurut spesifikasi ES6, string disimpan dengan pengkodean UTF-16. Karenanya, setiap karakter dapat mengambil salah satu16-bit
atau32-bit
. Secara tradisional, string disimpan dengan pengkodean UCS-2 yang memiliki dukungan untuk karakter yang dapat disimpan16 bits
hanya dalam .Karenanya,
String.length
mengembalikan jumlah16-bit
blok dalam string. Karakter modern seperti karakter Emoji membutuhkan 32 bit. Karenanya, karakter ini akan mengembalikanlength
2.for-in
loop berulang di atas16-bit
blok dan mengembalikan yang salahindex
. Namun,for-of
loop berulang atas karakter individu berdasarkan spesifikasi UTF-16.sumber
Saya menemukan penjelasan berikut dari https://javascript.info/array sangat membantu:
Salah satu cara tertua untuk menggilir item array adalah for loop over indexes:
Secara teknis, karena array adalah objek, juga dimungkinkan untuk digunakan untuk..in:
Pengulangan for..in mengulangi semua properti, tidak hanya yang numerik.
Ada yang disebut "array-like" objek di browser dan di lingkungan lain, yang terlihat seperti array. Yaitu, mereka memiliki properti panjang dan indeks, tetapi mereka mungkin juga memiliki properti dan metode non-numerik lainnya, yang biasanya tidak kita butuhkan. Loop for..in akan menampilkannya. Jadi jika kita perlu bekerja dengan objek mirip array, maka properti "ekstra" ini bisa menjadi masalah.
Loop for..in dioptimalkan untuk objek generik, bukan array, dan karenanya 10-100 kali lebih lambat. Tentu saja, masih sangat cepat. Speedup mungkin hanya penting dalam kemacetan. Tapi tetap saja kita harus mewaspadai perbedaannya.
Secara umum, kita seharusnya tidak menggunakan for..in untuk array.
sumber
Berikut adalah mnemonik yang berguna untuk mengingat perbedaan antara
for...in
Loop danfor...of
Loop."indeks, objek dari"
for...in Loop
=> mengulangi indeks dalam array.for...of Loop
=> iterates atas objek objek.sumber