Javascript Bigint – 최신 JavaScript에 대한 필수 가이드

문제를 제거하기 위해 도구를 사용해보십시오

Javascript Bigint – 최신 JavaScript에 대한 필수 가이드

JavaScript에서 Number 유형은 253보다 큰 정수 값을 안전하게 나타낼 수 없습니다. 이 제한으로 인해 개발자는 비효율적인 해결 방법과 타사 라이브러리를 사용해야 했습니다. BigInt는 이를 수정하기 위한 새로운 데이터 유형입니다.

|_+_| 데이터 유형은 JavaScript를 활성화하는 것을 목표로 합니다.
|_+_|에서 지원하는 범위보다 큰 정수 값을 나타내는 프로그래머 데이터 형식. 임의의 정밀도로 정수를 나타내는 기능은 큰 정수에 대해 수학 연산을 수행할 때 특히 중요합니다. |_+_|를 사용하면 정수 오버플로가 더 이상 문제가 되지 않습니다.

또한 해결 방법을 사용하지 않고도 고해상도 타임스탬프, 큰 정수 ID 등으로 안전하게 작업할 수 있습니다. |_+_|현재 3단계 제안입니다. 사양에 추가되면 JavaScript에서 두 번째 숫자 데이터 유형이 되어 지원되는 총 데이터 유형 수가 8개가 됩니다.



플러터 앱바 뒤로가기 버튼
  • 부울
  • 없는
  • 찾으시는 주소가 없습니다
  • 숫자
  • BigInt
  • 상징
  • 물체

이 기사에서는 |_+_| |__+_|의 한계를 극복하는 데 어떻게 도움이 되는지 알아보세요 자바스크립트를 입력합니다.

문제

JavaScript에 명시적 정수 유형이 없다는 것은 다른 언어에서 온 프로그래머에게 종종 당혹스럽습니다. 많은 프로그래밍 언어는 float, double, integer 및 bignum과 같은 여러 숫자 유형을 지원하지만 JavaScript에서는 그렇지 않습니다. JavaScript에서 모든 숫자는 배정밀도 64비트 부동 소수점 형식 에 의해 정의된 IEEE 754-2008 기준.

이 표준에서는 정확하게 표현할 수 없는 매우 큰 정수는 자동으로 반올림됩니다. 정확히 말하면 |_+_| JavaScript의 type은 -9007199254740991(-(253-1))에서 9007199254740991(253-1) 사이의 정수만 안전하게 표현할 수 있습니다. 이 범위를 벗어나는 모든 정수 값은 정밀도를 잃을 수 있습니다.

이는 다음 코드를 실행하여 쉽게 확인할 수 있습니다.

BigInt

이 정수는 JavaScript가 |_+_|로 안정적으로 나타낼 수 있는 가장 큰 수보다 큽니다. 원어. 따라서 둥글다. 예상치 못한 반올림은 프로그램의 안정성과 보안을 손상시킬 수 있습니다. 다른 예는 다음과 같습니다.

Number

자바스크립트는 |_+_| JavaScript에서 최대 안전 정수를 빠르게 얻을 수 있는 상수입니다. 마찬가지로 |_+_|를 사용하여 최소 안전 정수를 얻을 수 있습니다. 일정한:

BigInt

해결책

이러한 제한 사항에 대한 해결 방법으로 일부 JavaScript 개발자는 |_+_| 유형. NS 트위터 API 예를 들어 JSON으로 응답할 때 개체에 ID의 문자열 버전을 추가합니다. 또한 다음과 같은 여러 라이브러리 빅넘버.js 큰 정수로 더 쉽게 작업할 수 있도록 개발되었습니다.

|_+_|를 사용하면 응용 프로그램에서 더 이상 |_+_| 이상의 정수를 안전하게 나타내기 위해 해결 방법이나 라이브러리가 필요하지 않습니다. 그리고 |_+_|. 큰 정수에 대한 산술 연산은 이제 정밀도 손실 위험 없이 표준 JavaScript에서 수행할 수 있습니다. 타사 라이브러리에 비해 기본 데이터 유형을 사용하는 추가 이점은 런타임 성능이 향상된다는 것입니다.

|_+_|를 만들려면 정수 끝에 n을 추가하기만 하면 됩니다. 비교하다:

BigInt

또는 |_+_| 건설자:

BigInt

|_+_| 리터럴은 2진법, 8진법 또는 16진법 표기법으로도 작성할 수 있습니다.

엔지니어링 관리자 인터뷰 크래킹
Number

완전 항등 연산자를 사용하여 |_+_| 동일한 유형이 아니기 때문에 일반 번호로:

Number

대신 피연산자를 비교하기 전에 암시적 유형 변환을 수행하는 등호 연산자를 사용할 수 있습니다.

console.log(9999999999999999); // → 10000000000000000

단항 더하기(|_+_|) 연산자를 제외한 모든 산술 연산자는 |_+_|에 사용할 수 있습니다.

Number

단항 더하기(|_+_|) 연산자가 지원되지 않는 이유는 일부 프로그램이 |_+_| 항상 |_+_|를 생성하거나 예외를 던집니다. |_+_|의 동작 변경 또한 asm.js 코드를 깨뜨릴 것입니다.

당연히 |_+_|피연산자와 함께 사용할 때 산술 연산자는 |_+_|값을 반환할 것으로 예상됩니다. 따라서 나눗셈 |_+_|연산자의 결과는 자동으로 가장 가까운 정수로 내림됩니다. 예를 들어:

// notice the last digits 9007199254740992 === 9007199254740993; // → true

암시적 유형 변환

암시적 유형 변환은 정보를 잃을 수 있으므로 |_+_| 그리고 |_+_| 허락되지 않는다. 큰 정수와 부동 소수점 숫자를 혼합하면 결과 값이 |_+_| 또는 |_+_|로 정확하게 표현되지 않을 수 있습니다. 다음 예를 고려하십시오.

Number.MAX_SAFE_INTEGER

이 표현식의 결과는 |_+_|와 숫자의 도메인 외부에 있습니다. A |_+_| 소수 부분이 있는 는 BigInt로 정확하게 변환될 수 없습니다. 그리고 |_+_|253보다 크면 |_+_|로 정확하게 변환될 수 없습니다.

이 제한으로 인해 |_+_|r 및 |_+_|피연산자를 혼합하여 산술 연산을 수행할 수 없습니다. |_+_|도 통과할 수 없습니다. 숫자를 기대하는 Web API 및 내장 JavaScript 함수에. 그렇게 하려고 하면 |_+_|가 발생합니다.

엔비디아 드라이버 우분투 18.04 설치
Number.MIN_SAFE_INTEGER

관계 연산자는 다음 예와 같이 이 규칙을 따르지 않습니다.

const minInt = Number.MIN_SAFE_INTEGER; console.log(minInt); // → -9007199254740991 console.log(minInt - 5); // → -9007199254740996 // notice how this outputs the same value as above console.log(minInt - 4); // → -9007199254740996

|_+_|를 사용하여 산술 계산을 수행하려는 경우 및 |_+_|, 먼저 작업이 수행되어야 하는 도메인을 결정해야 합니다. 그렇게 하려면 |_+_|또는|_+_|를 호출하여 피연산자 중 하나를 변환하기만 하면 됩니다.

String

부울 컨텍스트에서 발생하면 |_+_| |_+_|와 유사하게 처리됩니다. 즉, |_+_| 0n이 아닌 한 참 값으로 간주됩니다.

BigInt

|_+_|및 |_+_|의 배열을 정렬할 때 암시적 유형 변환이 발생하지 않습니다.

빙구스 토큰 구매처
Number.MAX_SAFE_INTEGER

|_+_|, |_+_|, |_+_|, |_+_| 및 |_+_|와 같은 비트 연산자 작동 |_+_| 숫자와 비슷한 방식으로. 음수는 무한 길이의 2의 보수로 해석됩니다. 혼합 피연산자는 허용되지 않습니다. 여기 몇 가지 예가 있어요.

Number.Min_SAFE_INTEGER

BigInt 생성자

다른 기본 유형과 마찬가지로 |_+_| 생성자 함수를 사용하여 생성할 수 있습니다. |_+_|에 전달된 인수 자동으로 |_+_|로 변환됩니다. 가능하다면:

BigInt

변환할 수 없는 데이터 유형 및 값은 예외를 throw합니다.

console.log(9007199254740995n); // → 9007199254740995n console.log(9007199254740995); // → 9007199254740996

a|_+_|에서 직접 산술 연산을 수행할 수 있습니다. 생성자를 사용하여 생성:

BigInt()

완전 항등 연산자의 피연산자로 사용되는 경우 |_+_| 생성자를 사용하여 생성된 것은 일반 생성자와 유사하게 처리됩니다.

BigInt('9007199254740995'); // → 9007199254740995n

라이브러리 기능

JavaScript는 |_+_|값을 부호 있는 정수 또는 부호 없는 정수로 나타내는 두 가지 라이브러리 함수를 제공합니다.

이미지제목입니다

angularjs 서버에 파일 업로드

이러한 함수는 64비트 산술 연산을 수행할 때 특히 유용합니다. 이렇게 하면 의도한 범위 내에 머물 수 있습니다.

브라우저 지원 및 트랜스파일

이 글을 쓰는 시점에서 Chrome +67 및 Opera +54는 |_+_| 데이터 형식. 불행히도 Edge와 Safari는 아직 구현하지 않았습니다. Firefox는 지원하지 않습니다 |_+_| 기본적으로 설정되어 있지만 설정|_+_| about:config에서 |__+_|로. 지원되는 브라우저의 최신 목록은 사용해도 되나요 ….

불행히도, 트랜스파일 |_+_| 이다 매우 복잡한 과정 , 상당한 런타임 성능 패널티가 발생합니다. 제안이 여러 기존 연산자의 동작을 변경하기 때문에 |_+_|를 직접 폴리필하는 것도 불가능합니다. 현재로서는 더 나은 대안은 다음을 사용하는 것입니다. JSBI |__+_|의 순수 JavaScript 구현인 라이브러리 제안.

이 라이브러리는 네이티브 |_+_|와 정확히 동일하게 동작하는 API를 제공합니다. JSBI를 사용하는 방법은 다음과 같습니다.

BigInt

JSBI 사용의 장점은 브라우저 지원이 향상되면 코드를 다시 작성할 필요가 없다는 것입니다. 대신 JSBI 코드를 네이티브 |_+_|로 자동 컴파일할 수 있습니다. babel 플러그인을 사용하여 코드를 작성합니다. 또한 JSBI의 성능은 기본 |_+_| 구현. |_+_|에 대한 더 넓은 브라우저 지원을 기대할 수 있습니다. 곧.

결론

|_+_| 정수 값이 |_+_|데이터 유형에서 지원하는 범위보다 클 때 사용하기 위한 새로운 데이터 유형입니다. 이 데이터 유형을 사용하면 라이브러리를 사용할 필요 없이 큰 정수에 대한 산술 연산을 안전하게 수행하고, 고해상도 타임스탬프를 나타내고, 큰 정수 ID를 사용하는 등의 작업을 수행할 수 있습니다.

|_+_|및 |_+_|t 피연산자를 혼합하여 산술 연산을 수행할 수 없음을 명심하는 것이 중요합니다. 피연산자 중 하나를 명시적으로 변환하여 작업이 수행되어야 하는 도메인을 결정해야 합니다. 또한 호환성을 위해 |_+_|에 단항 더하기(|_+_|) 연산자를 사용할 수 없습니다.

#자바스크립트

또한보십시오: