У меня есть серия вычислений Javascript, которые (только в IE) показывают бесконечность в зависимости от выбора пользователя.
Как остановить появление слова Infinity
и, например, показать 0.0
вместо него?
javascript
infinity
Homer_J
источник
источник
Number.(POSITIVE|NEGATIVE)_INFINITY
вместо-?Infinity
или-?1/0
?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
источник
На самом деле n === n + 1 будет работать для чисел больше 51 бит, например
1e16 + 1 === 1e16; // true 1e16 === Infinity; // false
источник
Мне нравится использовать 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); }
источник