자바스크립트는 원시값을 마치 객체처럼 다룰 수 있게 해준다.
원시값에도 객체에서처럼 메서드를 호출할 수 있다.
다만.. 원시값은 객체가 아니다.!!
객체의 장점중 하나: 함수도 프로퍼티로 저장이 가능하다.
그러나 이러한 기능을 사용한다면 시스템 자원이 많이 소모된다는 단점이 있다
=> 객체는 원시값보다 무겁고 내무 구조를 유지하기 위해 추가 자원을 사용하기 때문이다.
자바스크립트 창안자는 여러 모순적인 상황들을 해결해야만 했다.
자바스크립트 창안자는 아래와 같은 방법을 사용해 해결책을 모색했다.
'래퍼객체'는 원시타입에 따라 종류가 다양하다.
각 래퍼객체는 원시 자료형의 이름을 그대로 차용해 String, Number, Boolean, Symbol 이라고 부른다.
래퍼객체마다 제공하는 메서드 역시 다르다.
자바 등의 몇몇 언어에서는 new Number(1) 또는 new Boolean(false) 와 같은 문법을 사용해 원하는 타입의 래퍼객체를 직접 만들 수 있다.
자바스크립트에서도 하위 호환성을 위해 이 기능을 남겨두었는데 이런 방식으로 래퍼객체를 만드는것은 몇몇 상황에서 혼동을 불러일으키기에 추천하지 않는다.alert( typeof 0 ); // "number"
alert( typeof new Number(0) ); // "object"!
객체논리 평가시 항상 참을 반환하기에 아래의 alert창은 무조건 열리게 된다.
>
```js
let zero = new Number(0);
if (zero) { // 변수 zero는 객체이므로, 조건문이 참이 됩니다.
alert( "그런데 여러분은 zero가 참이라는 것에 동의하시나요!?!" );
}
그런데, new를 붙이지 않고 String / Number / Boolean 을 사용하는것은 문제가 없다.
new가 없이 사용되면 원하는 형의 원시값으로 바꿔준다.
let num = String(123) => 문자형으로 변경된다.