Зачем проверять! IsNaN () после isFinite ()? - PullRequest
24 голосов
/ 17 апреля 2011

Я столкнулся с функцией goog.math.isFiniteNumber в Google Closure Library . Он проверяет, является ли данное число конечным и не NaN.

Базовый код:

goog.math.isFiniteNumber = function(num) {
  return isFinite(num) && !isNaN(num);
};

Итак, сначала он проверяет, является ли число конечным, используя собственную функцию isFinite, а затем выполняет дополнительную проверку, чтобы убедиться, что число не NaN, используя isNaN.

Однако isFinite уже возвращает false в случае, если аргумент NaN. Итак, какие преимущества дает проверка для isNaN?

Ответы [ 5 ]

15 голосов
/ 30 мая 2013

Разница лишь в следующем:

!isNan(1/0) // --> true
isFinite(1/0) // --> false

isNaN проверяет, является ли аргумент числом или нет. Бесконечности (+/-) также являются числовыми, поэтому они проходят проверку isNaN, но не проходят проверку isFinite.

** Обратите внимание, что любая строка, которая может быть проанализирована как число («2», «3.14»), приведет к тому, что isNaN вернет false.

Надеюсь, это поможет.

PS: ответ, предоставленный пользователем 1170379, был почти идеальным.

2 голосов
/ 26 января 2012

вы могли бы объяснить [Почему?] После прочтения этого:

NaN не проверяет, является ли переданное значение бесконечным или нет - он проверяет, оценивает ли входной val конец "Type: Number"-результат.Поскольку isNaN (строка) принята, поэтому: isNaN ("3.14") // false (что означает истину, данный токен успешно преобразован в тип числа)

Вы можете понять, что входное значениеможет оказаться неразрешенным грубым числом, даже математической операцией, такой простой как: (x / y);что, в свою очередь, может дать (+/- бесконечность) число.

Здесь x = 1, y = 0;значение (1/0). Затем isNaN (x / y) сначала оценивается как isNaN (1/0);затем isNaN (бесконечность) // ложь.Поскольку (1/0) = бесконечность имеет тип: «число», то есть typeof (1/0) // «число» isNaN должно и будет возвращать false.

Вы не хотите ставить «бесконечность»где ожидается номер конечного результата.

1 голос
/ 21 сентября 2011

Вероятно, по той же причине, по которой я реализовал (isfinite(num) && isfinite(-num)) - я получал ошибки от mysql с жалобами на добавление "-nan" в базу данных, хотя у меня была проверка для isfinite(field) ...

Полезная статья на эту тему: http://jacksondunstan.com/articles/983, которая обеспечивает оптимизацию ((d*0.0)==0.0)

0 голосов
/ 06 августа 2014

isNaN () возвращает true, если аргумент не является числом или если аргумент является нечисловым значением, например строкой или объектом. В противном случае он возвращает false. Пример: isNaN(0/0) =>true; isNaN(2-1) =>false; isFinite () возвращает true, если аргумент является числом, отличным от NaN, Infinity или -Infinity. В противном случае возвращается false. Пример: isFinite("2000") =>false; isFinite (200/2) => true; `

0 голосов
/ 17 апреля 2011

Если isFinite работает так же, как isFiniteNumber, то нет смысла писать isFiniteNumber.Возможно, где-то есть браузер, который рассматривает NaN как конечный.

...