1/0 === Infinity
и 1/Infinity === 0
Что такое бесконечность в JavaScript? ♾️
Бесконечность действительно является значением в JavaScript, представляющим математическую бесконечность (∞). Будьте готовы к тому, что он появится в вашем коде.
JavaScript: до Infinity
и не только
«
Infinity
- это свойство глобального объекта, или, другими словами, переменная в глобальной области видимости.
Начальное значение
Infinity
-Number.POSITIVE_INFINITY
. ЗначениеInfinity
(положительная бесконечность) больше любого другого числа. Математически это значение ведет себя так же, как бесконечность; например, любое положительное число, умноженное наInfinity
, равняетсяInfinity
, а любое число, разделенное наInfinity
, равно 0. " - MDN Docs
Число Infinity
- это специальное значение в JavaScript, которое представляет математическую бесконечность и значения переполнения - числа настолько большие, что они переполняют буфер и приводят к Infinity
.
Это результат вычислений, в результате которых создаются числа, превышающие специальное максимальное значение в JavaScript, значение, которое составляет примерно 1.79e+308
или 2¹⁰²⁴ - наибольшее значение, которое может быть сохранено как числовой примитивный тип в JavaScript.
В этой статье я исследую поведение Infinity
в JavaScript.
Создание Infinity
в JavaScript
К значению Infinity
можно получить доступ напрямую с помощью глобальной переменной Infinity
, которая является свойством глобального объекта.
К нему также можно получить доступ, используя Number.POSITIVE_INFINITY
(свойство объекта Number
), с помощью математических функций, производящих слишком большое число, или путем деления любого числа на ноль 0
:
К отрицательному значению Infinity
(-Infinity
) можно получить доступ напрямую, поставив знак минус -
перед Infinity
, открыв Number.NEGATIVE_INFINITY
, разделив или умножив Infinity
на -1
, или разделив любое число на отрицательный ноль -0
:
Деление на Infinity
в JavaScript
Деление положительного числа на Infinity
дает положительный ноль 0
,
деление Infinity
на Infinity
дает NaN
, а деление положительного числа на -Infinity
или отрицательного числа на Infinity
приводит к отрицательному нулю -0
:
Осторожно, Infinity
может показаться бесконечным
В самой ранней версии JavaScript значение Infinity
могло быть заменено другим значением.
Согласно спецификации ECMAScript 5,
Infinity
доступен только для чтения (реализован в JavaScript 1.8.5 / Firefox 4). - MDN Docs
Если вам интересно, Infinity
поддерживается всеми браузерами:
Infinity
и математика в JavaScript
Как уже отмечалось, Infinity
ведет себя в основном как математическая бесконечность - сложение, вычитание или умножение к ней по-прежнему Infinity
:
Infinity
и NaN
в JavaScript
Для всех чисел в JavaScript, даже для могущественной Бесконечности, попытка выполнить математику с NaN
(Not-A-Number) приведет к NaN
значениям.
Мне нравится думать об этом как о NaN
отравлении математических функций JavaScript:
Обратите внимание, что Infinity
, -Infinity
и NaN
- единственные «бесконечные» (не конечные) числа в JavaScript. Этот факт станет важным, когда мы рассмотрим функции isFinite()
и Number.isFinite()
позже в этой статье.
Infinity
и большие числа в JavaScript
Специальное значение Infinity
возвращается в JavaScript чем-либо большим, чем максимально возможное числовое значение (Number.MAX_VALUE
, что примерно равно 1.79e + 308).
Обратите внимание, что наибольшее безопасное целое число - это другое значение, ²⁵³ - 1, представленное значением _58 _ (_ 59_). Целые числа, превышающие это значение, будут сравниваться некорректно, что приведет к ошибкам.
Для произвольно больших целочисленных значений существует примитивный тип BigInt
, который в настоящее время является предложением ECMAScript Stage 4, которое уже поддерживается последними версиями Chrome и Firefox.
Но BigInt
не очень хорошо работает с Infinity, поскольку Infinity
относится к числу примитивного типа JavaScript, которое нельзя смешивать с BigInt
.
BigInt
не имеет собственного понятия бесконечности. Фактически, деление числа BigInt
на BigInt
ноль (0n
) приводит к ошибке, а не Infinity
:
Поскольку BigInt
может быть любого размера, отсутствие эквивалента числа Infinity
не должно быть проблемой.
Еще одно замечание: BigInt
не подходит для криптографии:
Операции, поддерживаемые
BigInt
s, не являются постоянным временем.BigInt
поэтому «непригоден для использования в криптографии. - MDN Docs
Проверка Infinity
с помощью ==
, ===
и Object.is()
Вы можете проверить бесконечность, сравнив значение с бесконечностью, используя двойное равно ==
или тройное равно ===
:
Конечно, вспомогательная функция ES6 Object.is()
будет работать так же, как оператор строгого равенства ===
при работе с Infinity
:
Проверка на бесконечность с isFinite()
vs. Number.isFinite()
Вы можете использовать вспомогательную функцию Number.isFinite()
, чтобы проверить, является ли значение конечным числом (не Infinity
, -Infinity
или NaN
).
Существует также глобальная функция isFinite()
, которая выполняет приведение типов, то есть сначала пытается преобразовать значение в числовой тип JavaScript, прежде чем проверять, является ли оно конечным числом.
Разница между этими двумя функциями такая же, как разница в проверке на NaN
с Number.isNaN()
, который не приводит к типу, и в isNaN()
, который переводит входное значение в число.
Поскольку он не выполняет приведение типов, Number.isFinite()
обычно является предпочтительной функцией:
«
Number.isFinite()
отличается от глобальной функцииisFinite()
. Функцияglobal isFinite()
преобразует протестированное значение в число, а затем проверяет его.
Number.isFinite()
не преобразует значения вNumber
и не вернет истину для любого значения, не относящегося к типуNumber
». - Школы W3
Напомним, глобальная функция isFinite()
сначала преобразует проверяемое значение в число, как и глобальная функция isNan()
.
Функции Number.isNan()
и Number.isFinite()
будут возвращать false для всех значений, не являющихся числами.
Использование isFinite()
эквивалентно явному приведению (приведению) значения к числовому типу с использованием примитивной оболочки Number
:
Вообще говоря, Number.isFinite()
рекомендуется избегать случайного приведения типов, приводящего к странным результатам:
Обратите внимание, что NaN
(«Не-число») считается не конечным isFinite()
и Number.isFinite()
. Таким образом, NaN
вернет false с этими функциями.
Резюме - Полное поведение Infinity
в JavaScript
Любое положительное значение, включая [
Infinity
], умноженное на [Infinity
], равно [Infinity
].
Любое отрицательное значение, включая [-Infinity
], умноженное на [Infinity
], равно [-Infinity
].
Любое положительное число деленное на [Infinity
] - положительный ноль [0
].
Любое отрицательное число, деленное на [Infinity
], является отрицательным нулем [-0
].
Ноль [0
], умноженный на [Infinity
], равенNaN
.NaN
, умноженный на [Infinity
], будетNaN
.
[Infinity
], разделенный на любое отрицательное значение, кроме [-Infinity
], будет [-Infinity
].
[Infinity
], разделенное на любое положительное значение, кроме [Infinity
], будет [Infinity
].
[Infinity
], разделенное на [-Infinity
] или [Infinity
], будетNaN
. - MDN Docs
Число Infinity
работает так, как вы думаете, в JavaScript, если вы знакомы с NaN
и отрицательным нулем -0
.
В программировании всегда приятно, когда все работает так, как должно.
Просто позаботьтесь о NaN
значениях и помните, что isFinite()
выполняет приведение типов, если вы пытаетесь проверить Infinity
.
Дальнейшее чтение
- Доктор Аксель Раушмайер опубликовал красивую статью , охватывающую как
NaN
, так иInfinity
:
NaN и бесконечность в JavaScript
Обновление: новый раздел« Определение NaN . В этом сообщении рассматриваются два особых значения, которые могут быть результатом операций, которые… 2ality.com »
- Учебник по RIP содержит несколько примеров кода о
Infinity
в JavaScript:
- На Net-Informations.com есть четкая статья на
Infinity
на JavaScript:
- В GeeksforGeeks есть отдельные статьи о положительном и отрицательном
Infinity
: