Ошибка в цикле while
По задумке цикл должен останавливаться,
если пользователь введет числовое значение,
но чувствую я где-то допустил ошибку. В чем моя ошибка?
let num = Number;
while(true){
let val = prompt('x' ,'');
if(val == num) break;
}
Ответы (1 шт):
Number - это объект, конструктор чисел. Само по себе ни одно число не может быть равным ему. Для проверки типа данных существует оператор typeof
console.log( typeof 15 == "number" ); // true
console.log( typeof NaN == "number" ); // true !
console.log( typeof "15" == "number" ); // false (это строка, хоть и хранит число)
Но prompt() всегда возвращает строку, даже если туда вводят число. Или null - если отменят.
! — Логическое "НЕ", превращает true → false и наоборот.
isNaN(val) пробует преобразовать переданный аргумент в число, и возвращает false, если получается.
Но isNaN("") и isNaN(null) тоже вернут false, потому что оба значения успешно преобразуются в число 0. Если хочется прервать цикл, если ничего не введут, достаточно проверки if ( !isNaN(val) ) break;
while (true){
let val = prompt('x' ,'');
console.log(val);
if( val && val.trim() && !isNaN(val) ) break;
// 1 2 3
// 1. отсеит null и пустую строку (в логическом контексте они == false)
// 2. отсеит строку из пробелов " " ( иначе isNaN его тоже посчитает как 0 )
// 3. Введут число - вернет false → станет true → сработает break
}
isFinite и isNaN какая между ними разница?
isFinite Отсеивает бесконечность:
console.log( !isNaN(15), isFinite(15) ); // true true
console.log( !isNaN(""), isFinite("") ); // true true
console.log( !isNaN(null), isFinite(null) ); // true true
console.log( !isNaN("15"), isFinite("15") ); // true true
console.log( !isNaN(Infinity), isFinite(Infinity) ); // true false
console.log( !isNaN(1/0), isFinite(1/0) ); // true false