자바스크립트

Section 6. 자바스크립트 Number 객체

포칼이 2023. 3. 31. 10:44

I. 생성자 함수

const numObj1 = new Number();
const numObj2 = new Number(123);
const numObj3 = new Number(-123.45);

console.log(numObj1, numObj2, numObj3);//Number {0} Number {123} Number {-123.45}

String 생성자 함수에 이어서 Number 생성자 함수를 살펴보면 위와 같다.

인자가 없을 시 0이 반환되는 것을 볼 수 있다.

Number 생성자 함수도 PrimitiveValue를 살펴보면 다음과 같다.

모두 PrimitiveValue에 원시값이 저장되는 것을 알 수 있다. 

console.log(
  numObj1.valueOf(),
  numObj2.valueOf(),
  numObj3.valueOf()
); //0 123 -123.45

valueOf를 사용해서 원시값을 반환했다. 

 

특정 숫자값으로 인식되는 것들을 살펴보면 다음과 같다.

console.log(
  new Number('-123.4567'),
  new Number('Infinity'),
  new Number(true),
  new Number(false)
); //Number {-123.4567} Number {Infinity} Number {1} Number {0}

NaN

console.log(
  new Number('1/2'),
  new Number('123ABC'),
  new Number('ABC'),
  new Number('{a: 1, b: 2}'),
  new Number([1, 2, 3])
); //Number {NaN} Number {NaN} Number {NaN} Number {NaN} Number {NaN}

new 없이 사용하면 String과 마찬가지로 Number 함수는 주어진 인자를 숫자로 변환하여 반환한다.

const num1 = Number('123');
const num2 = Number('-123.45');
const num3 = Number(true);
const num4 = Number(false);
const num5 = Number(null);

console.log(typeof num1, num1); //number 123
console.log(typeof num2, num2); //number -123.45
console.log(typeof num3, num3); //number 1
console.log(typeof num4, num4); //number 0
console.log(typeof num5, num5); //number 0

 

II. 정적 프로퍼티

1. EPSILON

(Number 형에서 표현 가능한 1보다 큰 가장 작은 수) - 1 한 것을 말한다.

부동소수점으로 인한 계산 오차 문제 해결에 사용한다.

console.log(Number.EPSILON); //2.220446049250313e-16

console.log(0.1 + 0.2); //0.30000000000000004

console.log((0.1 + 0.2) - 0.3 < Number.EPSILON) //true

 

2. MAX_VALUE, MIN_VALUE

자바스크립트에서 표현 가능한 가장 큰 수와 작은 수를 반환하는 프로퍼티이다.

console.log(Number.MAX_VALUE); //1.7976931348623157e+308
console.log(Number.MIN_VALUE); //5e-324

 

3. MAX_SAFE_INTEGER, MIN_SAFE_INTEGER

자바스크립트의 부동소수점 체계에서 안정적으로 나타낼 수 있는 가장 큰 수와 작은 정수를 반환하는 프로퍼티이다.

console.log(Number.MAX_SAFE_INTEGER); //9007199254740991
console.log(Number.MIN_SAFE_INTEGER); //-9007199254740991

더 큰 정수도 표현 자체는 가능하지만 불안정하다. 안전하게 더 큰 정수를 표현하려면 BigInt 타입으로 표현해야 한다.

 

4. POSITIVE_INFINITY, NEGATIVE_INFINITY

양과 음의 Infinity를 반환하는 프로퍼티이다.

console.log(Number.POSITIVE_INFINITY); //Infinity
console.log(Number.NEGATIVE_INFINITY); //-Infinity

 

5. NaN

전역 객체(globalThis)의 NaN과 같은 값을 반환하는 프로퍼티이다.

console.log(Number.NaN); //NaN

 

III. 전역 객체에도 있는 메서드들

a. 동일하지 않음 : isFinite, isNaN

console.log(
  isFinite(null), // null을 0으로 변환
  Number.isFinite(null)
); //true false
console.log(
  isNaN('abc'), // 숫자타입의 NaN으로 변환
  Number.isNaN('abc') // 숫자타입 자체가 아니므로 false
); //true false

중요한 것은 전역 객체 (globalThis)의 해당 메소드와의 차이는 암묵적 타입 변환을 하지 않는다는 것

 

b. 동일함 : parseInt, parseFloat

각각 전역의 동명 메서드들을 가리킨다. parseInt, parseFloat

console.log(
  Number.parseInt('123.4567'),
  Number.parseFloat('123.4567')
); //123 123.4567

 

2. (안전한) 정수 여부 확인 isInteger, isSafeInteger

console.log(
  Number.isInteger(123),
  Number.isInteger(123.45)
); //true false
console.log(
  // 암묵적 변환 하지 않음
  Number.isInteger('123'),
  Number.isInteger(true),
  Number.isInteger(Infinity)
); //false false false
console.log(
  Number.isSafeInteger(123),
  Number.isSafeInteger(123.45)
); //true false
console.log(
  Number.isSafeInteger(Number.MAX_SAFE_INTEGER),
  Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1)
); //true false

 

IV. 인스턴스 메서드

값 자체에서 호출시 괄호로 감싸야 한다. 왜냐하면 소수점과 구분이 불가능하기 때문이다.

 

1. toExponential

지수 표기법으로 나타내는 문자열을 반환하는 메서드이다. 

const numInExp = (123.456789).toExponential();
console.log(
  typeof(numInExp), numInExp
); //string 1.23456789e+2

인자로 자릿수를 제한할 수 있다.

// 인자로 자릿수 제한
console.log(
  (123.456789).toExponential(2),
  (123.456789).toExponential(4),
  (123.456789).toExponential(6)
); //1.23e+2 1.2346e+2 1.234568e+2

 

2. toFixed

최대 인자값으로 주어진 정수 (0~20)만큼 소수점 이하를 반올림하여 문자열로 반환하는 메서드이다.

console.log(
  // 인자가 없으면 0을 받은 것과 같음
  (111.234567).toFixed(),
  (111.234567).toFixed(0)
); //111 111

console.log(
  (111.234567).toFixed(1),
  (111.234567).toFixed(2)
); //111.2 111.23

console.log(
  // 반올림
  (111.234567).toFixed(3),
  (111.234567).toFixed(4)
); //111.235 111.2346

 

3. toPrecision

반올림과 지수 표기법을 사용하여 문자열을 반환하는 메서드이다. 

console.log(
  // 인자가 없으면 toString처럼 그대로 문자열로 반환
  (1234.56789).toPrecision()
); //1234.56789

인자가 정수부 자릿수보다 적으면 지수로 반환한다.

console.log(
  (1234.56789).toPrecision(1),
  (1234.56789).toPrecision(2),
  (1234.56789).toPrecision(3)
); /1e+3 1.2e+3 1.23e+3
// 반올림
console.log(
  (1234.56789).toPrecision(4),
  (1234.56789).toPrecision(6),
  (1234.56789).toPrecision(8)
); //1235 1234.57 1234.5679

 

4. toString

문자열 값을 반환하는 메서드이다.

인자 2~36가 주어지면 해당 수의 진수로 표현한다.

console.log(
  (11).toString(),
  (11).toString(2),
  (11).toString(8),
  (11).toString(16)
); //11 1011 13 b