21. 빌트인 객체
자바스크립트 객체의 분류
다음의 3개의 객체로 분류할 수 있다.
- 표준 빌트인 객체 : ECMAScript 사양에 정의된 객체.
- 전역 객체의 프로퍼티로서 제공.
- 별도의 선언 없이 전역 변수처럼 언제나 참조할 수 있다.
- 호스트 객체 : ECMAScript 사양에 정의되어있지 않지만 자바스크립트 실행환경에서 추가로 제공하는 객체
- 브라우저 환경 : DOM, BOM, Canvas, XMLHttpRequest, fetch, requestAnimationFrame, SVG, Web storage, Web Component, Web Worker와 같은 클라이언트 사이드 Web API
- Node.js : Node.js 고유의 API
- 사용자 정의 객체 : 사용자가 직접 정의한 객체
표준 빌트인 객체
- JS는
Object
, String
, Date
, Math
, Function
, Promise
, Proxy
, JSON
, Error
등 40여개의 표준 빌트인 객체를 제공한다.
- Math, Reflect, JSON을 제외한 표준 빌트인 객체는 모두 인스턴스를 생성할 수 있는 생성자 함수 객체다.
- 프로토타입 메서드와 정적 메서드를 제공한다. ↔ 생성자 함수 객체가 아닌 경우 정적 메서드만 제공.
- 표준 빌트인 개게인 String을 생성자 함수로서 호출하면 생성한 String 인스턴스의 프로토타입은 String.prototype이다.(표준 빌트인 객체의 prototype 프로퍼티에 바인딩된 객체)
원시값과 레퍼 객체
원시값이 있음에도 객체를 생성하는 표준 빌트인 생성자 함수가 존재하는 이유.
이들 원시값에 대해 마치 객체처럼 마침표 표기법(or 대괄호 표기법) 으로 접근하면 JS엔진이 일시적으로 원시값을 연관된 객체로 변환.
레퍼 객체 : 이처럼 문자열, 숫자, 불리언 값에 대해 객체처럼 접근하면 생성되는 임시 객체.
const str = 'hi';
console.log(ste.length);
console.log(ste.toUpperCase());
console.log(typeOf str);
이 때 문자열 래퍼 객체인 String 생성자 함수의 인스턴스는 String.prototype의 메서드를 상속받아 사용할 수 있다.
그 후 래퍼 객체의 처리가 종료되면 래퍼 객체의 [[String]] 내부 슬롯에 할당된 원시값으로 원래의 상태, 즉 식별자가 원시값을 갖도록 되돌리고 래퍼 객체는 가비지 컬렉션의 대상이 된다.
📄래퍼 객체 정리
- 문자열, 숫자, 불리언, 심벌은 암묵적으로 래퍼 객체를 생성해 객체처럼 사용할 수 있다.
- 표준 빌트인 객체인 String, Number, Boolean, Symbol의 프로토타입 메서드 또는 프로퍼티를 참조할 수 있다.
- 따라서 위 생성자 함수를 new 연잔자와 함께 호출하여 인스턴스를 생성할 필요가 없고 권장하지 않는다.
- 의외의 원시값인 null, undefined는 래퍼 객체를 생성하지 않는다. → 객체처럼 사용하면 에러 발생
전역 객체
코드가 실행되기 이전 단계에 JS 엔진에 의해 어떤 객체보다도 먼저 생성되는 특수한 객체, 어떤 객체에도 속하지 않은 최상위 객체
- 브라우저 환경 :
window
(또는 self
, this
, frames
)
- Node.js 환경:
global
표준 빌트인 객체와 환경에 따른 호스트 객체, 그리고 var로 선언한 전역변수와 전역함수를 프로퍼티로 갖는다.
특징
- 개발자가 의도적으로 생성할 수 없다.
- 전역 객체의 프로퍼티를 참조할 때
window
(또는 global
)을 생략할 수 있다.
- 표준 빌트인 객체를 프로퍼티로 가진다.
- var 키워드로 선언한 전역변수와 선언하지 않은 변수에 값을 할당한 암묵적 전역, 전역 함수는 전역 객체의 프로퍼티가 된다.
- let, const로 선언한 전역 변수는 전역 객체의 프로퍼티가 아니다. 보이지 않는 개념적인 블록(전역 렉시컬 환경의 선언적 환경 레코드) 내에 존재.
- 브라우저 환경의 모든 JS 코드는 하나의 전역 객체를 공유한다. (분리해도!)
eval()
함수의 사용을 금지해야 한다!! 보안에 매우취약하고, 최적화가 수행되지 않으므로 속도가 느리다.
암묵적 전역
- 선언하지 않은 식별자에 값을 할당하면 전역 객체의 프로퍼티가 된다.
- 따라서 변수가 아니고, 변수 호이스팅이 발생하지 않는다.
- 전역 변수는
delete
로 삭제할 수 없지만 프로퍼티는 삭제된다.