Зацикливание while при вводе строки через prompt

174
06 августа 2018, 17:10

Есть две переменные, в которые записываются данные:

let finance = +prompt('Ваш бюджет?');
while (finance === "" || isNaN(finance) || finance === null) {
    let finance = prompt('Ваш бюджет?');
}
let name = prompt('Название вашего магазина?');
while (name == "" || name == null) {
    let name = prompt('Название вашего магазина?');
}

При вводе в первую переменную все записывается без проблем. Во вторую тоже, но если при вводе во вторую переменную сначала нажать "Отмена" или "Ок" и потом ввести без ошибок, то она зацикливается и скрипт не идет дальше, хотя первая переменная работает нормально. В чем проблема?

Answer 1

Проблема в лишнем let.

Так как с использованием этого ключевого слова область видимости ограничена блоком, а не функцией - значение введенное внутри цикла никак не совпадает с тем, что проверяется в условии.

Почему не зацикливается в первом случае?

Так как используется унарный оператор + - результат prompt сразу приводится к числу.

Приведение к числу работает согласно таблице в которой отмечено, что в случае null результатом будет +0, пустая строка, либо строка только из пробелов будет приведена к 0.

Поэтому при нажатии отмены или вводе пустой строки ни одно из условий не выполняется.

Стоит отметить, что при вводе строки, которую невозможно привести к числу в первом случае так же будет зацикливание, так как результат приведения в этом случае будет NaN.

READ ALSO
iOS. stackNavigator. отследить нажатие кнопки назад

iOS. stackNavigator. отследить нажатие кнопки назад

Разрабатывается приложение на react native под ios и возникла следующая проблема: Нужно в личной кабинете сделать редактирование полейПредполагается,...

176
Остановить .animate числа. JQuery

Остановить .animate числа. JQuery

Есть задача сделать уменьшение скидки по времени при открытии модального окнаПри закрытии модального окна скидка должна останавливаться...

143
Можно ли сменить бинд кнопки мышки (JS)?

Можно ли сменить бинд кнопки мышки (JS)?

Есть ссылка, самая обычнаяДопустим:

151