оригинал:woohoo.smashing magazine.com/2019/07/ESS…
Переводчик: Front-end Xiaozhi
Ставь лайк и смотри, поиск в WeChat【Переезд в мир】Обратите внимание на этого человека, который не имеет большого фабричного прошлого, но имеет восходящий и позитивный настрой. эта статья
GitHub
GitHub.com/QQ449245884…Он был включен, статьи были классифицированы, и многие мои документы и учебные материалы были систематизированы.
Все говорили, что нет проекта для написания резюме, поэтому я помог вам найти проект, и это было с бонусом.【Учебник по строительству】.
BigInt
Цель типа данных — сравнитьNumber
Более широкий диапазон целочисленных значений, поддерживаемых типом данных. Возможность представления целых чисел с произвольной точностью особенно важна при выполнении математических операций над большими целыми числами. использоватьBigInt
, целочисленное переполнение больше не будет проблемой.
Кроме того, более точные метки времени, большие целочисленные идентификаторы и т. д. можно безопасно использовать без использования обходных путей.BigInt
В настоящее время предложение фазы 3, после добавления в спецификацию, это будет второй числовой тип данных JS, а также базовый тип данных JS 8:
- Boolean
- Null
- Undefined
- Number
- BigInt
- String
- Symbol
В этой статье мы подробно познакомимBigInt
, чтобы увидеть, как это разрешается с помощьюNumber
тип ограничений.
вопрос
Отсутствие явных целочисленных типов в JS часто сбивает с толку программистов, изучавших другие языки. Многие языки программирования поддерживают несколько числовых типов, таких как float, double, int и double, но это не относится к JS. В JS, согласноIEEE 754-2008Стандартное разрешение, все числа начинаются с64-битная двойная точность с плавающей запятойформатное представление.
Очень большие целые числа, которые не могут быть представлены точно, автоматически округляются в соответствии с этим стандартом. Если быть точным, в JSNumber
Типы могут быть безопасно представлены только-9007199254740991 (-(2^53-1))
а также9007199254740991(2^53-1)
Любое целочисленное значение за пределами этого диапазона может потерять точность.
console.log(9999999999999999); // → 10000000000000000
Целое число больше, чем наибольшее целое число, которое может представлять тип JS Number, поэтому оно округляется. Случайное округление может поставить под угрозу надежность и безопасность программы. Вот еще один пример:
// 注意最后一位的数字
9007199254740992 === 9007199254740993; // → true
JS предоставляетNumber.MAX_SAFE_INTEGER
константа для представления наибольшего безопасного целого числа,Number.MIN_SAFE_INTEGER
Константа представляет собой наименьшее безопасное целое число:
const minInt = Number.MIN_SAFE_INTEGER;
console.log(minInt); // → -9007199254740991
console.log(minInt - 5); // → -9007199254740996
// notice how this outputs the same value as above
console.log(minInt - 4); // → -9007199254740996
решение
Чтобы обойти эти ограничения, некоторые разработчики JS используют строковый тип для представления больших целых чисел. Например,Twitter APIСтроковая версия идентификатора добавляется к объекту при ответе в формате JSON. Кроме того, было разработано множество библиотек, таких какbignumber.js, для упрощения обработки больших целых чисел.
С BigInt приложениям больше не нужны обходные пути или библиотеки для безопасного представленияNumber.MAX_SAFE_INTEGER
а такжеNumber.Min_SAFE_INTEGER
кроме целых чисел. Арифметические операции над большими целыми числами теперь можно выполнять в стандартном JS без риска потери точности.
создаватьBigInt
, просто добавьте n в конец целого числа. Сравнивать:
console.log(9007199254740995n); // → 9007199254740995n
console.log(9007199254740995); // → 9007199254740996
Кроме того, вы можете позвонитьBigInt()
Конструктор
BigInt("9007199254740995"); // → 9007199254740995n
BigInt
Литералы также могут быть представлены в двоичном, восьмеричном или шестнадцатеричном виде.
// binary
console.log(0b100000000000000000000000000000000000000000000000000011n);
// → 9007199254740995n
// hex
console.log(0x20000000000003n);
// → 9007199254740995n
// octal
console.log(0o400000000000000003n);
// → 9007199254740995n
// note that legacy octal syntax is not supported
console.log(0400000000000000003n);
// → SyntaxError
Помните, что вы не можете использовать оператор строгого равенства дляBigInt
Сравните с обычными числами, потому что они разных типов:
console.log(10n === 10); // → false
console.log(typeof 10n); // → bigint
console.log(typeof 10); // → number
Вместо этого вы можете использовать оператор равенства, который выполняет неявное преобразование типа перед обработкой операндов.
console.log(10n == 10); // → true
За исключением унарного знака плюс (+
), все арифметические операторы могут быть использованы дляBigInt
10n + 20n; // → 30n
10n - 20n; // → -10n
+10n; // → TypeError: Cannot convert a BigInt value to a number
-10n; // → -10n
10n * 20n; // → 200n
20n / 10n; // → 2n
23n % 10n; // → 3n
10n ** 3n; // → 1000n
const x = 10n;
++x; // → 11n
--x; // → 9n
Унарный плюс не поддерживается (+
) заключается в том, что некоторые программы могут зависеть от+
всегда генерироватьNumber
инвариант или выдать исключение. Изменять+
поведение также разрушаетasm.js
код.
Конечно, сBigInt
При использовании вместе с операндами арифметические операторы должны возвращатьBigInt
стоимость. Поэтому деление (/
) результаты оператора автоматически округляются до ближайшего целого числа. Например:
25 / 10; // → 2.5
25n / 10n; // → 2n
неявное преобразование типов
Поскольку неявные преобразования типов могут привести к потере информации, они не разрешены вbigint
а такжеNumber
смешанная операция. При смешивании больших целых чисел и чисел с плавающей запятой результирующее значение может не совпадать.BigInt
илиNumber
точное представление. Рассмотрим следующий пример:
(9007199254740992n + 1n) + 0.5
Результат этого выражения превышаетBigInt
а такжеNumber
спектр. дробная частьNumber
не может быть преобразовано точно вBigInt
. больше, чем2^53
изBigInt
не может быть точно преобразовано в число.
Из-за этого ограничения невозможно использовать смешанныеNumber
а такжеBigInt
Операнды выполняют арифметические операции. все еще не в состоянииBigInt
Передано веб-API и встроенным функциям JS, которые требуютNumber
Тип чисел. Попробуйте сделать этот отчетTypeError
ошибка
10 + 10n; // → TypeError
Math.max(2n, 4n, 6n); // → TypeError
осторожность, реляционные операторы не следуют этому правилу, как в следующем примере:
10n > 5; // → true
Если вы хотите использоватьBigInt
а такжеNumber
Для выполнения арифметического вычисления сначала нужно определить, в каком виде должна выполняться операция. Для этого просто позвонитеNumber()
илиBigInt()
для преобразования операндов:
BigInt(10) + 10n; // → 20n
// or
10 + Number(10n); // → 20
когдаBoolean
введите сBigInt
Когда типы встречаются,BigInt
обрабатывается сNumber
аналогично, другими словами, до тех пор, пока не0n
,BigInt
рассматривается какtruthy
Значение:
if (5n) {
// 这里代码块将被执行
}
if (0n) {
// 这里代码块不会执行
}
СортироватьBigInts
а такжеNumbers
При использовании массива неявное преобразование типов не происходит:
const arr = [3n, 4, 2, 1n, 0, -1n];
arr.sort(); // → [-1n, 0, 1n, 2, 3n, 4]
побитовые операторы, такие как|、&、<<、>>
а также^
правильноBigint
операция иNumber
аналогичный. вот несколько примеров
90 | 115; // → 123
90n | 115n; // → 123n
90n | 115; // → TypeError
Конструктор BigInt
Как и другие примитивные типы, его можно создать с помощью конструктораBigInt
. Перейти кBigInt()
Аргументы будут автоматически преобразованы вBigInt
:
BigInt("10"); // → 10n
BigInt(10); // → 10n
BigInt(true); // → 1n
Типы данных и значения, которые нельзя преобразовать, вызывают исключения:
BigInt(10.2); // → RangeError
BigInt(null); // → TypeError
BigInt("abc"); // → SyntaxError
Вы можете напрямую использовать конструктор для созданияBigInt
выполнять арифметические операции
BigInt(10) * 10n; // → 100n
При использовании операндов оператора строгого равенства, созданного с помощью конструктораBigint
с обычнымBigint
обрабатывается аналогично
BigInt(true) === 1n; // → true
Библиотечные функции
На момент написания этой статьиChrome +67
а такжеOpera +54
полностью поддерживаюBigInt
тип данных. К сожалению,Edge
а такжеSafari
Еще не реализовал.Firefox
BigInt не поддерживается по умолчанию, но может использоваться вabout:config
генерал-лейтенантjavascript.options.bigint
Установить какtrue
чтобы включить его, последние поддерживаемые случаи можно найти в "Can I use" смотреть.
К сожалению, преобразованиеBigInt
является чрезвычайно сложным процессом, который приводит к серьезному снижению производительности во время выполнения. Прямой полифиллBigInt
Также невозможно, так как предложение меняет поведение нескольких существующих операторов. В настоящее время лучшим вариантом является использованиеJSBIбиблиотека, этоBigInt
Реализация предложения на чистом JS.
Эта библиотека предоставляетBigInt
API, который ведет себя точно так же. Вот как использовать JSBI:
import JSBI from './jsbi.mjs';
const b1 = JSBI.BigInt(Number.MAX_SAFE_INTEGER);
const b2 = JSBI.BigInt('10');
const result = JSBI.add(b1, b2);
console.log(String(result)); // → '9007199254741001'
использоватьJSBI
Одним из преимуществ является то, что когда браузер поддерживает его, нет необходимости переписывать код. Вместо этого вы можете использоватьbabel
Плагин автоматически компилирует код JSBI в собственныйBigInt
код.
Суммировать
BigInt
это новый тип данных, используемый, когда целые значения больше, чемNumber
Диапазон поддерживает диапазон типов данных. Этот тип данных позволяет нам безопасно выполнять арифметические операции на большом целочисленном, представляющем марки с высоким разрешением, используя большой целочисленный идентификатор и т. Д., Без необходимости использовать библиотеку.
Важно помнить, что вы не можете использоватьNumber
а такжеBigInt
Смесь операндов выполняет арифметические операции путем явного преобразования одного из типов. Кроме того, по соображениям совместимости не допускаетсяBigInt
Используйте унарный знак плюс (+
) оператор.
общаться с
Статья постоянно обновляется каждую неделю. Вы можете выполнить поиск «Big Move to the World» в WeChat, чтобы прочитать и обновить ее как можно скорее (на одну или две статьи раньше, чем в блоге). Эта статья находится на GitHub.GitHub.com/QQ449245884…Он был включен, и многие мои документы были разобраны. Добро пожаловать в Звезду и совершенство. Вы можете обратиться в тестовый центр для ознакомления во время собеседования. Кроме того, обратите внимание на паблик-аккаунт и ответьте в фоновом режиме.Благосостояние, вы можете увидеть преимущества, вы знаете.