Apakah "for ... in" loop dalam Javascript loop melalui hashtables / elemen dalam urutan mereka dinyatakan? Apakah ada peramban yang tidak melakukannya secara berurutan?
Objek yang ingin saya gunakan akan dideklarasikan sekali dan tidak akan pernah dimodifikasi.
Misalkan saya punya:
var myObject = { A: "Hello", B: "World" };
Dan saya selanjutnya menggunakannya dalam:
for (var item in myObject) alert(item + " : " + myObject[item]);
Dapatkah saya berharap 'A: "Hello"' selalu datang sebelum 'B: "World"' di sebagian besar browser yang layak?
javascript
for-loop
chakrit
sumber
sumber
Jawaban:
Mengutip John Resig :
Semua browser mematuhi urutan definisi dengan pengecualian Chrome dan Opera yang berlaku untuk setiap nama properti non-numerik. Dalam dua browser ini properti ditarik secara berurutan di depan properti non-numerik pertama (ini ada hubungannya dengan bagaimana mereka mengimplementasikan array). Urutannya sama
Object.keys
juga.Contoh ini harus menjelaskan apa yang terjadi:
Teknisnya kurang penting daripada fakta bahwa ini dapat berubah setiap saat. Jangan mengandalkan hal-hal seperti ini.
Singkatnya: Gunakan array jika pesanan penting bagi Anda.
sumber
Menabrak ini setahun kemudian ...
Ini adalah tahun 2012 dan browser utama masih berbeda:
Intisari atau uji di browser saat ini
Safari 5, Firefox 14
Chrome 21, Opera 12, Node 0.6, Firefox 27
IE9
sumber
delete
menarik karena setidaknya dalam V8, itu langsung menyebabkan objek didukung oleh tabel hash. Namun, tabel hash di V8 menyimpan dalam urutan penyisipan. Hasil yang paling menarik di sini adalah IE, saya bertanya-tanya bagaimana kejelekan yang mereka lakukan untuk melakukan itu ...Dari Spesifikasi Bahasa Naskah ECMAS, bagian 12.6.4 (di
for .. in
loop):Dan bagian 4.3.3 (definisi "Objek"):
Saya kira itu berarti Anda tidak dapat mengandalkan properti yang disebutkan dalam urutan yang konsisten di seluruh implementasi JavaScript. (Lagi pula, itu akan menjadi gaya yang buruk untuk bergantung pada perincian khusus implementasi suatu bahasa.)
Jika Anda ingin pesanan Anda ditentukan, Anda perlu mengimplementasikan sesuatu yang mendefinisikannya, seperti array kunci yang Anda urutkan sebelum mengakses objek dengannya.
sumber
Elemen dari objek yang untuk / dalam penghitungan adalah properti yang tidak memiliki set flag DontEnum. ECMAScript, alias Javascript, standar secara eksplisit mengatakan bahwa "Suatu Objek adalah kumpulan properti yang tidak terurut" (lihat http://www.mozilla.org/js/language/E262-3.pdf bagian 8.6).
Ini tidak akan menjadi standar yang sesuai (yaitu aman) untuk mengasumsikan semua implementasi Javascript akan disebutkan dalam urutan deklarasi.
sumber
Urutan perulangan juga bingung sehubungan dengan penghapusan properti, tetapi dalam hal ini hanya dengan IE.
Keinginan untuk mengubah spesifikasi untuk memperbaiki urutan iterasi tampaknya menjadi keinginan yang cukup populer di kalangan pengembang jika diskusi di http://code.google.com/p/v8/issues/detail?id=164 adalah indikasi.
sumber
di IE6, pesanannya tidak dijamin.
sumber
Pesanan tidak dapat dipercaya. Baik Opera dan Chrome mengembalikan daftar properti yang tidak diurusi.
Kode di atas menunjukkan B, A, C di Opera dan C, A, B di Chrome.
sumber
Ini tidak menjawab pertanyaan itu sendiri, tetapi menawarkan solusi untuk masalah dasar.
Dengan asumsi bahwa Anda tidak dapat bergantung pada pesanan untuk disimpan, mengapa tidak menggunakan array objek dengan kunci dan nilai sebagai properti?
Sekarang, terserah Anda untuk memastikan bahwa kunci-kunci itu unik (dengan anggapan bahwa ini juga penting bagi Anda. Selain itu, mengatasi perubahan secara langsung, dan untuk (... dalam ...) sekarang mengembalikan indeks sebagai 'kunci'.
Lihat Pena untuk (... dalam ...) yang diatasi secara berurutan oleh JDQ ( @JDQ ) pada CodePen .sumber