Нужна помощь с кодом
Есть работающий код. Условия работают, но когда хочу вывести предупреждение: если ничего не ввести то во пусть выведет ошибка if (myAge === NaN) {alert ("Wrong")} у меня не работает. В чем проблема?
HTML
<input id="age" placeholder="Enter Your Age">
<button id="press">Перевірити мій вік</button>
JS
let pressing = document.getElementById('press');
pressing.onclick = function checkAge () {
let check = document.getElementById('age');
let myAge = check.value;
if(myAge < 18){
alert('You are so young for this site');
}
if (myAge >= 18){
alert('Welcome to our site');
}
}
Ответы (2 шт):
Попробуйте использовать метод Number.isNaN(...) для проверки на NaN
if (!Number.isNaN(myAge)) {
alert("Wrong");
}
Ещё замечу, что данные из всех инпутов возвращаются в строковом формате и надо приводить их к числу. Обычно делают так: let myAge = +check.value;. Но есть и другие способы.
Это особенность арифметики с плавающей точкой*). Специальное значение NaN не равно никакому другому значению, даже самому себе. Результат следующих выражений есть false:
const nan = NaN;
console.log( nan < 0 );
console.log( nan === 0 );
console.log( nan > 0 );
console.log( nan < nan );
console.log( nan === nan );
console.log( nan > nan );
Но результат следующих выражений есть true:
const nan = NaN;
console.log( nan !== nan );
console.log( isNaN(nan) );
console.log( Number.isNaN(nan) );
console.log( Object.is(nan, NaN) );
*) Стандарт арифметики с плавающей точкой IEEE 754-2008 помимо всего прочего определяет операции сравнения над числами с плавающей точкой (1.3):
This standard specifies:
[...]
― Addition, subtraction, multiplication, division, fused multiply add, square root, compare, and other operations.
Должна быть возможность сравнить два числа с плавающей точкой между собой. Причём возможны четыре взаимоисключающих отношения: меньше (less than), равно (equal), больше (greater than) и неупорядочено (unordered). Отношение «неупорядочено» возникает в том случае, если по крайней мере один из сравниваемых операндов — NaN. Он должен быть неупорядочен при сравнении с любым числом с плавающей точкой, даже при сравнении с самим собой. 5.11:
For every supported arithmetic format, it shall be possible to compare one floating-point datum to another in that format (see 5.6.1). Additionally, floating-point data represented in different formats shall be comparable as long as the operands’ formats have the same radix.
Four mutually exclusive relations are possible: less than, equal, greater than, and unordered. The last case arises when at least one operand is
NaN. EveryNaNshall compare unordered with everything, including itself. Comparisons shall ignore the sign of zero (so+0 = −0). Infinite operands of the same sign shall compare equal.
Один из способов, которым язык может предоставить возможность сравнить два числа с плавающей точкой — это специальные предикаты, возвращающие true/false в зависимости от того в каком из четырёх вышеописанных отношений находятся два сравниваемых числа с плавающей точкой. 5.11:
Languages define how the result of a comparison shall be delivered, in one of two ways: either as a relation identifying one of the four relations listed above, or as a true-false response to a predicate that names the specific comparison desired.
Каждый предикат должен возвращать истину тогда, когда истинно любое из обозначаемых им отношений. В стандарте в виде таблиц представлены названия предикатов, несколько вариантов операторов, которыми в языках программирования могут обозначаться данные предикаты и списки отношений для каждого предиката, при истинности любого из которых, тот или иной предикат должен возвращать true. 5.11:
Table 5.1, Table 5.2, and Table 5.3 exhibit twenty-two functionally distinct useful predicates and negations with various ad-hoc and traditional names and symbols. Each predicate is true if any of its indicated relations is true. The relation “?” indicates an unordered relation.
Таблица 5.1:
Из таблицы видно, что предикат compareQuietEqual, который в некоторых языках программирования обозначается символом = (а в некоторых ==, или даже ===), должен возвращать true, если сравниваемые числа с плавающей точкой находятся в отношении равно (EQ, equal).
А предикат compareQuietNotEqual должен возвращать true, если сравниваемые числа находятся в одном из следующих отношений: меньше (LT, less than), больше (GT, greater than) или неупорядочено (UN, unordered).
Так как NaN неупорядочен при сравнении с любым числом с плавающей точкой (даже с самим собой), то предикат compareQuietEqual всегда вернёт false, если по крайней мере один из операндов — NaN. Предикат compareQuietNotEqual в свою очередь вернёт true.
Таблица 5.3:
Из неё видно, что предикаты вида «больше», «больше либо равно», «меньше», «меньше либо равно» всегда вернут false, если хотябы один из операндов — NaN.
Теперь открываем ECMAScript 2020 Language Specification.
Смотрим пункт 4.3.20 Number value:
Number value
primitive value corresponding to a double-precision 64-bit binary format IEEE 754-2019 value
Note
A Number value is a member of the Number type and is a direct representation of a number.
NaN
Number value that is an IEEE 754-2019 “Not-a-Number” value
Видим, что значения числового типа, включая NaN — это числа с плавающей точкой формата IEEE 754-2019. Ранее в ответе я ссылался на стандарт IEEE 754-2008 (у меня нет текста более нового стандарта), но каких-либо изменений между этими двумя стандартами, оказывающих влияние на ECMA-262, нет. G Bibliography / 1:
Note
There are no normative changes betweenIEEE 754-2008andIEEE 754-2019that affect the ECMA-262 specification.
Посмотрим, например, как работает оператор строгого сравнения === для числового типа. 7.2.16 Strict Equality Comparison:
The comparison
x === y, wherexandyare values, producestrueorfalse. Such a comparison is performed as follows:
[...]
IfType(x)is Number or BigInt, then
Return !Type(x)::equal(x, y).
Смотрим, как работает Number::equal(x, y) (6.1.6.1.13):
- If x is NaN, return false.
- If y is NaN, return false.
- If x is the same Number value as y, return true.
- If x is +0 and y is -0, return true.
- If x is -0 and y is +0, return true.
- Return false.
Написано другими словами, но алгоритм соответствует IEEE 754-2008 предикату compareQuietEqual.
Смотрим, как работает Number::lessThan(x y), который используется при сравнении чисел оператором < (6.1.6.1.12):
- If x is NaN, return undefined.
- If y is NaN, return undefined.
- If x and y are the same Number value, return false.
- If x is +0 and y is -0, return false.
- If x is -0 and y is +0, return false.
- If x is +∞, return false.
- If y is +∞, return true.
- If y is -∞, return false.
- If x is -∞, return true.
- If the mathematical value of x is less than the mathematical value of y—note that these mathematical values are both finite and not both zero—return true. Otherwise, return false.
C учётом того, что значение undefined (которое возвращается, если один из операндов NaN, что "подозрительно" похоже на unordered в IEEE 754-2008) в дальнейшем при вычислении < преобразуется в false, получем, что алгоритм работы оператора < для числовых операндов соответствует предикату compareQuietLess, хотя и описан другими словами.

