Saat melakukan iterasi pada properti objek, apakah aman untuk menghapusnya saat berada dalam loop for-in?
Sebagai contoh:
for (var key in obj) {
if (!obj.hasOwnProperty(key)) continue;
if (shouldDelete(obj[key])) {
delete obj[key];
}
}
Dalam banyak bahasa lain melakukan iterasi pada larik atau kamus dan menghapus bagian dalamnya tidak aman. Apakah tidak masalah di JS?
(Saya menggunakan runtime Spidermonkey Mozilla.)
javascript
loops
object
properties
Joe Shaw
sumber
sumber
Jawaban:
Bagian standar ECMAScript 5.1 12.6.4 (pada loop for-in) mengatakan:
Jadi saya pikir sudah jelas bahwa kode OP itu legal dan akan berfungsi seperti yang diharapkan. Kebiasaan browser memengaruhi urutan iterasi dan pernyataan hapus secara umum, tetapi tidak apakah kode OP akan berfungsi. Biasanya yang terbaik adalah menghapus properti saat ini dalam iterasi - menghapus properti lain dalam objek secara tidak terduga akan menyebabkannya disertakan (jika sudah dikunjungi) atau tidak disertakan dalam iterasi, meskipun itu mungkin atau mungkin tidak menjadi perhatian tergantung pada situasi.
Lihat juga:
Tak satu pun dari ini benar-benar mempengaruhi kode OP.
sumber
Dari spesifikasi Javascript / ECMAScript (khususnya 12.6.4 Pernyataan for-in ):
sumber