자바스크립트의 데이터 타입은 원시(기본) 데이터 타입과 객체(참조) 데이터 타입으로 나뉘어지며, 원시 데이터 타입이 아닌 모든 것은 객체 데이터 타입이다.
var str = 'coding';
console.log(str.length); // 6
console.log(str.charAt(0)); // "C"
문자열은 객체가 아니지만 프로퍼티와 메소드가 있다. 그 이유는 이런 식으로 문자열과 관련된 어떤 작업을 하려고 할 때 자바스크립트는 임시로 String이라는 감싸는 객체(래퍼 객체)를 만들어 원시 데이터 타입의 문자열을 감싸서 행동을 처리하고 사용이 끝나면 제거하기 때문이다. 원시 데이터는 객체가 아니기 때문에 객체처럼 사용할 수 없지만, 이러한 래퍼 객체는 원시 데이터를 객체처럼 사용할 수 있게 해준다. 자바스크립트는 이러한 작업을 자동으로 처리해주지만 어떤 언어들은 그렇지 않기 때문에 개발자가 명시적으로 래퍼 객체를 만들어 사용해야 하는 언어도 있다.
var str = 'coding';
str.prop = 'everybody'; // 이 순간에는 String이라는 'coding' 문자열을 감싸는 객체가 존재한다.
console.log(str.prop); // undefined -> Type Error가 아닌 undefined를 발생시킨다.
-> str.prop를 하는 순간에 자바스크립트 내부적으로 String 객체가 만들어진다. prop 프로퍼티는 이 객체에 저장되고 이 객체는 곧 제거 된다. 그렇기 때문에 prop라는 속성이 저장된 객체는 존재하지 않으므로 str.prop를 실행했을 때 undefined가 발생한다.
null과 undefined는 래퍼 객체가 존재하지 않기 때문에 null.prop = 'bob'; 이라고 입력하면 타입 에러가 발생한다.