본 게시물은 Effective Javascript의 내용을 재구성하여 작성되었음을 알립니다. 저작권 문제 발생시 게시물이 비공개 될 수 있습니다.
- 원시 데이터형을 위한 객체 래퍼는 그 자신의 원시 데이터 값과는 동작이 다르다. 동일한지 비교했을 때도 서로 다르다.
- 원시 데이터형에 프로퍼티를 설정하거나 가져오면 암묵적으로 객체 래퍼를 생성한다.
객체와 함께, 자바스크립트는 다섯 가지의 원시 데이터형 값을 가진다. 불리언, 숫자, 문자열, null 그리고 undefined다. 동시에, 표준 라이브러리는 불리언, 숫자 그리고 문자열을 객체 처럼 래핑하는 생성자를 제공한다. 다음과 같이 문자열 값을 감싸서 String 객체를 만들 수 있다.
var s = new String("hello");
어떤 면에서, String 객체는 그 자신이 감싼 문자열 값과 비슷하게 동작한다. 다음고 가타이 다른 값과 병합해도 다른 문자열을 생성할 수 있다.
s + " world"; // "hello world"
다음과 같이 인덱스를 지정하여 문자열의 일부분을 추출할 수도 있다.
s[4]; // "o"
하지만 원시 데이터형 문자열과 다르게, String 객체는 진짜 객체다.
typeof "hello"; // "string"
typeof s; // "object"
이 차이점은 매우 중요하다. 두 개의 서로 다른 String 객체를 내장 연산자를 사용해 비교할 수 없다는 의미이기 때문이다.
var s1 = new String("hello");
var s2 = new String("hello");
s1 === s2; // false
String 객체는 개별 객체이기 때문에 자기자신과만 동일하다. 엄격하지 않은 동일 비교 연산자도 마찬가지이다.
s1 == s2; // false
이런 래퍼들은 꽤나 이상하게 동작하기 때문에 별로 유용하지 않다. 이들이 존재하는 이유를 합리화하자면 유틸리티 메서드들 때문이다. 자바스크립트는 또 다른 암묵적인 강제 형변환에 이런 래퍼들을 편리하게 사용한다. 이로 인해 원시 데이터의 메서드를 호출하거나 프로퍼티를 추출할 수 있게 되고, 값을 적당한 객체 타입으로 감싸서 사용하는 것처럼 동작하게 된다.
예를 들면 String 프로토타입 객체는 문자열을 대문자를 변환해주는 toUpperCase 메서드를 가진다. 문자열 원시 데이터 값에 이 메서드를 사용할 수 있다.
"hello".toUpperCase(); // "HELLO"
이런 암묵적인 감싸기의 결과로 원시 데이터 값에 기본적으로 아무런 영향을 주지 않고 프로퍼티를 설정할 수 있다.
"hello".someProperty = 17;
"hello".someProperty; // undefined
암묵적인 감싸기는 실행될 때마다 매번 새로운 String 객체를 생성하기 때문에 처음 감싸진 래퍼 객체를 갱신하더라도 효과는 지속되지 않는다. 결국 실제로는 원시 데이터 값에 프로퍼티를 설정할 수 없다. 하지만 이런 동작을 이해하는 것은 도움이 된다. 자바스크립트가 데이터형 오류를 감추는 또 다른 사례이기 때문이다. 만약 객체라고 생각한 것에 프로퍼티를 설정했지만 실수로 원시 데이터형에 설정햇다면, 프로그램은 단순이 값을 갱신하지 않고 조용히 무시할 것이다. 이는 발견하기 어려운 오류를 자주 발생시켜 분석하기 까다롭게 만들 것이다.
- 원시 데이터형을 위한 객체 래퍼는 그 자신의 원시 데이터 값과는 동작이 다르다. 동일한지 비교했을 때도 서로 다르다.
- 원시 데이터형에 프로퍼티를 설정하거나 가져오면 암묵적으로 객체 래퍼를 생성한다.
끄읕.