Javascript - toPrimitive

원시값 메서드

자바스크립트의 특징 중 하나는 원시값을 객체처럼 사용할 수 있다는 것이다. 즉, 원시값에서도 객체에 메소드가 있는 것처럼 메소드를 호출할 수 있다. 하지만 원시값은 객체가 아니다.

원시값은 값 형태가 맞아서 단일 형태는 맞지만, String, Number, Boolean, Symbol이라는 원시 래퍼 객체에 접근할 수 있다. 원시 래퍼 객체는 원시값이 메소드나 프로퍼티에 접근할 때 추가 기능을 사용할 수 있게 해주는 객체이다.

let str = "Hello";

alert( str.toUpperCase() ); // HELLO
  • 문자열이 str라는 변수는 원시값이지만, 원시값의 프로퍼티인 toUpperCase에 접근하는 순간 객체가 만들어지는데, 이 객체에서 toUpperCase라는 메소드를 가지고 있다.
  • 그렇게 메소드가 실행되고, 이 메소드가 실행한 결과값인 원시값이 새로운 문자열로 반환된다.
  • 만들어진 객체는 없어지고, 반환된 원시값인 str만 남는다.

Number 메소드

모던 자바스크립트에서는 숫자 자료형이 두 가지가 있다. 일반적인 숫자는 Number, 그리고 다른 하나는 BigInt라는 숫자 자료형이다. BigInt는 2의 53 제곱 이상의 큰 수에서 사용되는 숫자 자료형이다.

  • 큰 수 작은 수

큰 숫자나 작은 숫자를 사용해야할 경우, 0을 너무 많이 입력하는 것은 가독성이 떨어지기 때문에 아래와 같이 사용할 수 있다.

1e3 = 1 * 1000
1.23e6 = 1.23 * 1000000
// 10을 세 번 거듭제곱한 수로 나눔
1e-3 = 1 / 1000 (=0.001)

// 10을 여섯 번 거듭제곱한 수로 나눔
1.23e-6 = 1.23 / 1000000 (=0.00000123)
  • 16진수, 8진수, 6진수

자바스크립트를 지원하는 진법은 세 가지가 있다. 이를 사용하는 방법은 다음과 같다.

// 16
alert( 0xff ); // 255
alert( 0xFF ); // 255 (대·소문자를 가리지 않으므로 둘 다 같은 값을 나타냅니다.)

let a = 0b11111111; // 255의 2진수
let b = 0o377; // 255의 8진수

alert( a == b ); // true, 진법은 다르지만, a와 b는 같은 수임
  • toString(base)

num.toString(base) 메서드는 base진법으로 num을 표현한 후, 이를 문자형으로 변환해 반환합니다.

let num = 255;

alert( num.toString(16) );  // ff
alert( num.toString(2) );   // 11111111

부정확한 계산

숫자는 내부적으로 64비트 형식으로 표현된다. 그래서 숫자를 저장하려면 정확히 64비트가 필요하다. 그 중 52비트는 숫자를 저장하는데 사용되고, 11비트는 소수점 위치, 1비트는 부호를 저장하는 데에 사용된다.

숫자가 너무 커져서 64비트보다 커질 경우, Infinity로 처리된다.

alert( 0.1 + 0.2 == 0.3 ); // false