Советы по отладке кода на примере циклов в JavaScript

Сейчас я научу вас методике поиска ошибок в коде. Представим себе, что вы по какому-то недоразумению не следовали советам из предыдущего урока и получили не работающий код. Давайте посмотрим, как найти ошибки и заставить его работать.

Многие начинающие пользуются неправильной методикой поиска. Они берут и смотрят на код, в надежде, что заметят ошибку. И так пару часов. Это так не работает.

Правильной методикой является вывод переменных в консоль и определения, то ли там лежит, что нужно, или нет. При этом начинать нужно от предполагаемого места проблемы и двигаться вверх по коду. Давайте посмотрим на практике.

Пусть для примера перед вами стояла задача перебрать массив с двухзначными числами и найти числа, у которых первая цифра на один больше второй. Пусть для простоты в массиве хранятся числа в виде строк.

Пусть вы решили задачу и получили следующий код:

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); // выдает 0

Код, однако, выдает 0. В этом случае первым делом нужно проверить,смотрим что в переменной попадает ли выполнения кода в иф. Выведим в нем что-нибудь в консоль:

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('!'); // ничего не выводит sum += elem; } } console.log(sum);

Так как в консоли ничего не появилось, это значит, что выполнения кода просто не заходит в условие. Посмотрим своими глазами, что же мы сравниваем:

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' и '11', '3' и '21' ... if (elem[0] === elem[1] + 1) { sum += elem; } } console.log(sum);

В результате сразу становится видным, что второе слагаемое двухзначное. Легко понять, что это из-за того, что единица прибавляется как строка. Исправим проблему:

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); // '021324354'

После исправления мы уже видим, что в переменной sum что-то появилось, хотя и некорректное. Видно, однако, что там лежит то, что нам нужно, но оно сложилось в виде строк, а не чисел. Исправим проблему:

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); // все работает

Исправьте ошибки, допущенные в следующем коде:

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