Massiivi läbimise viga for-in tsükliga JavaScriptis
Massiivi läbimiseks tuleks
kasutada tsüklit for-of.
Mõnikord aga teevad algajad ekslikult
katset kasutada tsüklit for-in.
Vaatame selle vea tunnusmärke.
Olgu meil massiiv:
let arr = ['a', 'b', 'c'];
Läbime selle massiivi elemendid ja kirjutame need ühele reale.
Mingi programmeerija on selle ülesande juba lahendanud,
kuid kasutas ekslikult tsüklit
for-in. Vaatame,
mida ta sai:
let res = '';
for (let elem in arr) {
res += elem;
}
console.log(res); // väljastab '012'
Niisiis, tulemuseks on string '012',
mitte 'abc'. Mõtleme välja, miks
nii juhtus.
Miks üldse läbitakse massiiv
läbi tsükli for-in? Asi on selles, et
massiiv on JavaScriptis objekti
erijuhtum. Seega on tegelikult
selles osas see korrektne kood. Kuid nii ei peaks
tegema.
Asi on selles, et for-in
võib teatud tingimustel kinnitada
liigset, ja peale massiivi elementide
satte läbimisel ka midagi muud parasiitset.
Läbige massiive ainult läbi for-of.
Mõtleme nüüd välja, miks me näeme
sellist kummalist tulemust. Asi on selles,
et läbimisel läbi for-in
lähevad muutujasse elem tegelikult
võtmed, hoolimata selle muutuja
nime segadust tekitavast nimetusest.
Parandame tehtud vea ja kirjutame korrektse koodi:
let arr = ['a', 'b', 'c'];
let res = '';
for (let elem of arr) {
res += elem;
}
console.log(res); // väljastab 'abc'