Является ли Number.IsNaN() более разбитым, чем isNaN()
Soooooo isNaN
, по-видимому, разбит на JavaScript, с такими вещами, как:
isNaN('')
isNaN(' ')
isNaN(true)
isNaN(false)
isNaN([0])
Возвращение false, когда они кажутся всем... Не число...
В ECMAScript 6 проект включает новый Number.isNaN
, но он выглядит как (imo), что это также нарушено...
Я ожидал бы
Number.isNaN('RAWRRR')
Возвращать true, так как это строка и не может быть преобразована в число... Однако...
![enter image description here]()
Кажется, что вещи, которые я бы рассматривал... не число, действительно, не, а не число...
http://people.mozilla.org/~jorendorff/es6-draft.html#sec-isfinite-number
В примерах MDN говорится:
Number.isNaN( "блаб" );//например. это было бы верно с isNaN
Я не понимаю, как это "более надежная версия исходного глобального isNaN". когда я не могу проверить, не являются ли вещи не числом.
Это будет означать, что мы все еще подвергаемся фактической проверке типа, а также проверке isNaN... что кажется глупым...
http://people.mozilla.org/~jorendorff/es6-draft.html#sec-isnan-number
Проект ES3 здесь в основном говорит: все всегда ложно, за исключением его Number.NaN
Кто-нибудь еще найдет это сломанным или я просто не понимаю точку isNaN?
Ответы
Ответ 1
isNaN()
и Number.isNaN()
оба теста, если значение (или, в случае isNaN()
, могут быть преобразованы в числовое значение, представляющее) значение NaN
. Другими словами, "NaN" не просто означает, что "это значение не является числом", это означает, что "это значение является числовым значением Not-a-Number в соответствии с IEEE-754".
Причина, по которой все ваши тесты выше, возвращает false, состоит в том, что все указанные значения могут быть преобразованы в числовое значение, которое не равно NaN
:
Number('') // 0
Number(' ') // 0
Number(true) // 1
Number(false) // 0
Number([0]) // 0
Причина isNaN()
является "нарушенной", потому что, якобы, типы конверсий не должны возникать при тестировании значений. Это проблема Number.isNaN()
предназначена для решения. В частности, Number.isNaN()
будет пытаться только сравнить значение с NaN
, если значение представляет собой числовое значение. Любой другой тип возвращает false, даже если они буквально "не являются числом", потому что тип значения NaN
является числом. См. Соответствующие документы MDN для isNaN()
и Number.isNaN()
.
Если вы просто хотите определить, имеет ли значение тип номера, даже если это значение NaN
, используйте typeof
вместо:
typeof 'RAWRRR' === 'number' // false
Ответ 2
Нет, оригинал isNaN
не работает. Вы не понимаете точку isNaN
.
Цель обеих этих функций - определить, имеет ли что-то значение NaN
. Это обеспечивается, потому что something === NaN
всегда будет false
и поэтому не может быть использован для проверки этого.
(примечание стороны: something !== something
на самом деле является надежным, хотя и контринтуитивным, тестом для NaN
)
Причиной isNaN
является то, что он может вернуть true
в случаях, когда значение фактически не является NaN
. Это связано с тем, что оно сначала приводит число к числу.
Итак,
isNaN("hello")
есть true
, хотя "hello"
не NaN
.
Если вы хотите проверить, действительно ли значение является конечным числом, вы можете использовать:
Number.isFinite(value)
Если вы хотите проверить, является ли значение конечным числом или строковым представлением одного, вы можете использовать:
Number.isFinite(value) || (Number.isFinite(Number(value)) && typeof value === 'string')
Ответ 3
Ключевое различие между ними состоит в том, что глобальная функция isNaN(x)
выполняет преобразование параметра x
в число. Так
isNaN("blabla") === true
потому что Number("blabla")
приводит к NaN
Здесь есть два определения "не число" и, возможно, там, где замешательство. Number.isNaN(x)
возвращает true только для определения спецификации с плавающей точкой IEEE 754 для Not a Number, например:
Number.isNaN(Math.sqrt(-1))
в отличие от определения того, является ли передаваемый объект числовым или нет. Некоторые способы сделать это:
typeof x === "number"
x === +x
Object.prototype.toString.call(x) === "[object Number]"
Ответ 4
Как указано в комментарии isNaN()
и Number.isNaN()
, проверьте, что значение, которое вы передаете, не равно значению NaN
. Ключевым моментом здесь является то, что NaN
является фактическим значением, а не оцененным результатом, например. "blabla"
- это String
, а значение "blabla"
означает, что это не значение "NaN"
.
Правдоподобное решение будет делать что-то вроде:
Number.isNaN(Number("blabla")); //returns true.
Ответ 5
По сути, window.isNaN
выполняет преобразование типа в число, а затем проверяет, является ли оно NaN. Принимая во внимание, что Number.isNaN
не пытается преобразовать свой аргумент в число. В window.isNaN
, вы можете думать о window.isNaN
и Number.isNaN
как о работающих так.
window.isNaN = function(n){
return Number(n) !== Number(n);
}
window.Number.isNaN = function(n){
return n !== n;
}
Обратите внимание, что вам на самом деле не нужно использовать window.
позвонить isNaN
или Number.isNaN
. Скорее, я просто использую его, чтобы обеспечить лучшее различие между двумя одноименными методами, чтобы попытаться сократить путаницу.
~ Счастливого кодирования!
Ответ 6
1. Number.isNaN
alert(Number.isNaN('Hello')); // false
Должен ли он возвращать true
, потому что Hello
- это string
и его Not A Number
справа? Но Давайте узнаем, почему он возвращает false
.
MDN docs говорит:
true, если заданное значение - NaN, а его тип - Number; в противном случае, ложь.
Да Hello
значение NaN
, но тип string
, вы можете проверить тип следующим образом:
alert(typeof `Hello`); // string
Применение:
Использование, когда вы хотите проверить значение, равно как NaN
, а type
- номер.
2. IsNaN
alert(isNaN('Hello')); // true
MDN docs говорит:
true, если заданное значение NaN; в противном случае - false.
Применение:
Использовать, когда вы хотите проверить значение, это просто NaN.
3. jQuery.isNumeric()
Jquery Docs Говорит:
Определяет, указывает ли его аргумент номер JavaScript.
alert($.isNumeric('Hello')); // false
alert($.isNumeric(3)); //true
Применение:
Использование, когда вы хотите проверить значение, является числом или может быть преобразовано в число.
Ссылка
Ответ 7
Следующее работает, потому что NaN - единственное значение в javascript, которое не равно самому себе.
Number.isNaN = Number.isNaN || function(value) {
return value !== value;
}
Ответ 8
Per, MDN, it (NaN) - это возвращаемое значение при сбое математических функций и, как таковое, это конкретное значение. Возможно, лучшим именем было бы, MathFunctionFailed
.
Чтобы определить, является ли что-то число числом, требуется синтаксический анализ, который успешно завершается в широком диапазоне нечисловых входов, успешно обнаруживая числа и строки, представляющие числа, следовательно:
function isNumber(v) {return Number.isNaN(parseFloat(v)); }
Ответ 9
@phill, как указано в других ответах, ни один не сломан.
Number.isNaN
работает с числом или экземпляром Number
, поэтому даже Number.isNaN(new Date(NaN))
имеет значение false.
isNaN
, с другой стороны, является общим и пытается преобразовать свой параметр в число, прежде чем проверять его.
Если вы хотите определить, является ли значение (или содержит) NaN
, вы можете использовать эту функцию:
function valueIsNaN(value) {
// eslint-disable-next-line no-self-compare
return value !== value || typeof value == 'object' && Number.isNaN(value.valueOf());
}