Ошибка в цикле while

По задумке цикл должен останавливаться,

если пользователь введет числовое значение,

но чувствую я где-то допустил ошибку. В чем моя ошибка?

let num = Number;


while(true){
let val = prompt('x' ,'');  
if(val == num) break;   
}


Ответы (1 шт):

Автор решения: OPTIMUS PRIME

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

→ Ссылка