Зачем проверять!isNaN() после isFinite()?

я наткнулся на в Библиотека Закрытия Google. То, что он делает, проверяет, является ли данное число конечным и не NaN.

базовый код:

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

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

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

5 ответов


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


единственное различие заключается в следующем:

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

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

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

надеюсь, что это помогает.

ЗЫ: ответ user1170379 была почти идеальна.


вы можете рассуждать [почему?] прочитав это:

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

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

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

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


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

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


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