Number 객체 - 원시 타입 number를 다룰 때 유용한 프로퍼티와 메소드를 제공하는 레퍼(wrapper) 객체
변수 또는 객체의 프로퍼티가 숫자를 값으로 가지고 있다면 Number 객체의 별도 생성없이 Number 객체의 프로퍼티와 메소드를 사용 가능
원시 타입이 wrapper 객체의 메소드를 사용할 수 있는 이유 - 원시 타입으로 프로퍼티나 메소드를 호출할 때 원시 타입과 연관된 wrapper 객체로 일시적으로 변환되어 프로토타입 객체를 공유하기 때문
Number() 생성자 함수를 통해 Number 객체 생성
new Number(value);
인자가 숫자로 변환될 수 없다면 NaN을 반환
var x = new Number(123);
var z = new Number('str');
console.log(x); // 123
console.log(z); // NaN
new 연산자를 붙이지 않으면 Number 객체를 반환하지 않고 원시 타입 숫자를 반환
일반적으로 숫자를 사용할 때는 원시 타입 숫자를 사용
console.log(typeof 123); // number
console.log(typeof new Number(123)); // object
Number 객체 Property
console.log(0.1 + 0.2); // 0.30000000000000004
console.log(0.1 + 0.2 == 0.3); // false!!!
function isEqual(a, b){
// 즉 a와 b의 차이가 JavaScript에서 표현할 수 있는 가장 작은 수인 Number.EPSILON보다 작으면 같은 수로 인정할 수 있다.
return Math.abs(a - b) < Number.EPSILON;
}
console.log(isEqual(0.1 + 0.2, 0.3));
Number.MAX_VALUE - 자바스크립트에서 사용 가능한 가장 큰 숫자
MAX_VALUE보다 큰 숫자는 Infinity
Number.MIN_VALUE - 자바스크립트에서 사용 가능한 가장 작은 숫자(5e-324)를 반환MIN_VALUE는 0에 가장 가까운 양수 값
MIN_VALUE보다 작은 숫자는 0으로 변환
console.log(Number.MIN_VALUE > 0); // true
Number.POSITIVE_INFINITY - 양의 무한대 Infinity를 반환
Number.NEGATIVE_INFINITY - 음의 무한대 -Infinity를 반환
Number.NaN(=window.NaN) - 숫자가 아님을 나타내는 숫자값
console.log(Number('xyz')); // NaN
console.log(1 * 'string'); // NaN
console.log(typeof NaN); // number
Number 객체 메소드
Number.isFinite(NaN) // false
Number.isFinite('Hello') // false
Number.isFinite(0) // true
Number.isFinite(null) // false. isFinite(null) => true
Number.isInteger(-123) //true
Number.isInteger(5-2) //true
Number.isInteger(0.5) //false
Number.isInteger('123') //false
Number.isInteger(false) //false
Number.isInteger(-Infinity) //false
Number.isNaN(NaN) // true
Number.isNaN(undefined) // false. undefined → NaN. isNaN(undefined) → true.
Number.isNaN({}) // false. {} → NaN. isNaN({}) → true.
Number.isNaN('blabla') // false. 'blabla' → NaN. isNaN('blabla') → true.
Number.isNaN(true) // false
Number.isNaN(null) // false
Number.isNaN(37) // false
Number.isNaN('37.37'); // false
Number.isNaN(' '); // false
Number.isNaN(new Date()) // false
Number.isNaN(new Date().toString()) // false. String → NaN. isNaN(String) → true.
Number.isSafeInteger(-123) //true
Number.isSafeInteger(5-2) //true
Number.isSafeInteger(1000000000000000) // true
Number.isSafeInteger(10000000000000001) // false
Number.isSafeInteger(0.5) //false
Number.isSafeInteger('123') //false
Number.isSafeInteger(false) //false
Number.isSafeInteger(-Infinity) //false
var numObj = 77.1234;
console.log(numObj.toExponential()); // logs 7.71234e+1
console.log(numObj.toExponential(2)); // logs 7.71e+1
console.log(77.toExponential()); // SyntaxError: Invalid or unexpected token
console.log(77 .toExponential()); // logs 7.7e+1
숫자 뒤의 .은 의미가 모호
소수 구분 기호일 수도 있고 객체 프로퍼티에 접근하기 위한 마침표 표기법일 수도->따라서 자바스크립트 엔진은 숫자 뒤의 .을 부동 소수점 숫자의 일부로 해석
그러나 77.toString()은 숫자로 해석할 수 없으므로 에러(SyntaxError: Invalid or unexpected token)가 발생
77.toString(); // SyntaxError: Invalid or unexpected token
위 예제의 경우, 숫자 뒤의 첫 번째 . 뒤에는 숫자가 이어지므로 .은 명백하게 부동 소수점 숫자의 일부
1.23.toString (); // '1.23'
따라서 정수 리터럴과 함께 메소드를 사용할 경우, 아래의 방법을 권장
(77).toString(); // '77'
77 .toString(); // '77'
var numObj = 12345.6789;
// 소숫점 이하 반올림
console.log(numObj.toFixed()); // '12346'
// 소숫점 이하 2자리수 유효, 나머지 반올림
console.log(numObj.toFixed(2)); // '12345.68'
var numObj = 12345.6789;
// 전체자리수 유효
console.log(numObj.toPrecision()); // '12345.6789'
// 전체 2자리수 유효, 나머지 반올림
console.log(numObj.toPrecision(2)); // '1.2e+4'
// 전체 6자리수 유효, 나머지 반올림
console.log(numObj.toPrecision(6)); // '12345.7'
var count = 10;
console.log(count.toString()); // '10'
console.log((17).toString()); // '17'
console.log(17 .toString()); // '17'
console.log((17.2).toString()); // '17.2'
var x = 16;
console.log(x.toString(2)); // '10000'
console.log(x.toString(8)); // '20'
console.log(x.toString(16)); // '10'
console.log((-10).toString(2)); // '-1010'
console.log((-0xff).toString(2)); // '-11111111'
var numObj = new Number(10);
console.log(typeof numObj); // object
var num = numObj.valueOf();
console.log(num); // 10
console.log(typeof num); // number