-
[JS] 8번째 데이터 타입 BigIntJavascript 2018. 6. 7. 15:33
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입니다.12const max = Number.MAX_SAFE_INTEGER;// → 9_007_199_254_740_991cs 여기에서 1을 증가시키면12max + 1;// → 9_007_199_254_740_992 ✅cs 이렇게 표시됩니다. 하지만, 두 번째로 증가시키면 더이상 integer max 범위에 들어가지 않기 때문에 오류가 납니다.12max + 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.이제 더이상 정수의 제한을 염려하며 걱정할 필요가 없습니다.12BigInt(Number.MAX_SAFE_INTEGER) + 2n;// → 9_007_199_254_740_993n ✅cs 123451234567890123456789 * 123;// → 151851850485185200000 ❌1234567890123456789n * 123n;// → 151851850485185185047n ✅cs 최하위 숫자 인 9와 3을 보면 곱셈의 결과가 7로 끝나야한다는 것을 알 수 있습니다 (9 * 3 === 27이므로).
그러나 BigInt를 사용하지않으면 결과는 0으로 끝납니다.
BigInt는 JavaScript 언어의 새로운 기본 요소입니다.
따라서 typeof 연산자를 사용하여 감지 할 수있는 자체 유형을 얻습니다.
1234typeof 123;// → 'number'typeof 123n;// → 'bigint'cs BigInt는 별개의 형이므로, BigInt는 절대적으로 Number와 동일하지 않습니다.
42n! == 42.
BigInt를 Number와 비교하려면 비교하기 전에 하나를 다른 유형으로 변환하거나 ==을 사용합니다.
123442n === BigInt(42);// → true42n == 42;// → truecs if, &&, || 또는 Boolean (int)를 사용할 때, BigInt는 Number와 같은 논리를 따릅니다.
123456if (0n) {console.log('if');} else {console.log('else');}// → logs 'else', because `0n` is falsy.cs 위와 같이 int 0 도 falsy 이기 때문에 0n도 falsy입니다.
BigInt는 가장 일반적인 연산자를 지원합니다.
이진 +, -, * 및 **는 모두 예상대로 작동합니다.
/와 %가 작동하고 필요에 따라 0으로 반올림합니다.
1234(7 + 6 - 5) * 4 ** 3 / 2 % 3;// → 1(7n + 6n - 5n) * 4n ** 3n / 2n % 3n;// → 1ncs 하나 주의할 점은 BigInt와 Number간에 연산을 혼합 할 수 없다는 것입니다.
어떤 암묵적인 강압이라도 정보를 잃을 수 있기 때문에 이것은 좋은 일입니다. 다음 예제를 고려하십시오.
12BigInt(Number.MAX_SAFE_INTEGER) + 2.5;// → ?? 🤔cs 이 규칙에 대한 유일한 예외는 === 및 = 와 같은 비교 연산자입니다.
부울을 반환하기 때문에 정밀도가 손실 될 위험이 없습니다.
12341 + 1n;// → TypeError123 < 124n;// → truecs 또 하나 주목해야 할 것은 >>> 연산자는 BigInt에서 의미가 없다는 것입니다.
API
몇 가지 새로운 BigInt 특정 API를 사용할 수 있습니다.전역 BigInt 생성자는 Number 생성자와 유사합니다.즉, 인수를 BigInt로 변환합니다.변환에 실패하면 SyntaxError 또는 RangeError 예외가 발생합니다.123456BigInt(123);// → 123nBigInt(1.5);// → RangeErrorBigInt('1.5');// → SyntaxErrorcs 두 라이브러리 함수는 부호있는 또는 부호없는 정수로 BigInt 값을 래핑 할 수 있으며 특정 비트 수로 제한됩니다.BigInt.asIntN(width, value) BigInt 값을 2진 부호 정수로 래핑하고BigInt.asUintN (width, value)은 BigInt 값을 2 진 부호없는 정수로 래핑합니다.예를 들어 64 비트 산술 연산을 수행하는 경우 다음 API를 사용하여 적절한 범위 내에 머물 수 있습니다.12345678// 가장 큰 BigInt값은 64-bit 정수로 나타낼 수 있습니다.const max = 2n ** (64n - 1n) - 1n;BigInt.asIntN(64, max);→ 9223372036854775807nBigInt.asIntN(64, max + 1n);// → -9223372036854775808n// 음수값으로 나타나는 이유는 한계치를 초과했기 때문입니다.cs 64 비트 정수 범위를 초과하는 BigInt 값(즉, 절대 값의 경우 63 비트 + 부호의 경우 1 비트)을 전달하는 즉시 오버플로가 발생합니다.BigInt를 사용하면 다른 프로그래밍 언어에서 일반적으로 사용되는 64 비트 부호있는 및 부호없는 정수를 정확하게 나타낼 수 있습니다.BigInt64Array와 BigUint64Array의 두 가지 새로운 배열 형식을 사용하면 이러한 값의 목록을 효율적으로 나타내고 조작 할 수 있습니다.123456789const view = new BigInt64Array(4);// → [0n, 0n, 0n, 0n]view.length;// → 4view[0];// → 0nview[0] = 42n;view[0];// → 42nBigInt64Array 형식은 값이 부호있는 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