본문 바로가기
Javascript

[JS] 8번째 데이터 타입 BigInt

by F.E.D 2018. 6. 7.

8번째 데이터 타입 BigInt

BigInt는 임의의 정밀도로 정수를 나타낼 수있는 JavaScript의 새로운 숫자 데이터형입니다. 
BigInt를 사용하면 숫자에 대한 안전한 정수 제한을 초과하여 큰 정수를 안전하게 저장하고 조작 할 수 있습니다. 
Chrome 67의 새로운 기능으로 최근에 업데이트 되었습니다.

사용사례

BigInt를 사용하면 오버플로없이 정수 연산을 올바르게 수행 할 수 있습니다. 
그것은 그 자체로 수많은 새로운 가능성을 가능하게합니다. 
많은 수의 수학 연산은 금융 기술에서 일반적으로 사용됩니다.

큰 정수 ID와 고정밀 타임 스탬프는 JavaScript에서 숫자로 표시할 수 없었습니다.
이로 인해 실제 버그가 생겨 문자열로 변환해서 표현합니다.
BigInt를 사용하면이 데이터를 숫자 값으로 나타낼 수 있습니다.

BigInt는 최종적인 BigDecimal 구현의 기초를 형성 할 수 있습니다. 
이것은 십진법 정밀도로 돈의 합계를 표현하고 이들을 정확하게 조작하는 데 유용합니다 
(예 : 0.10 + 0.20! == 0.30).

이전에는 이러한 사용사례를 사용하는 JavaScript 애플리케이션이 BigInt과 같은 기능을 에뮬레이트하는 사용자 영역 라이브러리에 의존해야했습니다. 
BigInt가 널리 보급되면 이러한 응용 프로그램은 원시 런타임 BigInt를 위해 이러한 런타임 의존성을 제거 할 수 있습니다. 
이렇게하면 로드시간, 구문분석시간 및 컴파일시간이 단축되고 런타임 성능이 크게 향상됩니다.

"Polyfilling" BigInt는 비슷한 기능을 구현하는 런타임 라이브러리와 새로운 구문을 라이브러리의 API 호출로 바꾸는 변환 단계를 필요로합니다. 
Babel은 현재 플러그인을 통해 BigInt 리터럴을 구문 분석 할 수 있지만 이를 변환 하지않습니다. 
따라서 우리는 BigInt가 광범위한 브라우저 간 호환성을 필요로하는 제작 사이트에서 사용될 것으로 기대하지 않습니다. (ex ie 하위 브라우저)
하지만 Chrome 67의 새로운 기능으로 현재 BigInt를 콘솔창에서 실험해 보실 수 있습니다.

Number

JavaScript의 Number는 부동 소수점으로 표시됩니다. 이는 정밀도가 제한적이라는 것을 의미합니다. Number.MAX_SAFE_INTEGER 상수는 안전하게 증가 할 수있는 가능한 최대 정수를 제공합니다. 
그 값은 2 ** 53-1입니다.

1
2
const max = Number.MAX_SAFE_INTEGER;
// → 9_007_199_254_740_991
cs

여기에서 1을 증가시키면

1
2
max + 1;
// → 9_007_199_254_740_992 ✅
cs

이렇게 표시됩니다. 하지만, 두 번째로 증가시키면 더이상 integer max 범위에 들어가지 않기 때문에 오류가 납니다.

1
2
max + 2;
// → 9_007_199_254_740_992 ❌
cs


max + 1이 max + 2와 같은 결과를내는 것에 유의하십시오.

JavaScript에서이 특정 값을 얻을 때마다 정확성 여부를 알 수있는 방법이 없습니다. 

안전한 정수 범위를 벗어나는 정수 (즉, Number.MIN_SAFE_INTEGER에서 Number.MAX_SAFE_INTEGER까지)에 대한 계산은 잠재적으로 정밀도를 잃게됩니다. 

이러한 이유 때문에 안전 범위 내의 숫자 정수 값만 신뢰할 수 있습니다.


BigInt

BigInt는 임의의 정밀도로 정수를 나타낼 수있는 JavaScript의 새로운 숫자 데이터 형입니다. 
BigInt를 사용하면 숫자에 대한 안전한 정수 제한을 초과하여 큰 정수를 안전하게 저장하고 조작 할 수 있습니다. BigInt를 만들려면 모든 정수 리터럴에 n 접미사를 추가하십시오. 
예를 들어 123은 123n이됩니다. 
전역 BigInt (number) 함수를 사용하여 Number를 BigInt로 변환 할 수 있습니다. 
즉, BigInt (123) === 123n. 
이제 더이상 정수의 제한을 염려하며 걱정할 필요가 없습니다.

1
2
BigInt(Number.MAX_SAFE_INTEGER) + 2n;
// → 9_007_199_254_740_993n ✅
cs

1
2
3
4
5
1234567890123456789 * 123;
// → 151851850485185200000 ❌
 
1234567890123456789n * 123n;
// → 151851850485185185047n ✅
cs

최하위 숫자 인 9와 3을 보면 곱셈의 결과가 7로 끝나야한다는 것을 알 수 있습니다 (9 * 3 === 27이므로). 

그러나 BigInt를 사용하지않으면 결과는 0으로 끝납니다. 


BigInt는 JavaScript 언어의 새로운 기본 요소입니다.

따라서 typeof 연산자를 사용하여 감지 할 수있는 자체 유형을 얻습니다.


1
2
3
4
typeof 123;
// → 'number'
typeof 123n;
// → 'bigint'
cs


BigInt는 별개의 형이므로, BigInt는 절대적으로 Number와 동일하지 않습니다. 

42n! == 42. 

BigInt를 Number와 비교하려면 비교하기 전에 하나를 다른 유형으로 변환하거나 ==을 사용합니다.


1
2
3
4
42n === BigInt(42);
// → true
42n == 42;
// → true
cs


if, &&, || 또는 Boolean (int)를 사용할 때, BigInt는 Number와 같은 논리를 따릅니다.


1
2
3
4
5
6
if (0n) {
  console.log('if');
else {
  console.log('else');
}
// → logs 'else', because `0n` is falsy.
cs

위와 같이 int 0 도 falsy 이기 때문에 0n도 falsy입니다.



BigInt는 가장 일반적인 연산자를 지원합니다. 

이진 +, -, * 및 **는 모두 예상대로 작동합니다. 

/와 %가 작동하고 필요에 따라 0으로 반올림합니다. 


1
2
3
4
(7 + 6 - 5* 4 ** 3 / 2 % 3;
// → 1
(7n + 6n - 5n) * 4n ** 3n / 2n % 3n;
// → 1n
cs


하나 주의할 점은 BigInt와 Number간에 연산을 혼합 할 수 없다는 것입니다. 

어떤 암묵적인 강압이라도 정보를 잃을 수 있기 때문에 이것은 좋은 일입니다. 다음 예제를 고려하십시오.


1
2
BigInt(Number.MAX_SAFE_INTEGER) + 2.5;
// → ?? 🤔
cs


이 규칙에 대한 유일한 예외는 === 및 = 와 같은 비교 연산자입니다. 

부울을 반환하기 때문에 정밀도가 손실 될 위험이 없습니다.


1
2
3
4
1 + 1n;
// → TypeError
123 < 124n;
// → true
cs


또 하나 주목해야 할 것은 >>> 연산자는 BigInt에서 의미가 없다는 것입니다. 



API

몇 가지 새로운 BigInt 특정 API를 사용할 수 있습니다.
전역 BigInt 생성자는 Number 생성자와 유사합니다. 
즉, 인수를 BigInt로 변환합니다.
변환에 실패하면 SyntaxError 또는 RangeError 예외가 발생합니다.

1
2
3
4
5
6
BigInt(123);
// → 123n
BigInt(1.5);
// → RangeError
BigInt('1.5');
// → SyntaxError
cs

두 라이브러리 함수는 부호있는 또는 부호없는 정수로 BigInt 값을 래핑 할 수 있으며 특정 비트 수로 제한됩니다.
BigInt.asIntN(width, value) BigInt 값을 2진 부호 정수로 래핑하고 
BigInt.asUintN (width, value)은 BigInt 값을 2 진 부호없는 정수로 래핑합니다.

예를 들어 64 비트 산술 연산을 수행하는 경우 다음 API를 사용하여 적절한 범위 내에 머물 수 있습니다.

1
2
3
4
5
6
7
8
// 가장 큰 BigInt값은 64-bit 정수로 나타낼 수 있습니다.
const max = 2n ** (64n - 1n) - 1n;
BigInt.asIntN(64, max);
→ 9223372036854775807n
BigInt.asIntN(64, max + 1n);
// → -9223372036854775808n
// 음수값으로 나타나는 이유는 한계치를 초과했기 때문입니다.
cs

64 비트 정수 범위를 초과하는 BigInt 값(즉, 절대 값의 경우 63 비트 + 부호의 경우 1 비트)을 전달하는 즉시 오버플로가 발생합니다.

BigInt를 사용하면 다른 프로그래밍 언어에서 일반적으로 사용되는 64 비트 부호있는 및 부호없는 정수를 정확하게 나타낼 수 있습니다. 

BigInt64Array와 BigUint64Array의 두 가지 새로운 배열 형식을 사용하면 이러한 값의 목록을 효율적으로 나타내고 조작 할 수 있습니다.

1
2
3
4
5
6
7
8
9
const view = new BigInt64Array(4);
// → [0n, 0n, 0n, 0n]
view.length;
// → 4
view[0];
// → 0n
view[0= 42n;
view[0];
// → 42n

cs


BigInt64Array 형식은 값이 부호있는 64비트 제한 내에 있는지 확인합니다.




출처 : https://developers.google.com/web/updates/2018/05/bigint

'Javascript' 카테고리의 다른 글

[JS] GITHUB이 Jquery를 삭제하다  (0) 2019.01.26
[JS] Map vs ForEach  (2) 2018.08.25
[jQuery] $.grep 과 $.map  (0) 2018.05.29
함수 선언식 && 표현식 && 호이스팅  (0) 2018.04.17
ES 2017 및 ES 2018에 대한 새로운 기능 (1)  (0) 2018.04.15

댓글