Dengan 2 fungsi di bawah ini, addtoObj mencatat 'halo' 1 kali tetapi addToArr mencatat 'halo' 4 kali yang saya harapkan juga berlaku untuk objek. Mengapa 'halo' hanya dicatat sekali untuk addtoObj?

let addToObj = () => {
  const obj = { 0: true };
  const add = [1, 2, 3];

  for (let key in obj) {
    console.log('hello');
    for (const j of add) {
      if (!obj[j]) {
        obj[j] = true;
      }
    }
  }
};
addToObj()
let addToArr = () => {
  const arr = [0];
  const add = [1, 2, 3];

  for (let i = 0; i < arr.length; i++) {
    console.log('hello');
    for (const j of add) {
      if (!arr[j]) {
        arr.push(j);
      }
    }
  }
};
addToArr();
1
tausabao 10 April 2020, 00:35

1 menjawab

Jawaban Terbaik

Sementara loop for "konvensional" memeriksa kondisinya setelah setiap iterasi, loop for in mungkin memanggil Object.keys(obj) saat dimulai, lalu tidak akan mengevaluasi ulang nilai ini (bahkan saat baru kunci ditambahkan).

Dari dokumentasi JS:

Secara umum, yang terbaik adalah tidak menambah, mengubah, atau menghapus properti dari objek selama iterasi, selain properti yang sedang dikunjungi. Tidak ada jaminan apakah properti yang ditambahkan akan dikunjungi, apakah properti yang dimodifikasi (selain yang sekarang) akan dikunjungi sebelum atau setelah diubah, atau apakah properti yang dihapus akan dikunjungi sebelum dihapus.

0
GalAbra 9 April 2020, 21:41