BigInt - garevna/js-course GitHub Wiki

:mortar_board: BigInt

ES10 ( 2019 )

BigInt - новый тип данных ( числа произвольной точности )

Ранее максимально возможным числом было Number.MAX_SAFE_INTEGER ( 2**53, или 9007199254740992 )

Теперь это ограничение снято


:mortar_board: Создание BigInt

Для создания числа типа BigInt нужно просто добавить n:

let bigNumber = 78n

или использовать конструктор нового типа данных:

let bigNumber = Number.MAX_SAFE_INTEGER + 5003  // 9007199254745994
bigNumber = BigInt ( bigNumber ) // 9007199254745994n

Теперь оператор typeof будет возвращать новый тип данных:

typeof bigNumber // 'bigint'

:mortar_board: Приведение типов

NaN, null, Infinity не могут быть конвертированы в bigint

Infinity
BigInt ( Infinity )

будет сгенерировано исключение RangeError

⛔️ Uncaught RangeError: The number Infinity cannot be converted to a BigInt because it is not an integer
NaN
BigInt ( NaN )

будет сгенерировано исключение RangeError

⛔️ Uncaught RangeError: The number NaN cannot be converted to a BigInt because it is not an integer
null
BigInt ( null )

будет сгенерировано исключение TypeError

⛔️ Uncaught TypeError: Cannot convert null to a BigInt

Boolean --> BigInt
BigInt ( false )  // 0n
BigInt ( true )   // 1n
[] --> BigInt
BigInt ( [] )   // 0n
String --> BigInt
BigInt ( "45" )        // 45n
BigInt ( "45" + 11 )   // 4511n
BigInt ( "45" - 11 )   // 34n

BigInt ( "45" - true ) // 44n

а вот такое приведение:

BigInt ( "45 + 8" )
⛔️ Uncaught SyntaxError: Cannot convert 45 + 8 to a BigInt

:mortar_board: Арифметические операции

Арифметические операции с участием данных типа bigint возможны только при условии, что оба операнда имеют тип данных bigint

При попытке выполнить арифметическую операцию с операндами различного типа

bigNumber * 2

будет сгенерировано исключение

⛔️ Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions

При попытке применить функции библиотеки Math к данным типа bigint

Math.sin ( bigNumber )

будет сгенерировано исключение

⛔️ Uncaught TypeError: Cannot convert a BigInt value to a number

Однако можно привести данное типа bigint к обычному типу number

Number ( bigNumber ) // 9007199254745994

При приведении к строке оба типа ( bigint и number ) будут возвращать одинаковый результат:

bigNumber = bigNumber * bigNumber // 81129638414696789717133459048036n
bigNumber.toString() // "81129638414696789717133459048036"

Number ( bigNumber ) // 8.112963841469679e+31
bigNumber.toString() // "81129638414696789717133459048036"

Данные типа bigint можно использовать в качестве индексов элементов массива:

let bigArray = [
    BigInt ( Number.MAX_SAFE_INTEGER + 2 ),
    BigInt ( Number.MAX_SAFE_INTEGER + 3 ),
    BigInt ( Number.MAX_SAFE_INTEGER + 4 ),
    BigInt ( Number.MAX_SAFE_INTEGER + 5 )
]

bigArray [ BigInt ( 1 ) ]  // 9007199254740994n

:mortar_board: Битовые операции

Битовые операции работают с данными типа bigint и возвращают результат типа bigint:

bigArray [ 0 ] ^ bigArray [ 1 ]  // 2n

bigArray [ 0 ] | bigArray [ 1 ]  // 9007199254740994n

~ bigArray [ 1 ]  // -9007199254740995n