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 не подходит для криптографии:

Операции, поддерживаемые BigInts, не являются постоянным временем. 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 и бесконечность в JavaScript
Обновление: новый раздел« Определение NaN
. В этом сообщении рассматриваются два особых значения, которые могут быть результатом операций, которые… 2ality.com »











Присоединяйтесь к моему списку рассылки, чтобы получить бесплатный доступ ко всем моим статьям на Medium.