Number 프로퍼티와 Number 메서드

se-een·2022년 9월 28일
0
post-thumbnail

이 글은 '이웅모'님의 '모던 자바스크립트 Deep Dive' 책을 통해 공부한 내용을 정리한 글입니다. 저작권 보호를 위해 책의 내용은 요약되었습니다.

Number 생성자 함수

표준 빌트인 객체인 Number 객체는 new 연산자와 함께 호출하여 Number 인스턴스를 생성할 수 있다. new 연산자를 사용하지 않으면 인스턴스 대신 숫자를 반환한다. 이를 통해 명시적 타입 변환을 할 수 있다.


Number 프로퍼티

다양한 프로퍼티가 있지만 사용할 수도 있을 법한 프로퍼티만 정리하였다.

Number.EPSILON

  • 부동소수점으로 인해 발생하는 오차를 해결하기 위해 사용한다.
  • 1과 1보다 큰 숫자 중에서 가장 작은 숫자와의 차이이다.
function equalFunc(a, b) {
  return Math.abs(a-b) < Number.EPSILON;
}

console.log(0.1 + 0.2 === 0.3); // false
equalFunc(0.1 + 0.2, 0.3); // true

Number.MAX_VALUE, Number.MIN_VALUE

  • JS에서 표현할 수 있는 가장 큰 양수 값(MAX_VALUE)
  • JS에서 표현할 수 있는 가장 작은 양수 값(MIN_VALUE)
Infinity > Number.MAX_VALUE // true
0 < Number.MIN_VALUE // true

Number.MAX_SAFE_INTEGER, Number.MIN_SAFE_INTEGER

  • JS에서 안전하게 표현할 수 있는 가장 큰 양의 정수값(MAX)
  • JS에서 안전하게 표현할 수 있는 가장 작은 음의 정수값(MIN)
Number.MAX_SAFE_INTEGER; // 9007199254740991
Number.MIN_SAFE_INTEGER; // -9007199254740991

Number 메서드

프로퍼티와 마찬가지로 사용할 법한 메서드만 정리하였다.

Number.isFinite

  • 기능 : 전달된 인수가 Infinity 또는 -Infinity가 아닌지 검사
  • 반환 : true 또는 false
Number.isFinite(0); // true
Number.isFinite(Infinity); // false

Number.isInteger

  • 기능 : 전달된 인수가 정수값인지 검사
  • 반환 : true 또는 false
Number.isInteger(10); //true
Number.isInteger(0.5); // false

Number.isSafeInteger

  • 기능 : 전달된 인수가 안전한 정수인지 검사
  • 반환 : true 또는 false
Number.isSafeInteger(10); // true
Number.isSafeInteger(2**53); // false
Number.isSafeInteger(0.5); // false 정수가 아님
Number.isSafeInteger("123"); // false 암묵적 형 변환을 하지않음

Number.isNaN

  • 기능 : 전달된 인수가 NaN인지 검사
  • 반환 : true 또는 false
  • 전역함수 isNaN과 차이
    • 암묵적인 형 변환
Number.isNaN(NaN); // true
Number.isNaN(undefined); // false
Number.isNaN(10); // false

// window.isNaN()
isNaN(NaN); // true
isNaN(undefined); // true
isNaN(10); // false

Number.isNaN === isNaN // false

Number.parseInt

  • 기능 : 전달받은 문자열 인수를 특정 진수의 정수로 변환
  • 반환 : 특정 진수의 정수
  • 전역함수 parseInt와 차이
    • MDN에 의하면 둘은 동일하다고 한다.
Number.parseInt("123"); // 123
Number.parseInt("123", 10); // 123
Number.parseInt("123", 16); // 291
Number.parseInt("2and1", 10); // 2
Number.parseInt("hello2022", 10); // NaN

Number.parseInt === parseInt // true

Number.parseFloat

  • 기능 : 전달받은 문자열 인수를 부동 소수점 숫자(실수)로 변환
  • 반환 : 실수
  • 전역함수 parseFloat와 차이
    • MDN에 의하면 둘은 동일하다고 한다.
Number.parseFloat("12.345"); // 12.345
Number.parseFloat("12.1hello"); // 12.1
Number.parseFloat("hello2022.10"); // NaN

Number.parseFloat === parseFloat // true

Number.prototype.toFixed

  • 기능 : 전달받은 인수의 자릿수만큼 반올림하고 수를 문자열로 반환한다.
  • 반환 : 문자열
(12.355).toFixed(); // '12'
(12.355).toFixed(1); // '12.4'
(12.355).toFixed(2); // '12.36'

Number.prototype.toString

  • 기능 : 전달받은 인수를 진법으로 하여 수를 문자열로 반환한다.
  • 반환 : 문자열
(16).toString(); // '10'
(16).toString(2); // '10000'
(16).toString(8); // '20'
(10).toString(16); // 'a'

parseInt() VS Number()

위에서 Number 생성자를 new 없이 호출하여 명시적 타입 변환에 사용한다고도 하였다. 전역함수 parseInt() 또한 전달받은 인수의 문자열을 특정 진수의 정수로 변환해주는 함수이다. 그렇다면 전역함수 parseInt()와 Number()는 어떤 차이가 있을까? 레딧을 참고해보니 다음과 같다.

1. 암묵적인 형 변환

parseInt([10, "ABC"]); // 10
Number([10, "ABC"]); // NaN

2. 전달받은 인수의 첫 번째 문자가 숫자인 경우

parseInt("2and1", 10); // 2
Number("2and1") // NaN

3. Infinity 처리 여부

parseInt(Number.MAX_VALUE * 2); // NaN
Number(Number.MAX_VALUE * 2); // Infinity

4. 그 외에도 음의 지수 문제, 속도(체감 될 정도는 아니라고 한다.), 가독성 등이 있다고 한다.

따라서 명시적 타입 변환에는 되도록 Number()를 사용하는 것이 좋은 습관인 것 같다. parseInt()는 전달받은 인수를 특정 진수로 변환해야할 때 쓰는 것이 좋겠다.

profile
woowacourse 5th FE

0개의 댓글