У мене є низка обчислень 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
майже завжди є кращим способом зробити щось - саме тому я згадав про це у своїй відповіді - але лише ОП може вирішити, чи відповідає воно їхнім вимогам.
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 неможливий, ви вже маєте лодаш або хочете коротший код: _.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
?