원시값에 대한 흥미로운 사실을 알게되었다.
객체와 원시값의 차이로 한다면 대표적으로 객체에는 함수 프로퍼티를 추가할 수 있다는 점이고, 메서드라고 부른다.
그런데 문자나 숫자형에서 toUpperCase() 나 toFixed() 와같은 메서드들을 사용할 수 있는데 어떻게 가능한걸까?
먼저 객체의 특성은 고유한 프로퍼티와 메서드를 가지게되는데, 이런 기능들은 시스템 자원이 많이소모된다는 단점이있다.
그래서 원시값은 가볍게 유지하면서도 메서드를 사용하려면 다른방법이 필요했는데, 원시값이 메서드나 프로퍼티에 접근하게 해주는 특별한 객체인 Object Wrapper(원시 래퍼 객체)를 만들어준다. 그리고 이 객체는 곧바로 삭제된다.
래퍼객체는 원시타입마다 종류가 다양한데 String, Number, Boolean, Symbol 이있다.
let str = "Hello";
alert( str.toUpperCase() ); // HELLO
만약에 위와같이 string 원시값에서 메서드를 호출하면, 그 순간 특별한 객체가 만들어지고, 그 객체(String)는 toUpperCase라는 메서드를 가지고있다.
이 메서드가 실행되고, 새로운 문자열이 반환된 후 객체는 삭제되고 원시값 str만 남게된다.
이런 프로세스를 통해서 원시값을 가볍게 유지하면서 메서드를 호출할 수 있게 된다.
자바스크립트엔진은 위 프로세스의 최적화에 신경을 많이 쓰고있고, 마치 원시 래퍼 객체를 만들지않고도, 객체를 생성하여 메서드를 호출한거처럼 동작하게 해준다.
주의할 점은 래퍼 객체를 직접만들 수 있는데, 그렇게 사용해서는 혼동을 이르킬 수 있다
alert( typeof 0 ); // "number"
alert( typeof new Number(0) ); // "object"!
래퍼 객체도 객체이기 때문에 object가 되버리고 객체는 불린형으로 변환했을때 항상 true 이기 때문에, 예상치못한 결과들을 마주할 수 있다.
하지만 new 연산자를 사용하지 않으면 상식대로 원시값으로 변환하는, 명시적 형변환으로 활용 할 수있다.
원시값에는 string, number , bigint, boolean, symbol, null, undefined로 총 7가지 이지만 null과 undefined의 래퍼객체는 없다.
'Archive' 카테고리의 다른 글
자바스크립트 문자열 (0) | 2022.08.29 |
---|---|
자바스크립트에서 숫자 (0) | 2022.08.29 |
new 연산자와 생성자 함수 (0) | 2022.08.29 |
객체 (0) | 2022.08.29 |
다시보는 babel 과 polyfill (0) | 2022.08.28 |