내용 출처 - MDN Web Docs - BigInt
BigInt는 Number 의 값이 나타낼 수 있는 값보다 최대치인 253 - 1 보다 큰 정수를 표현할 수 있는 내장 객체이다.
이보다 큰 정수를 사용한다면 계산이 정확하지 않을 수 있다.
const MAX_VALUE = Number.MAX_SAFE_INTEGER;
console.log(MAX_VALUE)
// 9007199254740991
const CHECK_VALUE = MAX_VALUE + 2
console.log(CHECK_VALUE)
// 예상되는 값은 9007199254740993 이지만
// 출력되는 값은 9007199254740992 이다.
그래서 정수 리터럴 값 뒤에 n
을 붙여서 사용하면 BigInt Type의 값을 사용할 수 있다.
const MAX_SAFE_NUMBER = BigInt(9007199254740991);
const addValue = MAX_SAFE_NUMBER + 2n;
console.log(addValue)
// 출력 값은 9007199254740993n 이 나온다
이때 생각할 수 있는 것은 숫자에 n
이 붙어서 제대로 사용할 수 없는 것 아닌가 싶지만
typeof 1n === 'bigint' // true
typeof BigInt(1) === 'bigint' // true
typeof Object(1n) === 'object' // true
자료형으로는 bigint
로 출력되며, Object
로 감싼 BigInt
는 일반 object
로 취급된다.
BigInt
는 자료형으로써 +, *, -, **, %
연산자를 사용할 수 있습니다.
사용할 수 없는 것은 >>>>
부호버림 오른쪽 시프트는 사용할 수 없다고 한다.
const prevMaxSafe = BigInt(Number.MAX_SAFE_INTEGER);
// ↪ 9007199254740991n
const multiply = prevMaxSafe * 2n;
// ↪ 18014398509481982n
const subtract = multiply - 10n;
// ↪ 18014398509481972n
const mod = multiply % 10n
// ↪ 2n
const bigN = 2n ** 54n;
// ↪ 18014398509481984n
bigN * -1n
// ↪ –18014398509481984n
연산자 중 /
도 있지만 BigInt
는 BigDecimal
이 아니라서 소수점 이하를 버린다고 합니다. 즉 정수인 결과만 출력된다는 얘기다.
const divide = 5n / 2n;
// ↪ 2n
BigInt
는 Number
Type과 일치 하지 않지만 동등합니다.
1n === 1 // false
1n == 1 // true
하지만 일반적인 방법은 그냥 사용할 수 있다.
2n > 1 // true
1n < 2 // true
배열의 요소를 정렬할 때도 가능하다
const mixedList =[1n, -2, 5n, 11n, 7, 9, 3];
mixedList.sort();
// ↪ [-2, 1n, 11n, 3, 5n, 7, 9]
Object
형태로 된 BigInt
는 자기 자신과 비교했을 떄만 비교 가능
Object(1n) === Object(1n) // false
1n === Object(1n) // false
const self = Object(1n);
self === self // true
조건에서는 Number
Type 처럼 동작 된다.
if (0n) {
console.log('this if')
} else {
console.log('this else')
}
// ↪ else 출력
0n || 1n
// ↪ 1n
Boolean(0n)
// ↪ false
Boolean(1n)
// ↪ true
!0n
// ↪ true
!1n
// ↪ false
BigInt()
BigInt
객체를 생성BigInt.asIntN()
BigInt₩
를 -2^(width - 1)
과 2^(width - 1) - 1
의 범위로 자른다.BigInt.asUintN()
BigInt
를 0
과 2^width - 1
의 범위로 자른다.BigInt.prototype.toLocaleString()
BigInt.prototype.toString()
BigInt
의 값을 주어진 진수로 표현한 문자열을 반환BigInt.prototype.valueOf()
BigInt
객체의 원시 값 표현을 반환BigInt
를 Number
로 변환하는 과정에서 정확도를 유실할 수 있기 때문에 253보다 큰 값을 예상할 수 있는 경우에만 BigInt
를 사용.BigInt
가 지원하는 연산의 소요시간은 상수 시간이 아니기 때문에 암호화에 적합하지 않습니다.BigInt
는 직렬화 할 수 없기 때문에 JSON.stringify()
에 BigInt
를 포함한 값이 전달되면 TypeError
가 발생합니다.
단, 필요한 경우 toJSON
메서드를 사용할 수 있다.
BigInt.prototype.toJSON = function() {
return this.toString();
}
// 이후에 오류가 나타나지 않고 문자열을 반환한다.
JSON.stringify(BigInt(1))
// '"1"'