ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JS] 8번째 데이터 타입 BigInt
    Javascript 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입니다.

    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
Designed by Tistory.