Masyvo iteravimo for-in ciklu klaida JavaScript
Masyvo iteravimui reikėtų
naudoti ciklą for-of.
Kartais, tačiau, pradedantieji klaidingai
bando taikyti ciklą for-in.
Pažiūrėkime į būdingus šios klaidos
požymius.
Tarkime, kad turime masyvą:
let arr = ['a', 'b', 'c'];
Išskleiskime šio masyvo elementus ir surašykime juos į vieną eilutę.
Kažkoks programuotojas jau išsprendė šią užduotį,
bet klaidingai panaudojo ciklą
for-in. Pažiūrėkime,
ką jam gavosi:
let res = '';
for (let elem in arr) {
res += elem;
}
console.log(res); // išves '012'
Taigi, rezultate gaunama eilutė '012',
o ne 'abc'. Išsiaiškinkime, kodėl
taip atsitiko.
Kodėl apskritai masyvas buvo iteruojamas
ciklu for-in? Esmė ta, kad
masyvas JavaScript yra ypatingas
objekto atvejis. Todėl iš tikrųjų
šiuo požiūriu tai yra korektiškas kodas. Bet taip daryti
ne rekomenduojama.
Esmė ta, kad for-in
tam tikromis sąlygomis gali "prikabinti"
per daug, ir jūs, be masyvo elementų,
iteracijos metu gausite dar kažką parazitinio.
Masyvus iteruokite tik naudodami for-of.
Dabar išsiaiškinkime, kodėl matome
tokį keistą rezultatą. Esmė ta,
kad iteruojant naudojant for-in
į kintamąjį elem iš tikrųjų
patenka raktai, nepaisant
klaidinančio šio kintamojo pavadinimo.
Ištaisykime padarytą klaidą ir parašykime korektišką kodą:
let arr = ['a', 'b', 'c'];
let res = '';
for (let elem of arr) {
res += elem;
}
console.log(res); // išves 'abc'