0
0

Добрый день всем.

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.

Т.е. переменная а опять проверяется на длину.

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

Сразу скажу, что возвращение проверки на соответствие строке снимает проблему.


Дмитрий Овод
4 years ago






Добрый вечер.

Здесь дело в том, что условие  typeof(a) !== null && typeof(b) !== null будет выдавать true, так как null при строгой проверке на типы будет выдавать object. 

В этом случае лучше будет использовать такой код, где мы прямо проверяем на значение null

	if ( a != null && b != null && a != '' && b != '' ) {

		if (a.length < 50) {			
			console.log("done");
			appData.expenses[a] = b;
		}
		
	} else {
		  alert("Некорректные данные. Вернёмся к предыдущему вопросу");
		  i--;
	}
Иван Петриченко
4 years ago

Большое спасибо за совет!

Дмитрий Овод
4 years ago

2 ответов