Почему JavaScript говорит, что число не является числом?
У меня есть фрагмент кода JavaScript, который, как ожидается, задает целочисленное значение переменной.
Что-то сломано, поэтому, когда я пытаюсь сделать alert(A);
, он возвращает NaN
. isNaN(A);
возвращает true. Но если я alert(typeof(A));
, то он говорит number
.
Итак, как переменная может быть числом, а не числом в одно и то же время? Возможно, я неправильно понял, что такое NaN?
Изменить: благодаря ответам, я вижу, что я ошибался, потому что:
- Тип
NaN
- number
,
-
NaN
означает "не число", это не то же самое, что "не типа number
",
-
0/0
является хорошим примером NaN
: он по-прежнему является числом, но JavaScript (и никто другой) не может сказать, что представляет собой действительное значение нуля, деленное на ноль. 1/0
, с другой стороны, возвращает Infinity
, который не является NaN
.
Ответы
Ответ 1
Как я понимаю, NaN
- это дозорный экземпляр класса Number
, который представляет, ну точно, что он обозначает - числовые результаты, которые не могут быть адекватно представлены. Таким образом, 0/0
не является числом, в том смысле, что оно NaN
, но оно a Number
в терминах его типа.
Возможно, его следовало бы назвать NaRN (не представляемым числом).
Ответ 2
Если у вас есть переменная и присвоить ей результат 0/0, переменная все еще имеет числовой тип, но значение undefined (а не число). Существуют и другие условия, при которых это может произойти, но это иллюстрирует то, что вы видите.
Ответ 3
Вы вводите в заблуждение тип вашего объекта со значением. NaN
- это конкретное значение, которому может быть присвоен объект типа number
, например, в случае деления нуля на ноль или при попытке конвертировать число из строки, которая не представляет число.
Ответ 4
Некоторые определения из W3Schools:
Бесконечность: числовое значение, представляющее положительную/отрицательную бесконечность
Свойство POSITIVE_INFINITY представляет бесконечность, возвращенную при переполнении.
NEGATIVE_INFINITY, представляет отрицательную бесконечность (возвращается при переполнении).
Свойство NaN представляет значение "Not-a-Number". Это свойство указывает, что значение не является юридическим номером.
Функция isFinite() определяет, является ли число конечным юридическим номером.
Эта функция возвращает false, если значение равно + бесконечность, -инфекция или NaN.
Некоторые тесты:
var n1 = 1/0;
var n2 = 0/0;
var n3 = (Number.MAX_VALUE)*2; //overflow
var b1 = Number.POSITIVE_INFINITY == n1;
var b2 = Number.POSITIVE_INFINITY == n2;
var b2n = Number.NEGATIVE_INFINITY == n2;
var b3 = Number.POSITIVE_INFINITY == n3;
var msg = "n1=" + n1 + ", n2=" + n2 + ", n3=" + n3;
msg += "<br/> n1 Is POSITIVE_INFINITY=" + b1;
msg += "<br/> n2 Is POSITIVE_INFINITY=" + b2;
msg += "<br/> n2 Is POSITIVE_INFINITY=" + b2n;
msg += "<br/> n3 Is POSITIVE_INFINITY=" + b3;
msg += "<br/> n1 IsFinite=" + isFinite(n1);
msg += "<br/> n2 IsFinite=" + isFinite(n2);
msg += "<br/> n3 IsFinite=" + isFinite(n3);
msg += "<br/> n1 + n1 =" + (n1 + n1) ;
msg += "<br/> n1 - n1 =" + (n1 - n1) ;
msg += "<br/> n2 + n1 =" + (n2 + n1) ;
document.write(msg);
Отображение
n1=Infinity, n2=NaN, n3=Infinity
n1 Is POSITIVE_INFINITY=true
n2 Is POSITIVE_INFINITY=false
n2 Is POSITIVE_INFINITY=false
n3 Is POSITIVE_INFINITY=true
n1 IsFinite=false
n2 IsFinite=false
n3 IsFinite=false
n1 + n1 =Infinity
n1 - n1 =NaN
n1 - n1 =NaN
Ответ 5
Наряду с тем, что было сказано, я думаю, если вы разделите, например, строку. Он пытается вернуть NaN, но все еще рассматривает его как число.
Ответ 6
Вы должны проверить статью в Википедии. Он имеет более подробную информацию.