Pertama-tama, jangan pernah menggunakan for inloop 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_0yang 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 inkerjanya 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 inmenghitung melalui bidang objek, bukan hanya indeks numerik. Jadi kita sekarang menghitung melalui setiap indeks numerik dan filter_0 . Tetapi filter_0bukan bidang objek array tertentu, setiap objek array memiliki properti ini sekarang.
Untungnya, semua objek memiliki hasOwnPropertymetode, 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 indan for each inuntuk array. Ingat bahwa for inmenghitung 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)