자바스크립트의 객체는 아래의 세가지 객체로 분류할 수 있다.
1) 표준 빌트인 객체
- ECMAScript 사양에 정의된 객체
- 자바스크립트 실행 환경에 제약없이 사용 가능.
- 전역 객체의 프로퍼티로서 제공
2) 호스트 객체
- ECMAScript 사양에 정의 X.
- But, 자바스크립트 실행 환경에서 추가로 제공하는 객체.
- 브라우저 환경 : 클라이언트 사이드 Web API를 호스트 객체로 제공.
- Node.js 환경 : Node.js의 고유 API를 호스트 객체로 제공.
3) 사용자 정의 객체
- 기본으로 제공되는 객체가 아닌 사용자가 직접 정의한 객체.
Math, Reflect, JSON을 제외한 40여 개의 표준 빌트인 객체를 제공.
위의 세가지를 제외한 이 표준 빌트인 객체들은 모두 인스턴스를 생성할 수 있는 생성자 함수 객체
이며,
생성자 함수 객체인 표준 빌트인 객체
는 프로토타입 메서드와 정적 메서드를 제공
하고,
생성자 함수 객체가 아닌 표준 빌트인 객체
는 정적 메서드만 제공
한다.
원시값인 문자열, 숫자, 불리언 값에 대해 객체처럼 접근하면 생성되는 임시 객체 ===
레퍼 객체 (Wrapper object)
원시값을 객체처럼 사용하면
자바스크립트 엔진은 암묵적으로 연관된 객체인 래퍼 객체를 생성
,
생성된 객체로 프로퍼티에 접근하거나 메서드를 호출하고 다시 원시값으로 되돌림.
※ 이로 인해서 원시값은 객체가 아니지만 마치 객체처럼(마침표 표기법 or 대괄호 표기법 접근)
동작하게 됨.
이후 래퍼 객체의 처리가 종료되면
래퍼 객체의 [[StringData]]
내부 슬롯에 할당된 원시값을 통해 원래의 원시값을 갖도록 되돌리고,
래퍼 객체는 가비지 컬렉션의 대상이 되어 메모리에서 정리가 됨.
※ 추가적으로, null 및 undefined는 래퍼 객체를 생성하지 아니하며, 객체처럼 사용 시 에러가 발생함.
어떤 객체에도 속하지 않는 최상위 객체. 코드 실행 이전 단계에서 자바스크립트 엔진에 의해 다른 객체들보다 먼저 생성되는 객체.
표준 빌트인 객체와 환경에 따른 호스트 객체, var 키워드로 선언한 전역 변수/함수를 프로퍼티로 가짐.
전역 객체는 아래와 같은 특징을 갖는다.
- 개발자가 의도적으로 생성할 수 없음.
- 전역 객체 프로퍼티를 참조 시
window
또는global
키워드 생략이 가능.let/const
키워드로 선언한 전역 변수는 전역 객체의 프로퍼티가 아님. (전역 렉시컬 환경의 선언적 환경 레코드 내에 존재함.)- 브라우저 환경의 모든 자바스크립트 코드는 하나의 전역 객체를 공유
전역 객체의 프로퍼티를 의미하며, 애플리케이션 전역에서 사용하는 값을 제공함.
빌트인 전역 프로퍼티에는 아래와 같은 종류가 있다.
Infinity 프로퍼티
- 무한대를 나타내는 숫자값.
NaN 프로퍼티
- Not a Number (숫자가 아님)을 나타내는 숫자값
NaN
을 가지며,Number.NaN
과 같음.
undefined 프로퍼티
- 원시값인
undefined
를 값으로 갖는다.
애플리케이션 전역에서 호출할 수 있는 빌트인 함수로, 전역객체의 매서드임.
eval
, isFinite
, isNaN
, parseFloat
, parseInt
, encodeURI/decodeURI
등 과 같은 종류들이 있다.
특히 eval 함수
는 strict mode에서 기존 스코프를 수정하지 않고 자체적인 스코프를 생성하는 특징이 있어
사용자로부터 입력받은 콘텐츠를 실행하는것에 있어 보안에 매우 취약하며, 최적화가 수행되지 않으므로 처리 속도도 느리기에 사용을 권장하지 않음.
선언하지 않은 식별자에 값을 할당하면 전역 변수처럼 동작하는데,
이는 일반적인 변수가 아닌 전역 객체의 프로퍼티
로 추가된 것.
ex) x=1000 -> window.x=1000
으로 해석하게 됨.