원시 타입(primitive type)으로 표현하기에 너무 큰 숫자를 나타내는 객체이다.
지금까지의 ECMAScript는 숫자의 타입이 Number
하나뿐이었다. 일반적인 유형과 범위의 숫자는 문제없이 처리를 하지만 정해진 범위를 넘어선 숫자는 제대로 처리하지 못한다. 오늘날의 웹 개발 이전에는 이게 별 문제가 되지 않았다. 사실 현재도 크게 문제가 되지 않는다. 하지만 뭔가 찝찝하다. 현대의 웹은 다양한 분야에서 복잡하고 규모가 커지고 있다. 그리고 자바스크립트의 비중이 매우 높아지고 있다. 막중한 역할을 가진 언어가 Number.MAX_SAFE_INTEGER
라는 상수로 여기까지만 안전하게 처리할 수 있다는식은 전혀 어울리지 않는다. 당연히 BigInt
가 등장할 때가 되었다.
Number
타입의 정수로 큰 수의 경우 별도의 지수 표기법으로 출력한다.
console.log(Number.MAX_SAFE_INTEGER);
// -> 9007199254740991
console.log(Number.MAX_SAFE_INTEGER * Number.MAX_SAFE_INTEGER);
// -> 8.112963841460666e+31
BigInt
타입의 값은 정수 리터럴의 끝에 n
을 추가하거나 BigInt()
생성자 함수를 호출하여 정수 값 또는 문자열을 지정하여 생성된다.
BigInt
타입의 정수로 큰 수를 별도의 표기법이 없이 출력한다.
let bigInt = BigInt(Number.MAX_SAFE_INTEGER);
console.log(bigInt);
// -> 9007199254740991n
console.log(bigInt * bigInt);
// -> 81129638414606663681390495662081n
숫자를 다룬다는 면에서 Number
객체와 유사하지만 다음과 같은 차이가 있다.
BigInt
타입의 값은 Math
객체의 메소드를 사용할 수 없다.BigInt
타입의 값과 Number
타입의 값을 코드 상에서 혼합할 수 없다. 이 경우 필요에 따라 어느 한쪽의 동일한 유형으로 강제 변환해야 한다. 다만 BigInt
타입의 값을 Number
타입의 값으로 형 변환을 하게 되면 정밀도가 손실되므로 유의해야 한다.실제 아래의 예제를 확인해 보기 바란다.
BigInt
유형의 기본 값을 생성한다. 정수 끝에 n
을 붙이는 리터럴과 BigInt()
생성자 함수를 통해서 생성된다. 이때 new
연산자는 사용하지 않는다.
BigInt
유형의 숫자를 생성한다. new
연산자를 사용하지 않는다.
BigInt
타입의 숫자를 현지 언어에 맞는 형식으로 출력한다.
BigInt
유형의 값을 나타내는 문자열을 반환한다.
BigInt
유형의 값의 래핑된 기본값을 반환한다.
정적(static) 멤버를 의미하며 인스턴스(instance)에 상속되어 사용할 수 없고 오로지 하위를 포함하여 객체(object) 또는 인터페이스(interface) 자신에서 해당 멤버에 접근이 가능하다.