Pertama-tama, jangan pernah menggunakan for in
loop untuk menghitung lebih dari satu array. Tidak pernah. Pakai tua yang bagus for(var i = 0; i<arr.length; i++)
.
Alasan di balik ini adalah sebagai berikut: setiap objek dalam JavaScript memiliki bidang khusus yang disebut prototype
. Segala sesuatu yang Anda tambahkan ke bidang itu akan dapat diakses pada setiap objek jenis itu. Misalkan Anda ingin semua array memiliki fungsi baru yang keren yang disebut filter_0
yang akan menyaring nol.
Array.prototype.filter_0 = function() {
var res = [];
for (var i = 0; i < this.length; i++) {
if (this[i] != 0) {
res.push(this[i]);
}
}
return res;
};
console.log([0, 5, 0, 3, 0, 1, 0].filter_0());
//prints [5,3,1]
Ini adalah cara standar untuk memperluas objek dan menambahkan metode baru. Banyak perpustakaan melakukan ini. Namun, mari kita lihat cara for in
kerjanya sekarang:
var listeners = ["a", "b", "c"];
for (o in listeners) {
console.log(o);
}
//prints:
// 0
// 1
// 2
// filter_0
Apakah kamu lihat? Tiba-tiba berpikir filter_0 adalah indeks array lain. Tentu saja, ini bukan benar-benar indeks numerik, tetapi for in
menghitung melalui bidang objek, bukan hanya indeks numerik. Jadi kita sekarang menghitung melalui setiap indeks numerik dan filter_0
. Tetapi filter_0
bukan bidang objek array tertentu, setiap objek array memiliki properti ini sekarang.
Untungnya, semua objek memiliki hasOwnProperty
metode, yang memeriksa apakah bidang ini benar-benar milik objek itu sendiri atau jika itu hanya diwarisi dari rantai prototipe dan dengan demikian milik semua objek jenis itu.
for (o in listeners) {
if (listeners.hasOwnProperty(o)) {
console.log(o);
}
}
//prints:
// 0
// 1
// 2
Perhatikan, bahwa meskipun kode ini berfungsi seperti yang diharapkan untuk array, Anda tidak boleh, tidak pernah , menggunakan for in
dan for each in
untuk array. Ingat bahwa for in
menghitung bidang objek, bukan indeks array atau nilai.
var listeners = ["a", "b", "c"];
listeners.happy = "Happy debugging";
for (o in listeners) {
if (listeners.hasOwnProperty(o)) {
console.log(o);
}
}
//prints:
// 0
// 1
// 2
// happy
if (evtListeners.hasOwnProperty(ind))
untuk membatasi pemrosesan hanya untuk memiliki properti (tidak diwariskan). Namun, dalam beberapa kasus Anda benar-benar ingin mengulang semua properti, termasuk yang diwarisi. Dalam hal itu, JSLint memaksa Anda untuk membungkus loop body dalam pernyataan if untuk memutuskan properti mana yang benar-benar Anda inginkan. Ini akan berhasil dan membuat JSlint senang:if (evtListeners[ind] !== undefined)