Подтвердить что ты не робот

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

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

Основной код:

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

Ответ 5

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