'hi'.toUpperCase(); // HI
여기서 'hi'는 분명 원시자료형 string일텐데,
원시자료형에 메소드나 프로퍼티가 존재할 수 있을까?
결론적으론 존재할 수 없다.
그렇다면 어떻게 메소드 호출이 가능한 것일까?
js는 모든 것을 객체로 바라보는 언어이다.
그래서 number,string, boolean 등등 원시 자료형은 불편할 수 밖에 없다.
이를 해결하기 위해 js는 각 원시 자료형에 해당하는 wrapper 객체를 미리 만들어 놓았다.
ex) number(원시형) -> Number(wrapper 객체)
그리고 js는 원시형 데이터가 들어오면 wrapper 객체로 변환한 뒤 사용하는 것이다.
이 wrapper 객체는 사용 후 바로 메모리에서 해제된다.(임시로 사용됨)
"hello".toUpperCase();
이 구문은 다음과 동일한 구문이다.
new String("hello").toUpperCase();
sloppy mode(일반적인 코드)와 strict mode 간의
wrapper 동작이 조금 다르다고 한다.
String.prototype.sloppyMethod = function () {
console.log(typeof this); // 객체
console.log(this instanceof String) // true
};
''.sloppyMethod();
String.prototype.sloppyMethod = function () {
'use strict';
console.log(typeof this); // 문자열
console.log(this instanceof String) // false
};
''.sloppyMethod();