JS에서는 크게 3개의 객체로 분류할 수 있다.
표준 빌트인 객체
ECMAScript 사양에 정의된 객체
실행환경에 관계없이 언제나 사용 가능
전역 객체의 프로퍼티
호스트 객체
실행환경에서 추가로 제공하는 객체
브라우저 환경에서는 DOM
BOM
Canvas
XMLHttpRequest
fetch
requestAnimationFrame
SVG
Web Storage
Web Component
Web Worker
등 Web API 제공한다
Node.js에서는 Node.js 고유의 API를 호스트 객체로 제공한다.
사용자 정의 객체
사용자가 직접 정의한 객체
자바스크립트는 Object, String, Number 등 40여 개의 표준 빌트인 객체를 제공한다.
생성자 함수인 표준 빌트인 객체가 생성한 인스턴스의 프로토타입은 표준 빌트인 객체의 prototype에 바인딩된 객체다.
// String 생성자 함수에 의한 String 객체 생성
const strObj = new String('Lee'); // String {"Lee"}
// String 생성자 함수를 통해 생성한 strObj 객체의 프로토타입은 String.prototype이다.
console.log(Object.getPrototypeOf(strObj) === String.prototype); // true
자바스크립트 엔진에 의해 값에 대해 객체처럼 접근하면 생성되는 임시 객체를 래퍼 객체라 한다.
예를 들어, 문자열에 대해 마침표 표기법으로 접근하면 그 순간 래퍼 객체인 String 생성자 함수의 인스턴스가 생성되고 문자열은 래퍼 객체의 [[StringData]]
내부 슬롯에 할당된다.
const str = 'hi';
// 원시 타입인 문자열이 래퍼 객체인 String 인스턴스로 변환된다.
console.log(str.length);
console.log(str.toUpperCase()); // HI
// 래퍼 객체로 프로퍼티에 접근하거나 메서드를 호출한 후, 다시 원시값으로 되돌린다.
console.log(typeof str); // string
래퍼 객체의 처리가 종료되면 래퍼 객체의 [[StringData]]
내부 슬롯에 할당된 원시값으로 원래의 상태, 즉 식별자가 원시값을 갖도록 되돌리고 래퍼 객체는 가비지 컬렉션의 대상이 된다.
// 1. 식별자 str은 문자열을 값으로 가진다.
const str = 'hello';
// 2. 식별자 str은 암묵적으로 생성된 래퍼 객체를 가리킨다.
// 식별자 str의 값 'hello'는 래퍼 객체의 [[StringData]] 내부 슬롯에 할당된다.
// 래퍼 객체에 name 프로퍼티가 동적 추가된다.
str.name = 'Lee';
// 3. 식별자 str은 다시 원래의 문자열, 즉 래퍼 객체의 [[StringData]] 내부 슬롯에 할당된 원시값을 갖는다.
// 이때 2에서 생성된 래퍼 객체는 아무도 참조하지 않는 상태이므로 가비지 컬렉션의 대상이 된다.
// 4. 식별자 str은 새롭게 암묵적으로 생성된(2에서 생성된 래퍼 객체와 다른) 래퍼 객체를 가리킨다.
// 새롭게 생성된 래퍼 객체에는 name 프로퍼티가 존재하지 않는다.
console.log(str.name); // undefined
// 5. 식별자 str은 다시 원래의 문자열, 즉 래퍼 객체의 [[StringData]] 내부 슬롯에 할당된 원시값을 갖는다.
// 이때 4에서 생성된 래퍼 객체는 아무도 참조하지 않는 상태이므로 가비지 컬렉션의 대상이 된다.
console.log(typeof str, str); // string hello
문자열, 숫자, 불리언, 심벌 이외의 원시값, 즉 null
과 undefined
는 래퍼 객체를 생성하지 않는다.