❓ 지금까지 공부했던 프로그래밍 언어에서는 숫자를 가리키는 데이터 타입이 int, float, double 과 같이 다양한 숫자형 데이터 타입이 존재했는데 왜 자바스크립트는 숫자형 데이터 타입이 Number 하나일까 궁금해서 찾아본 내용들입니다
데이터 타입이란 값의 종류를 말한다. 자바스크립트의 모든 값은 데이터 타입을 갖는다.
Number, String, boolean, undefined, null, symbol, 객체 타입
JavaScript의 Number는 부동 소수점으로 표시됩니다. 이는 정밀도가 제한적이라는 것을 의미하고 따라서 number 타입만으로는 모든 수를 다 표현할 수 없다는 것을 의미합니다. 따라서 Number 타입은 한계치로 다룰 수 있는 값이 존재합니다.
MAX_SAFE_INTEGER, MIN_SAFE_INTEGER을 사용하면 안전하게 계산 할 수 있는 정수값을 알 수 있습니다.
❓ 안전하게 계산 할 수 있다는 의미는 무엇일까?
👉 여기서 안전함이라는 말은 정수를 정확하게 비교할 수 있음을 말합니다.
위의 9007199254740991 값은 2의 53승 -1이라는 값입니다. 따라서 Number 데이터 타입을 통해 계산한 결과가 - (2의 53승 -1) ~ + (2의 53승 -1) 까지는 안전한 결과 값을 계산한다는 사실을 알 수 있습니다.
따라서 MAX_SAFE_INTEGER를 초과하거나 MIN_SAFE_INTEGER보다 작은 결과값으로 평가되는 표현식은 에러는 발생시키지 않지만 정상적인 값을 출력하지 않습니다.
let max = Number.MAX_SAFE_INTEGER;
console.log(max); // 9007199254740991
console.log(max++); // 9007199254740991
// ❌ 값이 변하지 않는다 ❌
현재 Number 데이터 타입의 값이 안전한 값인지 아닌지 확인하기 위해 Number.isSafeInteger 메서드를 통해 확인할 수 있습니다.
let max = Number.MAX_SAFE_INTEGER;
console.log(Number.isSafeInteger(max)); // true
console.log(Number.isSafeInteger(++max)); // false
BigInt 데이터 타입은 위에서 설명한 Number 데이터 타입의 한계로 최근 문법에 추가된 데이터 타입입니다. BigInt는 임의의 정밀도로 정수를 나타낼 수있는 JavaScript의 새로운 숫자 데이터 형입니다.
BigInt를 사용하면 숫자에 대한 안전한 정수 제한을 초과하여 큰 정수를 안전하게 저장하고 조작 할 수 있습니다.
let x = 3;
console.log(typeof x); // number
x = 3n;
console.log(typeof x); // bigint
let x = 3;
console.log(typeof x); // number
x = BigInt(x);
console.log(typeof x); // bigint
1234567890123456789 * 123;
// → 151851850485185200000 ❌
1234567890123456789n * 123n;
// → 151851850485185185047n 👍
1의자리 수를 곱해보면 9 * 3 이므로 마지막 자리수가 7이 나와야 정확한 값으로 계산되는 값인데 BigInt 처리를 안해주고 계산하였을 때는 마지막 자리수가 0으로 정확한 값이 출력이 안됨을 알 수 있습니다.
typeof 1n === 'bigint'; // true
typeof BigInt('1') === 'bigint'; // true
const previousMaxSafe = BigInt(Number.MAX_SAFE_INTEGER);
// ↪ 9007199254740991
const maxPlusOne = previousMaxSafe + 1n;
// ↪ 9007199254740992n
const theFuture = previousMaxSafe + 2n;
// ↪ 9007199254740993n, this works now!
const multi = previousMaxSafe * 2n;
// ↪ 18014398509481982n
const subtr = multi – 10n;
// ↪ 18014398509481972n
const mod = multi % 10n;
// ↪ 2n
const bigN = 2n ** 54n;
// ↪ 18014398509481984n
bigN * -1n
// ↪ –18014398509481984n
❗ 소수점 결과를 포함하는 연산을 BigInt와 사용하면 소수점 이하는 사라집니다.
const rounded = 5n / 2n;
// ↪ 2.5n이 아니라 2n
❗ BigInt는 내장 Math 객체의 메서드와 함께 사용할 수 없습니다.
const x = BigInt(100);
const y = BigInt(200);
console.log(Math.max(x, y)); // ❌ TypeError: Cannot convert a BigInt value to a number at Math.max (<anonymous>)
✔ BigInt는 Number와 일치하지 않지만 동등합니다.
0n === 0
// ↪ false
0n == 0
// ↪ true
✔ Number와 BigInt는 일반적인 방법으로 비교할 수 있습니다
1n < 2
// ↪ true
✔ if, &&, || 또는 Boolean (int)를 사용할 때, BigInt는 Number와 같은 논리를 따릅니다.
if (0n) {
console.log('if에서 안녕!');
} else {
console.log('else에서 안녕!');
}
// ↪ "else에서 안녕!"
0n || 12n
// ↪ 12n
0n && 12n
// ↪ 0n
Boolean(0n)
// ↪ false