У меня есть серия вычислений Javascript, которые (только в IE) показывают бесконечность в зависимости от выбора пользователя.
Как остановить появление слова Infinity
и, например, показать 0.0
вместо него?
Ответы:
if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
// ...
}
isFinite
Вместо этого вы можете использовать эту функцию, в зависимости от того, как вы хотите лечить NaN
. isFinite
возвращается, false
если ваш номер POSITIVE_INFINITY
, NEGATIVE_INFINITY
или NaN
.
if (isFinite(result))
{
// ...
}
Infinity
свойство не предназначено только для чтения, что означает, что его можно переопределить: например, var x = 42; Infinity = 42; alert(x === Infinity);
отображается «true» . (По общему признанию, это непонятный случай, и любой, кто решит Infinity
NaN
Number.(POSITIVE|NEGATIVE)_INFINITY
он не только для чтения , Infinity
он также доступен только для чтения в строгом режиме. А как насчет -?1/0
дела, которое я вам представил? В любом случае, вы должны почти всегда использовать isFinite
вместо него.
Number.POSITIVE_INFINITY
и Number.NEGATIVE_INFINITY
которые только для чтения (проверено на Chrome8, FF3.6 и IE8). Использование 1/0
работает нормально, но разработчикам вашего кода будет не так очевидно, что вы на самом деле пытаетесь проверить. Я согласен с тем, что использование isFinite
- почти всегда лучший способ делать что-либо - поэтому я упомянул об этом в своем ответе - но только OP может решить, соответствует ли он их требованиям.
Object.defineProperty
и __defineGetter__
. Infinity
, С другой стороны, это не настраивается в строгом режиме.
Простой n === n+1
или n === n/0
работает:
function isInfinite(n) {
return n === n/0;
}
Имейте в виду, что родной isFinite()
код приводит входные данные к числам. isFinite([])
и isFinite(null)
оба true
например.
n === n+1
оценивается как истина для всех чисел больше 2 ^ 53, т. е. 1e30. Разделение работает даже для NaN и -Infinity. Однако ответ LukeH дает вам более читаемый код.
n+1
не могут быть представлены и подлежат округлению. Что ж, даже целые числа подвержены ошибкам округления. Кстати, я не думаю, что ваш код "математически обоснован", просто попробуйте n === n/-0
. При заполнении вещественных чисел с помощью +/- inf ваш предел не определен четко, если основная нулевая последовательность не предполагается положительной.
В ES6
, Number.isFinite()
метод определяет, является ли переданное значение конечным числом.
Number.isFinite(Infinity); // false
Number.isFinite(NaN); // false
Number.isFinite(-Infinity); // false
Number.isFinite(0); // true
Number.isFinite(2e64); // true
Мне нравится использовать Lodash по разным причинам, связанным с защитным кодированием, а также для удобства чтения. ES6 Number.isFinite
великолепен и не имеет проблем с нечисловыми значениями, но если ES6 невозможно, у вас уже есть lodash или вам нужен более короткий код: _.isFinite
_.isFinite(Infinity); // false
_.isFinite(NaN); // false
_.isFinite(-Infinity); // false
_.isFinite(null); // false
_.isFinite(3); // true
_.isFinite('3'); // true
Я столкнулся со сценарием, который требовал от меня проверки того, имеет ли значение тип NaN
или, Infinity
но передавать строки как допустимые результаты. Поскольку многие текстовые строки дают ложное срабатывание NaN
, я сделал простое решение, чтобы обойти это:
const testInput = input => input + "" === "NaN" || input + "" === "Infinity";
Приведенный выше код преобразует значения в строки и проверяет, равны ли они строго NaN или Infinity (вам нужно добавить еще один регистр для отрицательной бесконечности).
Так:
testInput(1/0); // true
testInput(parseInt("String")); // true
testInput("String"); // false
NaN
s и т. Д.
toString()
вместо этого? Не стесняйтесь голосовать против или указывать причины, по которым это может привести к противоречивым результатам или почему именно этот метод не рекомендуется. До сих пор я все еще чувствую, что это добавляет возможность для тех, кто ищет ответ, и нет никаких конкретных причин, почему это опасно, нестабильно и т. Д.
Вы можете использовать isFinite в окне isFinite(123)
:
Вы можете написать такую функцию, как:
function isInfinite(num) {
return !isFinite(num);
}
И используйте как:
isInfinite(null); //false
isInfinite(1); //false
isInfinite(0); //false
isInfinite(0.00); //false
isInfinite(NaN); //true
isInfinite(-1.797693134862316E+308); //true
isInfinite(Infinity); //true
isInfinite(-Infinity); //true
isInfinite(+Infinity); //true
isInfinite(undefined); //true
Вы также можете Number.isFinit
e, который также проверяет, является ли значение также числом и более точным для проверки undefined
и null
т. Д.
Или вы можете полифилить его так:
Number.isFinite = Number.isFinite || function(value) {
return typeof value === 'number' && isFinite(value);
}
Number.(POSITIVE|NEGATIVE)_INFINITY
вместо-?Infinity
или-?1/0
?