Является ли 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());
}