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

  1. Number.EPSILON - JavaScript에서 표현할 수 있는 가장 작은 수
    부동소수점 산술 연산 비교는 정확한 값을 기대하기 어려움->정수는 2진법으로 오차없이 저장이 가능하지만 부동소수점을 표현하는 가장 널리 쓰이는 표준인 IEEE 754은 2진법으로 변환시 무한소수가 되어 미세한 오차가 발생할 수밖에 없는 구조적 한계를 갖음->부동소수점의 비교는 Number.EPSILON을 사용하여 비교 기능을 갖는 함수를 작성
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));
  1. Number.MAX_VALUE - 자바스크립트에서 사용 가능한 가장 큰 숫자
    MAX_VALUE보다 큰 숫자는 Infinity

  2. Number.MIN_VALUE - 자바스크립트에서 사용 가능한 가장 작은 숫자(5e-324)를 반환MIN_VALUE는 0에 가장 가까운 양수 값
    MIN_VALUE보다 작은 숫자는 0으로 변환

console.log(Number.MIN_VALUE > 0); // true
  1. Number.POSITIVE_INFINITY - 양의 무한대 Infinity를 반환

  2. Number.NEGATIVE_INFINITY - 음의 무한대 -Infinity를 반환

  3. Number.NaN(=window.NaN) - 숫자가 아님을 나타내는 숫자값

console.log(Number('xyz')); // NaN
console.log(1 * 'string');  // NaN
console.log(typeof NaN);    // number

Number 객체 메소드

  1. Number.isFinite(값) - 매개변수에 전달된 값이 정상적인 유한수인지를 검사하여 그 결과를 Boolean으로 반환
    Number.isFinite()는 전역 함수 isFinite()와 차이 - 전역 함수 isFinite()는 인수를 숫자로 변환하여 검사를 수행하지만 Number.isFinite()는 인수를 변환하지 않음->숫자가 아닌 인수가 주어졌을 때 반환값은 언제나 false
Number.isFinite(NaN)       // false
Number.isFinite('Hello')   // false

Number.isFinite(0)         // true
Number.isFinite(null)      // false. isFinite(null) => true
  1. Number.isInteger(값) - 매개변수에 전달된 값이 정수인지 검사하여 그 결과를 Boolean으로 반환
    검사전에 인수를 숫자로 변환하지 않음
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
  1. Number.isNaN(값) - 매개변수에 전달된 값이 NaN인지를 검사하여 그 결과를 Boolean으로 반환
    Number.isNaN()는 전역 함수 isNaN()와 차이->전역 함수 isNaN()는 인수를 숫자로 변환하여 검사를 수행하지만 Number.isNaN()는 인수를 변환하지 않->숫자가 아닌 인수가 주어졌을 때 반환값은 언제나 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.
  1. Number.isSafeInteger(값) - 매개변수에 전달된 값이 안전한 정수값인지 검사하여 그 결과를 Boolean으로 반환
    안전한 정수값은 -(253 - 1)와 253 - 1 사이의 정수값
    검사전에 인수를 숫자로 변환하지 않음
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
  1. Number.prototype.toExponential(값) - 대상을 지수 표기법으로 변환하여 문자열로 반환
    (지수 표기법 - 매우 큰 숫자를 표기할 때 주로 사용하며 e(Exponent) 앞에 있는 숫자에 10의 n승이 곱하는 형식으로 수를 나타내는 방식
    ex)1234 = 1.234e+3)
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'
  1. Number.prototype.toFixed(값) - 매개변수로 지정된 소숫점자리를 반올림하여 문자열로 반환
var numObj = 12345.6789;

// 소숫점 이하 반올림
console.log(numObj.toFixed());   // '12346'
// 소숫점 이하 2자리수 유효, 나머지 반올림
console.log(numObj.toFixed(2));  // '12345.68'
  1. Number.prototype.toPrecision(값) - 매개변수로 지정된 전체 자릿수까지 유효하도록 나머지 자릿수를 반올림하여 문자열로 반환
    지정된 전체 자릿수로 표현할 수 없는 경우 지수 표기법으로 결과를 반환
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'
  1. Number.prototype.toString(값) - 숫자를 문자열로 변환하여 반환
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'
  1. Number.prototype.valueOf() - Number 객체의 원시 타입 값을 반환
var numObj = new Number(10);
console.log(typeof numObj); // object

var num = numObj.valueOf();
console.log(num);           // 10
console.log(typeof num);    // number
profile
Front-end Developer 💻🔜

0개의 댓글