JavaScript. Непонятный момент в отработке условия.
Добрый день всем.
JavaScript, полный курс с нуля до результата.Урок 2.10.
Вот исходный код урока:
let money = +prompt ("Ваш бюджет на месяц?", ""),
time = prompt ("Введите дату в формате YYYY-MM-DD", "");
let appData = {
budget: money,
timeData: time,
expenses: {},
optionalExpenses: {},
income: [],
savings: false
};
for (let i = 0; i < 2; i++) {
let a = prompt ("Введите обязательную статью расходов в этом месяце", ""),
b = prompt ("Во сколько обойдется?", "");
if ( typeof(a)==='string' && typeof(a) != null && typeof(b) != null && a != "" && b != "" && a.length < 50) {
console.log ("done");
appData.expenses[a] = b;
} else {
console.log ("bad result");
i--;
}
};
Первая проверка в условии - на соответствие строке. Причем в ходе урока сказано, что она необязательна. Что ж, я попробовал ее исключить. В итоге, если вопрос о статье расходов (переменная а ) был отменен клавишей ESC, т.е. в объект идет null, консоль выдает ошибку:
script.js:18 Uncaught TypeError: Cannot read property 'length' of null
at script.js:18
С этим все понятно: у null не может быть длины.
Дальше я пробую вывести проверку длины во вложенное условие:
for (let i = 0; i < 2; i++) {
let a = prompt("Введите обязательную статью расходов в этом месяце", ''),
b = prompt("Во сколько обойдется?", '');
if ( (typeof(a)) !== null && (typeof(b)) !== null && a != '' && b != '' ) {
if (a.length < 50) {
console.log("done");
appData.expenses[a] = b;
}
} else {
alert("Некорректные данные. Вернёмся к предыдущему вопросу");
i--;
}
}
И вот тут начинаются странности. Если первый вопрос пропускаем клавишей ESC, а на второй отвечаем (ОК), даже оставляя поле пустым, все отрабатывает нормально, скрипт просит вернуться к вопросу. Если наоборот - то же самое. но если оба вопроса отменяем ESC-пом, то получаем в консоль такое же сообщение об ошибке:
script.js:18 Uncaught TypeError: Cannot read property 'length' of null
at script.js:21.
Т.е. переменная а опять проверяется на длину.
Почему? Ведь если условие верхнего уровня провалило проверку, вложенное условие вообще не должно обрабатываться.
Сразу скажу, что возвращение проверки на соответствие строке снимает проблему.