이 글은 '이웅모'님의 '모던 자바스크립트 Deep Dive' 책을 통해 공부한 내용을 정리한 글입니다. 저작권 보호를 위해 책의 내용은 요약되었습니다.
표준 빌트인 객체인 Number 객체는 new 연산자와 함께 호출하여 Number 인스턴스를 생성할 수 있다. new 연산자를 사용하지 않으면 인스턴스 대신 숫자를 반환한다. 이를 통해 명시적 타입 변환을 할 수 있다.
다양한 프로퍼티가 있지만 사용할 수도 있을 법한 프로퍼티만 정리하였다.
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
Infinity > Number.MAX_VALUE // true
0 < Number.MIN_VALUE // true
Number.MAX_SAFE_INTEGER; // 9007199254740991
Number.MIN_SAFE_INTEGER; // -9007199254740991
프로퍼티와 마찬가지로 사용할 법한 메서드만 정리하였다.
Number.isFinite(0); // true
Number.isFinite(Infinity); // false
Number.isInteger(10); //true
Number.isInteger(0.5); // false
Number.isSafeInteger(10); // true
Number.isSafeInteger(2**53); // false
Number.isSafeInteger(0.5); // false 정수가 아님
Number.isSafeInteger("123"); // false 암묵적 형 변환을 하지않음
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("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("12.345"); // 12.345
Number.parseFloat("12.1hello"); // 12.1
Number.parseFloat("hello2022.10"); // NaN
Number.parseFloat === parseFloat // true
(12.355).toFixed(); // '12'
(12.355).toFixed(1); // '12.4'
(12.355).toFixed(2); // '12.36'
(16).toString(); // '10'
(16).toString(2); // '10000'
(16).toString(8); // '20'
(10).toString(16); // 'a'
위에서 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()는 전달받은 인수를 특정 진수로 변환해야할 때 쓰는 것이 좋겠다.