🧡공부기록/javascript, jquery

[javascript] Number객체

탱지 2022. 10. 19. 17:30

Number 객체는 생성자 함수 객체이다. 따라서 new연산자와 함꼐 호출하여 Number 인스턴스를 생성 할 수 있다.


Number 생성자 함수

인수를 전달하지 않고 new 연산자와 함께 호출하면 [[numberData]] 내부 슬롯에 0을 할당한 Number 객체를 생성하다.

const numObj = new Number();
console.log(numObj); //[[primitiveValue]] : 0

 

Number 생성자 함수의 인수로 숫자가 아닌 값을 전달하면 인수를 숫자로 강제 변환 후, [[NumberData]] 내부 슬롯에 변환된 숫자를 할당한 Number 객체를 생성한다.

const numObj = new Number('10');
console.log(numObj); //[[primitiveValue]] : 10

numObj = new Number('Hello');
console.log(numObj); //[[primitiveValue]] : NaN

new 연산자를 사용하지 않고 Number 생성자 함수를 호출하면 Number 인스턴스가 아닌 숫자를 반환한다.

// 문자열타입 => 숫자타입
Number('0'); // -> 0
Number('-1'); // -> -1
Number('10.53'); // -> 10.53

// 불리언 타입 => 숫자 타입
Number(true); // -> 1
Number(false); // -> 0

Number 프로퍼티

 

Number.EPSILON

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

( Number.EPSILON == 2.220446049250313e-16 )

0.1 + 0.2 ; // → 0.30000000000000004
0.1 + 0.2 === 0.3 ; // → false

위의 예제와 같이 부동소수점 산술 연산은 정확한 결과를 기대하기 어렵다.

👉 정수는 2진법으로 계산하지만, 부동소수점을 표현하기 위해 가장 널리 쓰이는 표준인 IEEE754는 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

 

Number.MAX_VALUE

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

Number.MIN_VALUE보다 작은 숫자는 0이다.

Number.MIN_VALUE; // -> 5e-324
Number.MIN_VALUE > 0; // -> true

 

Number.MAX_SAFE_INTEGER

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

Number.MAX_SAFE_INTEGER; // → 9007199254740991

 

Number.POSITIVE_INFINITY

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

Number.POSITIVE_INFINITY; // → Infinity

 

Number.NEGATIVE_INFINITY

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

Number.NAGATIVE_INFINITY; // → -Infinity

 

Number.NaN

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

Number.NaN은 window.NaN과 같다.

Number.NaN; // → NaN

 


Number 메서드

 

Number.isFinite

Number.isFinite 정적 메서드는 인수로 전달된 숫자값이 정상적인 유한수, 즉 Infinity 또는 -Infinity가 아닌지 검사하여 그 결과를 불리언 값으로 반환한다.

(유한수이면 true, 무한수이면 false를 반환)

Number.isFinite(0); // true
Number.isFinite(Number.MAX_VALUE); //true
Number.isFinite(Number.MIN_VALUE); //true

Number.isFinite(Infinity); // flase
Number.isFinite(-Infinity); // false

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

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

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

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

 

Number.isInteger

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

Number.isInteger(0); // true
Number.isInteger(123); // true
Number.isInteger(-123); // true

Number.isInteger(0.5); // false (0.5는 정수가 아니기 때문!)
Number.isInteger('123'); // false (암묵적으로 숫자 타입으로 변환하지 않는다.)
Number.isInteger(false); // false
Number.isInteger(Infinity); // false (Infinity, -Infinity는 정수 x 무리수o)

 

Number.isNaN

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

Number.isNaN(NaN); // true

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

Number.isNaN(undefined); // flase
isNaN(undefined); // true , undefined는 NaN으로 타입이 변환된다.

 

Number.isSafeInteger

Number.isSafeInteger 정적 메서드는 인수로 전달된 숫자값이 안전한 정수인지 검사하여 그 결과를 불리언 값으로 반환한다. 검사 전에는 인수를 숫자로 암묵적 타입 변환을 하지 않는다.

👉 안전한 정수값은 -(2^53 -1)과 2^53 -1 사이의 정수값이다.

Number.isSafeInteger(0); // true
Number.isSafeInteger(100000000000000001); // false
Number.isSafeInteger(0.5); // false, 0.5는 정수가 아니기 때문
Number.isSafeInteger('123'); // false , 암묵적으로 타입 변환을 하지 않는다.

 

Number.porototype.toExponential

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

👉 지수표기법이란 ? e앞에 있는 숫자에 10의 n승을 곱하는 형식으로 수를 나타내는 형식이다. 인수로 소수점 이하로 표현할 자릿수를 전달 할 수 있다. ( 자리수만큼 반올림하여 지수 표기법으로 나타낸다. )

(77.1234).toExponential(); // "7.71234e+1"
(77.1234).toExponential(4); // "7.71234e+1"
(77.1234).toExponential(2); // "7.71e+1"
  • 숫자 리터럴과 함께 Number 프로토타입 메서드를 사용할 경우 에러가 발생한다.
  • 숫자 뒤의 .은 의미가 모호하다. 자바스크립트 엔진은 숫자 뒤의 .을 부동소수점 숫자의 소수 구분기호로 해석한다.
77.toExponential(); // SyntaxError : Invalid or unexpected token

숫자 77뒤의 . 뒤에는 숫자가 이어지므로 .은 명백하게 부동소수점 숫자의 소수 구분기호다. 숫자 리터럴과 함께 메서드를 사용할 경우 혼란을 방지하기 위해 그룹 연산자를 사용할것을 권장한다.

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

//숫자 뒤의 . 뒤에 공백이 오면 .을 프로퍼티 접근 연산자로 해석한다. 
77 .toExponential(); // "7.7e+1" ⭐⭐

 

Number.prototype.toFixed

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

반올림하는 소수점 이하 자릿수를 나타내는 0~20사이의 정수값을 인수로 전달할 수 있다. 인수를 생략하면 기본값 0이 지정된다.

(12345.6789).toFixed(); // "123456"
(12345.6789).toFixed(1); // "12345.7"
(12345.6789).toFixed(3); // "12345.6789"

 

Number.prototype.toPrecision

toPercision 메서드는 인수로 전달받은 전체 자릿수까지 유요하도록 나머지 자릿수를 반올림하여 문자열로 반환한다.

전체 자릿수를 나타내는 0~21 사이의 정수값을 인수로 전달할 수 있다. 인수를 생략하면 기본값 0이 지정된다.

👉 전체 자릿수로 표현할 수 없는 경우 지수 표기법으로 결과를 문자열로 반환한다.

(12345.6789).toPrecision(); // 12345.6789
(12345.6789).toPercision(1); // "1e+4" 
(12345.6789).toPercision(6); // "12345.7"

 

Number.prototype.toString

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

진법을 나타내는 2~36사이의 정수값을 인수로 전달할 수 있다. 인수를 생략하면 10진법이 지정된다.

(10).toString(); // "10"
(16).toString(2); // "10000"
(16).toString(8); // "20"
(16).toString(16); // "10"