본문 바로가기

이것저것 스터디📚/JavaScript - Deep Dive

DeepDive - 28장.Number

표준 빌트인 객체인 Number는 원시 타입 숫자를 다룰 때 유용한 프로퍼티와 메서드를 제공한다.

 

28.1 Number 생성자 함수

- 표준 빌트인 객체인 Number 객체는 생성자 함수 객체이기 때문에, new 연산자와 함께 호출하여 Number 인스턴스를 생성

- Number 생성자 함수에 인수를 전달하지 않고 new 연산자와 함께 호출하면 [[NumberData]] 내부 슬롯에 0이 할당된 래퍼 객체 생성

- Number 생성자 함수에 숫자가 아닌 값을 전달하면 강제로 숫자로 변환한 후 [[NumberData]] 내부 슬롯에 할당한다. (숫자로 변할 수 없다면 NaN을 할당한다.)

숫자가 아닌 값을 숫자로 변환하여 [[PrimitiveValue]] 내부 슬롯에 할당
숫자로 변환 불가능한 값은 NaN이 할당


28.2 Number 프로퍼티

28.2.1 Number.EPSILON

 

- ES6에 도입된 Number.EPSILON은 1과 1보다 큰 숫자 중에서 가장 작은 숫자와의 차이와 같다

- Number.EPSILON은 약 2.2204460492503130808472633361816 * 10^-16이다.

 

- 부동소수점을 표현하는 기준인 IEEE 754는 2진법으로 변환했을 때, 무한소수가 되어 미세한 오차가 발생할 수 밖에 없다.

- Number.EPSILON을 사용하면 부동소수점으로 인해 발생하는 오차를 해결할 수 있다.

function isEqual(a, b) {
  // a와 b를 뺀 값의 절대값이 Number.EPSILON보다 작으면 같은 수로 인정한다.
  return Math.abs(a - b) < Number.EPSILON;
}

isEqual(0.1 + 0.2, 0.3); // true

28.2.2 Number.MAX_VALUE

 

- Number.MAX_VALUE는 자바스크립트에서 표현할 수 있는 가장 큰 양수 값이고, Number.MAX_VALUE보다 큰 숫자는 Infinity다.


28.2.3 Number.MIN_VALUE

 

- Number.MIN_VALUE는 자바스크립트에서 표현할 수 있는 가장 작은 양수 값이고, Number.MIN_VALUE보다 작은 숫자는 0이다.


28.2.4 Number.MAX_SAFE_INTEGER

 

- Number.MAX_SAFE_INTEGER는 자바스크립트에서 안전하게 표현할 수 있는 가장 큰 정수값(9007199254740991)이다.

- NUmber.MIN_SAFE_INTEGER는 자바스크립트에서 안전하게 표현할 수 있는 가장 작은 정수값(-9007199254740991)이다.


28.2.5 Number.MIN_SAFE_INTEGER

 

- Number.MIN_SAFE_INTEGER는 자바스크립트에서 안전하게 표현할 수 있는 가장 작은 정수 값이다.


28.2.6 Number.POSITIVE_INFINITY

 

- Number.POSITIVE_INFINITY는 양의 무한대를 나타내는 숫자값 Infinitiy와 같다.


28.2.7 Number.NEGATIVE_INFINITY

 

- Number.NEGATIVE_INFINITY는 음의 무한대를 나타내는 숫자값 -Infinity와 같다.


28.2.8 Number.NAN

 

- Number.NaN은 숫자가 아님(Not-a-Number)을 나타내는 숫자값이며, Number.NaN은 window.NaN과 같다.


28.3 Number 메서드

28.3.1 Number.isFinite

- ES6에서 도입된 Number.isFinite 정적 메서드는 인수로 전달된 숫자값이 정상적인 유한수(Infinity 또는 -Infinity)인지 검사하여 그 결과를 불리언으로 반환한다.

- 인수가 NaN이면 언제나 false를 반환한다.

- Number.isFinite 메서드는 빌트인 전역 함수 isFinite와 차이가 있다.( 빌트인 전역 함수 isFinite는 전달받은 인수를 숫자로 암묵적으로 타입 변환하여 검사 수행)

// Number.isFinite는 인수를 숫자로 암묵적 타입 변환을 하지 않는다.
Number.isFinite(null); // false

// isFinite는 인수를 숫자로 암묵적 타입 변환을 한다. null은 0으로 암묵적 타입 변환된다.
isFinite(null); // true

28.3.2 Number.isInteger

- ES6에서 도입된 Number.isInteger 정적 메서드는 인수로 전달된 숫자 값이 정수인지 검사하여 그 결과를 불리언으로 반환한다.

- 전달된 인수를 숫자로 암묵적 타입 변환하지 않는다.


28.3.3 Number.isNaN

- ES6에서 도입된 Number.isNaN 정적 메서드는 인수로 전달된 숫자 값이 NaN인지 검사하여 그 결과를 불리언으로 반환한다.

- 빌트인 전역 함수 isNaN은 전달받은 인수를 숫자로 암묵적 타입 변환하여 검사를 수행하지만, Number.isNaN은 전달받은 인수를 암묵적 타입 변환하지 않는다.


28.3.4 Number.isSafeInteger

- ES6에서 도입된 Number.isSafeInteger 정적 메서드는 인수로 전달된 숫자값이 안전한 정수(-(2^53 -1)과 2^53 -1 사이 정수)인지 검사하여 그 결과를 불리언으로 반환한다.


28.3.5 Number.prototype.toExponential

- toExponential 메서드는 숫자를 지수 표기법으로 변환하여 문자열로 반환한다.

- 지수 표기법이란, 매우 크거나 작은 숫자를 표기할 때 주로 사용하며 e(Exponent) 앞에 있는 숫자에 10의 n승을 곱하는 형식으로 수를 나타내는 방식이다.

(77.1234).toExponential(); // "7.71234e+1"

// 숫자 리터럴과 함께 Number 프로토타입 메서드를 사용하면 에러가 발생한다.
77.toExponential(); // SyntaxError: Invalid or unexpected token

- 숫자 뒤의 .은 의미는 부동 소수점 숫자의 소수 구분 기호일 수도 있고, 객체 프로퍼티에 접근하기 위한 프로퍼티 접근 연산자일 수도 있다.

- 자바스크립트 엔진은 숫자 뒤의 .을 부동 소수점 숫자의 소수 구분 기호로 해석한다.

- 즉, 위 예제에서 77.toExponential()의 77은 Number 래퍼 객체이고, 77 뒤의 .을 소수 구분 기호로 해석하기 때문에 에러가 발생한다.

- 따라서, 부동 소수점은 하나만 존재하므로 두번째 .을 통해 프로퍼티 접근 연산자를 사용하거나, 그룹 연산자 혹은 공백을 사용해야 한다.

77.1234.toExponential();

(77).toExponential();

77 .toExponential();

28.3.6 Number.prototype.toFixed

- toFixed 메서드는 숫자를 반올림하여 문자열로 반환한다.

- 반올림하는 소수점 이하 자릿수를 나타내는 0~20 사이의 정수값을 인수로 전달할 수 있다.

- 인수를 생략하면 기본값 0이 지정된다.


28.3.7 Number.prototype.toPrecision

- toPrecision 메서드는 인수로 전달받은 전체 자릿수까지 유효하도록 나머지 자릿수를 반올림하여 문자열로 반환한다.
- 인수로 전달받은 전체 자릿수로 표현할 수 없는 경우 지수 표기법으로 결과를 반환한다.

- 전체 자릿수를 나타내는 0~21 사이의 정수값을 인수로 전달할 수 있다.

- 인수를 생략하면 기본값 0이 지정된다.


28.3.8 Number.prototype.toString

- toString 메서드는 숫자를 문자열로 변환하여 반환한다.

- 진법을 나타내는 2~36 사이의 정수값을 인수로 전달할 수 있다.

- 인수를 생략하면 기본값 10 진법이 지정된다.


이웅모 님의〔 모던 자바스크립트 Deep Dive 〕책을 공부하며 정리했습니다.