Nasveti za razhroščevanje kode na primeru zank v JavaScript

Zdaj vas bom naučil metodologije iskanja napak v kodi. Predstavljajmo si, da iz kakšnega nesporazuma niste sledili nasvetom iz prejšnje lekcije in ste dobili nedelujočo kodo. Poglejmo, kako najti napake in jo prisiliti delovati.

Mnogi začetniki uporabljajo napačno metodologijo iskanja. Vzamejo in gledajo kodo, v upanju, da bodo opazili napako. In tako nekaj ur. Tako ne deluje.

Pravilna metodologija je izpisovanje spremenljivk v konzolo in ugotavljanje, ali je tam tisto, kar mora biti, ali ne. Pri tem morate začeti od predvidenega mesta težave in se premikati navzgor po kodi. Poglejmo v praksi.

Vzemimo za primer, da je bila pred vami naloga prebrati matriko z dvomestnimi števili in najti števila, pri katerih je prva številka za ena večja od druge. Za enostavnost naj bodo v matriki shranjena števila v obliki nizov.

Recimo, da ste rešili težavo in dobili naslednjo kodo:

javascriptlet 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); // vrne 0

Vendar koda vrne 0. V tem primeru je treba najprej preveriti, ali izvajanje kode sploh pride v if stavek. Izpišimo nekaj v konzolo znotraj njega:

javascriptlet arr = ['21', '32', '34', '43', '45', '54', '55'];
let sum = 0;

for (let elem of arr) {
  if (elem[0] === elem[1] + 1) {
    console.log('!'); // ne izpiše ničesar
    sum += elem;
  }
}

console.log(sum);

Ker se v konzoli ni pojavilo nič, to pomeni, da izvajanje kode preprosto ne pride v pogoj. Poglejmo z lastnimi očmi, kaj primerjamo:

javascriptlet arr = ['21', '32', '34', '43', '45', '54', '55'];
let sum = 0;

for (let elem of arr) {
  console.log(elem[0], elem[1] + 1); // '2' in '11', '3' in '21' ...
  
  if (elem[0] === elem[1] + 1) {
    sum += elem;
  }
}

console.log(sum);

Kot rezultat takoj postane vidno, da je drugi del dvomesten. Zlahka je razumeti, da je to zaradi tega, ker se enota prišteje kot niz. Popravimo težavo:

javascriptlet arr = ['21', '32', '34', '43', '45', '54', '55'];
let sum = 0;

for (let elem of arr) {
  if (+elem[0] === +elem[1] + 1) { // popravimo
    sum += elem;
  }
}

console.log(sum); // '021324354'

Po popravku že vidimo, da se je v spremenljivki sum nekaj pojavilo, čeprav nekorektno. Vendar je videti, da je tam tisto, kar potrebujemo, vendar se je seštelo v obliki nizov, ne števil. Popravimo težavo:

javascriptlet arr = ['21', '32', '34', '43', '45', '54', '55'];
let sum = 0;

for (let elem of arr) {
  if (+elem[0] === +elem[1] + 1) {
    sum += +elem; // popravimo
  }
}

console.log(sum); // vse deluje
Задание 1

Popravite napake, narejene v naslednji kodi:

javascriptlet 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);