[Javascript] BigInt

seuhyang·2023년 5월 19일
0

내용 출처 - 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

연산자 중 /도 있지만 BigIntBigDecimal이 아니라서 소수점 이하를 버린다고 합니다. 즉 정수인 결과만 출력된다는 얘기다.

const divide = 5n / 2n;
// ↪ 2n

비교

BigIntNumber 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()
  • 주어진 BigInt02^width - 1의 범위로 자른다.

인스턴스 메서드

BigInt.prototype.toLocaleString()

  • BigInt를 주어진 언어에 적합한 형태를 가진 문자열로 변환해서 반환
    BigInt.prototype.toString()
  • BigInt의 값을 주어진 진수로 표현한 문자열을 반환
    BigInt.prototype.valueOf()
  • BigInt객체의 원시 값 표현을 반환

권장사항

변환

  • BigIntNumber로 변환하는 과정에서 정확도를 유실할 수 있기 때문에 253보다 큰 값을 예상할 수 있는 경우에만 BigInt를 사용.

암호화

JSON과 함께 사용

BigInt는 직렬화 할 수 없기 때문에 JSON.stringify()BigInt를 포함한 값이 전달되면 TypeError가 발생합니다.
단, 필요한 경우 toJSON 메서드를 사용할 수 있다.

BigInt.prototype.toJSON = function() {
	return this.toString();
}
// 이후에 오류가 나타나지 않고 문자열을 반환한다.
JSON.stringify(BigInt(1))
// '"1"'

0개의 댓글