Rumah > Soal Jawab > teks badan
Huraian masalah tidak menyeluruh
Masalah saya ialah apabila tatasusunan saya ditakrifkan seperti berikut:
let a = [undefined, undefined]
a[9] = 1
console.log(a) //[undefined, undefined, undefined × 7, 1]
Adakah terdapat sebarang perbezaan antara yang dijana secara automatik tidak ditentukan di sini dan yang saya takrifkan
Mengapa saya tidak boleh melintasinya apabila saya menggunakan traversal terbina dalam?
a.forEach(it => console.log(it)) // 也只会有三个结果
某草草2017-07-05 10:52:19
Oleh kerana apa yang anda takrifkan ialah tatasusunan jarang (tatasusunan jarang, panjang tatasusunan lebih besar daripada bilangan elemen tatasusunan Anda boleh menggunakan in
untuk mengesan sama ada unsur tatasusunannya wujud:
'0' in a // true,索引存在.
'1' in a // true
'2' in a // false,索引不存在
'9' in a // true
Dan forEach
hanya akan merentasi elemen di mana indeks asal wujud.
过去多啦不再A梦2017-07-05 10:52:19
Adakah terdapat sebarang perbezaan antara yang dijana secara automatik tidak ditentukan di sini dan yang saya takrifkan?
Ini adalah perangkap tatasusunan, undefined ini bukanlah undefined. Yang dijana secara automatik dipanggil "slot kosong", dan chrome hanya menunjukkannya sebagai tidak ditentukan. Anda juga boleh melihat bahawa undefined sebenar adalah output satu demi satu, dan slot kosong mengeluarkan perkataan seperti "undefined × 7".
untukSetiap, peta dan seumpamanya akan melangkau slot kosong. Sila rujuk penyelesaian
console.log(Array.from(a))
淡淡烟草味2017-07-05 10:52:19
Oleh kerana forEach ditulis seperti ini, forEach terbina dalam akan diteruskan apabila ia menemui undefined
Anda boleh menulis sendiri versi tidak melangkau
漂亮男人2017-07-05 10:52:19
Anda boleh memikirkan masalah ini dari sudut lain:
var a = [1,2,3,4]
padam a[0]
console.log(a)//[undefined × 1, 2, 3, 4]
a.length//4
a.forEach(it=>console.log(it))// 2 3 4
Berbalik kepada soalan, apabila forEach dikapsulkan, "undefined" ini akan dilangkau, anda boleh menulis semula ia Cuba kaedah ini, tidak kira berapa nilainya, ia sepatutnya boleh dicetak seperti biasa