JavaScripti tsüklite silumise näidete abil
Praegu õpetan teile meetodit vigade otsimiseks koodis. Kujutagem ette, et te mingil mõistatusel ei järginud eelmise õppetüki nõuandeid ja said töötamata koodi. Vaatame, kuidas leida vigu ja panna seda tööle.
Paljud algajad kasutavad valesid otsingumeetodeid. Nad võtavad ja vaatavad koodi, lootes, et märkavad viga. Ja nii paar tundi. See ei tööta nii.
Õige meetod on muutujate väljastamine konsooli ja kindlaks tegemine, kas seal on see, mida vaja, või mitte. Samuti tuleks alustada eeldatavast probleemi kohast ja liikuda ülespoole koodi. Vaatame praktikas.
Olgu näiteks ees seisnud ülesanne itererida massiiv kahekohaliste numbritega ja leida numbrid, mille esimene number on ühe võrra suurem kui teine. Olgu lihtsuse mõttes massiivis hoitud numbrid stringidena.
Olgu, et lahendasite ülesande ja saite järgmise koodi:
let arr = ['21', '32', '34', '43', '45', '54', '55'];
let sum = 0;
for (let elem of arr) {
if (elem[0] === elem[1] + 1) {
sum += elem;
}
}
console.log(sum); // annab 0
Kood annab aga välja 0. Sel
juhul tuleb kõigepealt kontrollida,
kas me näeme, et muutujasse
sattub, kas koodi täitmine läheb if-i.
Väljastame selles konsooli midagi:
let arr = ['21', '32', '34', '43', '45', '54', '55'];
let sum = 0;
for (let elem of arr) {
if (elem[0] === elem[1] + 1) {
console.log('!'); // ei väljasta midagi
sum += elem;
}
}
console.log(sum);
Kuna konsoolis ei ilmunud midagi, tähendab see, et koodi täitmine lihtsalt ei lähe tingimusesse. Vaatame oma silmadega, mida me võrdleme:
let arr = ['21', '32', '34', '43', '45', '54', '55'];
let sum = 0;
for (let elem of arr) {
console.log(elem[0], elem[1] + 1); // '2' ja '11', '3' ja '21' ...
if (elem[0] === elem[1] + 1) {
sum += elem;
}
}
console.log(sum);
Tulemusena saab kohe nähtavaks, et teine liidetav on kahekohaline. On lihtne mõista, et see on tingitud sellest, et ühte liidetakse stringina. Parandame probleemi:
let arr = ['21', '32', '34', '43', '45', '54', '55'];
let sum = 0;
for (let elem of arr) {
if (+elem[0] === +elem[1] + 1) { // parandame
sum += elem;
}
}
console.log(sum); // '021324354'
Pärast parandust näeme juba, et
muutujas sum on midagi ilmunud,
kuigi ebakorrektset. On siiski näha,
et seal on see, mida vajame,
kuid see liitus stringidena,
mitte numbritena. Parandame probleemi:
let arr = ['21', '32', '34', '43', '45', '54', '55'];
let sum = 0;
for (let elem of arr) {
if (+elem[0] === +elem[1] + 1) {
sum += +elem; // parandame
}
}
console.log(sum); // kõik töötab
Parandage järgmises koodis tehtud vead:
let obj = {a: 10, b: 20, c: 30, d: 40, e: 50};
let sum = 0;
for (let elem in obj) {
if (elem[0] === '1' && elem[0] === '2') {
sum += +elem;
}
}
console.log(sum);