- 네이티브
1.1 네이티브 래퍼를 박싱한다.
네이티브란? 영단어의 의미로는 '원래 있던 것'이라고 풀이할 수 있는데 자바스크립트에서의 기본 정의는 내장함수이자 '원시값을 감싸는 객체 래퍼'라고 할 수 있다. 네이티브에는 String(), Number(), Boolean(), Array(), Date() 등등이 있다. 그러나 정말 필요한 경우가 아니라면 생성자 형식으로 쓰지 않는 게 좋다. 이게 무슨 말이냐면, var a = [1,2,3]이라고 쓰면 될 일을 var a = new Array(1,2,3)이라고 굳이 쓸 필요가 없다.
그런데 중요한 점은 자바의 생성자와 동일하게 생각하면 안 된다는 점이다. 이는 문자열 값을 생성하는 String생성자가 아니다. 이 네이티브는 생성자처럼 사용할 수 있지만 실제는 new String("hello")의 결과는 원시 값 "hello"를 감싼 객체 래퍼이다. 그 결과로 typeof는 string이 아닌 object를 반환한다.
var s = new String("hello");
console.log(s.toString());
typeof s; //"object"
1.2 Object.prototype.toString.call() 메서드
typeof가 object인 값에는 [[Class]]라는 내부 프로퍼티가 붙는다고 한다. 그래서 이 프로퍼티는 직접 접근할 수 없고, 다음의 메서드를 통해서 알아볼 수 있다.
Object.prototype.toString.call( [1,3,4] ); //"[object Array]"
Object.prototype.toString.call( "hello" ); //"[object String]"
그런데, 의문점이 생긴다. "hello"는 원시값인 String인데도 잘 나온다. 이는 단순 원시 값을 해당 객체의 래퍼로 자동 박싱해주기때문이다. Bloolean, Number도 마찬가지이다.
1.3 래퍼 자동 박싱
var s = "hello";
s.length; //3
s.toUpperCase(); // "HELLO"
여기에 우리가 그동안 사용해오던 코드가 있다. "hello"는 원시값인데, 원시값에는 프로퍼티나 메서드가 없다. 만일 length, toUpperCase()로 접근하려면 이 원시 값을 래퍼로 감싸줘야하는 게 맞다. 다행히도 원시 값을 알아서 박싱하므로 이 코드가 가능한 것이지 hello가 객체라거나 한 것은 아니다. 그러니 new String("hello")처럼 코딩할 필요가 없다.
- 사실 책에서도 이걸 잘 쓰는 방법이나 꼭 쓰라고 권유하지는 않는다.
자바의 생성자가 아니라는 것과, 이런 존재가 있다는 것으로 넘어가야겠다.
출처 : 타입과 문법, 스코프와 클로저
you don't know js
'프로그래밍 > JavaScript' 카테고리의 다른 글
자바스크립트 핵심 개념 : 호이스팅 (0) | 2020.12.16 |
---|---|
자바스크립트 핵심 개념 : 데이터 타입 기본형/참조형 (0) | 2020.12.16 |
[javascript] 값 : 배열 / 문자열 / 숫자 / 레퍼런스 개념잡기 (0) | 2020.11.30 |
[javascript] 타입 : 내장 타입 7가지 / 변수에는 타입이 없다. (0) | 2020.11.30 |
Ajax data를 Controller에서 받는 두 가지 방법 : Vo / Map (1) | 2020.10.27 |