본문 바로가기
프로그래밍/JavaScript

[javascript] 네이티브 : 객체 래퍼 네이티브에 대하여

by 소소로드 2020. 12. 1.

- 네이티브

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