for...in
Pernyataan for...in
mengulang setiap properti enumerable dari sebuah objek, dalam urutan sembarang. Untuk setiap properti yang berbeda, pernyataan dapat dieksekusi.
Sintak
for (variable in object) {... }
variable
- Sebuah nama properti yang berbeda ditugaskan untuk variabel pada setiap iterasi.
object
- Objek yang propertinya enumerable yang diiterasi.
Deskripsi
Perulangan for...in
hanya mengiterasi pada properti enumerable. Objek yang dibuat dari built-in konstruktor seperti Array dan Object telah mewarisi properti non-enumerable dari Object.prototype
dan String.prototype
, seperti String
's indexOf()
metode atau Object
's toString()
(en-US) metode. Perulangan akan iterate atas semua properti enumerable dari objek itu sendiri dan mereka objek mewarisi dari prototipe konstruktor ini (properti lebih dekat ke objek di properti mata rantai prototipe menggantikan prototipe' properti).
Penghapusan, penambahan atau perubahan pada properti
Perulangan for...in
mengiterasi properti suatu objek dalam urutan sembarang
(lihat delete
(en-US) Operator untuk lebih lanjut tentang mengapa salah satu tidak dapat bergantung pada keteraturan tampak dari iterasi, setidaknya dalam pengaturan lintas-browser). Jika properti yang diubah dalam satu iterasi dan kemudian mengunjungi di lain waktu, nilainya dalam lingkaran adalah nilai pada waktu kemudian. Sebuah properti yang dihapus sebelum telah dikunjungi tidak akan dikunjungi nanti. Sifat ditambahkan ke objek dimana iterasi terjadi baik dapat dikunjungi atau dihilangkan dari iterasi. Secara umum yang terbaik adalah tidak untuk menambah, mengubah atau menghapus properti dari objek selama iterasi, selain properti saat ini sedang mengunjungi. Tidak ada jaminan apakah properti menambahkan akan dikunjungi, apakah properti dimodifikasi (selain yang saat ini) akan dikunjungi sebelum atau setelah dimodifikasi, atau apakah properti dihapus akan dikunjungi sebelum dihapus.
Iterasi Array dan for...in
Catatan: for...in
tidak perlu digunakan untuk mengiterasi sebuah Array
dimana urutan indeksnya sangat penting.
Index array hanyalah properti enumerable dengan nama integer dan tidak sama dengan properti Objek pada umumnya. Disini tidak akan menjamin jika for...in
akan mengembalikan indek pada urutan tertentu. Pernyataan for...in
akan mengembalikan semua properti enumerable, termasuk didalamnya dengan nama non–integer dan serta turunannya.
Karena urutan iterasi merupakan implementation-dependent, pengiterasian pada array mungkin tidak membaca elemen pada urutan yang urut. Karena itu lebih baik menggunakan perulangan for
(en-US) dengan menggunakan nomor indek (atau Array.prototype.forEach()
(en-US) atau for...of
(en-US) loop) ketika mengiterasi array dimana urutan akses sangat penting.
Iterasi hanya pada properti sendiri
Jika anda hanya ingin mempertimbangkan properti yang melekat pada objek itu sendri, dan bukan prototypes-nya, gunakan getOwnPropertyNames()
(en-US) atau lakukan hasOwnProperty()
(en-US) cek (propertyIsEnumerable
(en-US) juga dapat digunakan). Alternatifnya, jika anda tahu disana tidak ada campur tangan kode luar , anda dapat memperpanjang built-in prototypes dengan metode cek.
Contoh
Pada fungsi berikut menggunakan sebuah objek argumen. kemudian mengiterasi pada semua properti enumerable pada objek tersebut dan mengembalikan string dari nama properti dan nilainya.
var obj = {a:1, b:2, c:3};
for (var prop in obj) {
console.log("obj." + prop + " = " + obj[prop]);
}
// Output:
// "obj.a = 1"
// "obj.b = 2"
// "obj.c = 3"
Fungsi berikut mengiterasi menggunakan hasOwnProperty()
(en-US): properti turunannya tidak akan di tampilkan.
var triangle = {a:1, b:2, c:3};
function ColoredTriangle() {
this.color = "red";
}
ColoredTriangle.prototype = triangle;
var obj = new ColoredTriangle();
for (var prop in obj) {
if( obj.hasOwnProperty( prop ) ) {
console.log("obj." + prop + " = " + obj[prop]);
}
}
// Output:
// "obj.color = red"
Spesifikasi
Kompabilitas Browser
Fitur | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Dukungan dasar | (Yes) | (Yes) | 10 | (Yes) | (Yes) |
Fitur | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Dukungan dasar | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
Kompabilitas: Ekspresi Initializer
Pada SpiderMonkey 40 (Firefox 40 / Thunderbird 40 / SeaMonkey 2.37) atau sebelumnya, bisa menggunakan ekspersi initializer (i=0
) pada perulangan for...in
:
var obj = {a:1, b:2, c:3};
for(var i=0 in obj) {
console.log(obj[i]);
}
// 1
// 2
// 3
Perilaku non-standard ini sekarang diabaikan pada versi 40 dan selanjutnya akan disajikan dengan SyntaxError
("for-in loop head declarations may not have initializers") Peringatan pada konsole (bug 748550 dan bug 1164741).
Pada mesin lain seperti v8 (Chrome), Chakra (IE/Edge), dan JSC (WebKit/Safari) juga telah menyelidiki untuk menghapus perilaku non standar tersebut.
Lihat Juga
for...of
(en-US) - pernyataan serupa yang mengiterasi pada nilai (values) properti.for each in
- pernyataan serupa, namun mengiterasi pada nilai dari properti objek, daripada nama properti sendiri (Usang)for
(en-US)- Generator expressions (penggunaan sintak
for...in
) - Enumerability and ownership of properties
Object.getOwnPropertyNames()
(en-US)Object.prototype.hasOwnProperty()
(en-US)Array.prototype.forEach()
(en-US)