NodeList sekarang memiliki forEach () di semua browser utama
Lihat nodeList forEach () di MDN .
Jawaban asli
Tak satu pun dari jawaban ini menjelaskan mengapa NodeList tidak mewarisi dari Array, sehingga memungkinkan NodeList untuk memiliki forEach
dan yang lainnya.
Jawabannya ada di utas diskusi es ini . Singkatnya, ini merusak web:
Masalahnya adalah kode yang salah mengasumsikan instanceof yang berarti bahwa instance tersebut adalah Array dalam kombinasi dengan Array.prototype.concat.
Ada bug di Perpustakaan Penutupan Google yang menyebabkan hampir semua aplikasi Google gagal karena ini. Pustaka diperbarui segera setelah ditemukan, tetapi mungkin masih ada kode di luar sana yang membuat asumsi salah yang sama dikombinasikan dengan concat.
Artinya, beberapa kode melakukan sesuatu seperti
if (x instanceof Array) {
otherArray.concat(x);
} else {
doSomethingElseWith(x);
}
Namun, concat
akan memperlakukan larik "nyata" (bukan turunan dari Array) secara berbeda dari objek lain:
[1, 2, 3].concat([4, 5, 6])
[1, 2, 3].concat(4)
jadi itu berarti bahwa kode di atas rusak ketika x
menjadi NodeList, karena sebelum itu turun ke doSomethingElseWith(x)
jalur, sedangkan setelah itu turun ke otherArray.concat(x)
jalur, yang melakukan sesuatu yang aneh karena x
bukan array nyata.
Untuk beberapa waktu ada proposal untuk Elements
kelas yang merupakan subkelas Array yang sebenarnya, dan akan digunakan sebagai "NodeList baru". Namun, itu telah dihapus dari Standar DOM , setidaknya untuk saat ini, karena belum dapat diterapkan karena berbagai alasan teknis dan spesifikasi.