자바스크립트 객체는 다음과 같이 크게 3개의 객체로 분류할 수 있다.
표준 빌트인 객체
ECMAScript 사양에 정의된 객체, 애플리케이션 전역의 공통 기능 제공
호스트 객체
ECMAScript 사양에 정의되어 있지 않지만 자바스크립트 실행 환경에서 추가로 제공하는 객체
브러우저에서는 클라이언트 사이드 Web API를 호스트 객체로 제공 (DOM, BOM, fetch …)
Node.js 환경에서는 Node.js 고유의 API를 호스트 객체로 제공
사용자 정의 객체
사용자가 직접 정의한 객체
자바스크립트는 Object, String, Number, Boolean, Symbol, Date, Math, RegExp, Array, Map/Set, WeakMap/WeakSet, Function, Promise, Reflect, Proxy, JSON, Error 등 40여개의 표준 빌트인 객체를 제공한다.
Math, Reflect, JSON을 제외한 표준 빌트인 객체는 모두 인스턴스를 생성할 수 있는 생성자 함수 객체!
생성자함수 객체인 빌트인 객체 - 프로토타입 메서드, 정적 메서드 제공
생성자 함수 객체가 아닌 빌트인 객체 - 정적 메서드 제공
// Number 생성자 함수에 의한 Number 객체 생성
const numObj = new Number(1.5); // Number {1.5}
// toFixed는 Number.prototype의 프로토타입 메서드다.
console.log(numObj.toFixed()); // 2
// isInteger는 Number의 정적 메서드이다.
console.log(Number.isInteger(0.5)); // false
const str = 'hi';
// 원시 타입인 문자열이 **래퍼 객체**인 **String 인스턴스로 변환**된다.
console.log(str.length); // 2
console.log(str.toUpperCase()); // HI
// 래퍼 객체로 프로퍼티에 접근하거나 메서드를 호출한 후, **다시 원시값으로 되돌린다.**
console.log(typeof str); // string
문자열, 숫자, 불리언 값에 대해 객체처럼 접근하면 생성되는 임시 객체를 래퍼 객체라 한다.
전역 객체는 코드가 실행되기 이전 단계에 자바스크립트 엔진에 의해 어떤 객체보다도 먼저 생성되는 특수한 객체이며, 어떤 객체에도 속하지 않는 최상위 객체다.
브라우저 환경에서는 window,
node.js 환경에서는 global이 전역 객체를 가리킨다.
전역 객체의 특징
전역 객체는 개발자가 의도적으로 생성할 수 없다. 즉, 전역 객체를 생성할 수 있는 생성자 함수가 제공되지 않는다.
전역 객체의 프로퍼티를 참조할 때 window(또는 global)를 생략할 수 있다.
전역 객체는 Object, String, Number, Promise 와 같은 모든 표준 빌트인 객체를 프로퍼티로 가지고 있다.
자바스크립트 실행 환경에 따라 추가적으로 프로퍼티와 메서드를 갖는다.(브라우저 환경, node.js 환경)
var 키워드로 선언한 전역 변수와 선언하지 않은 변수에 값을 할당한 암묵적 전역, 그리고 전역함수는 전역 객체의 프로퍼티가 된다.
let이나 const 키워드로 선언한 전역 변수는 전역 객체의 프로퍼티가 아니다. let이나 const 키워드로 선언한 전역 변수는 보이지 않는 개념적인 블록(전역 렉시컬 환경의 선언적 환경 레코드) 내에 존재하게 된다.
브라우저 환경의 모든 자바스크립트 코드는 하나의 전역 객체 window를 공유한다.
빌트인 전역 프로퍼티
Infinity
NaN
undefined
빌트인 전역 함수
eval
eval('1+2';); // 3
eval('var x = 5;') // undefined
console.log(x); // 5
eval 함수의 사용은 금지해야 한다. (보안 취약, 최적화 x, 처리 속도 느림)
IsFinite
isFinite(0); // true
isFinite('10'); // true
isFinite(null); // -> true: null -> 0
isFinite(Infinity); // false
// 인수가 NaN으로 평가되는 값이면 false 반환
isFinite(NaN); // false
isFinite('Hello'); // false
IsNaN
parseFloat
parseInt
encodeURI / decodeURI → 쿼리스트링 구분자(‘=’, ‘?’, ‘&’) 인코딩하지 않는다.
encodeURIComponent / decodeURIComponent → 쿼리스트링 구분자(‘=’, ‘?’, ‘&’)도 인코딩한다.
암묵적 전역
var x = 10; // 전역 변수
function foo(){
y = 20; // window.y = 20;
}
foo();
// 선언하지 않은 식별자 y를 전역에서 참조할 수 있다.
console.log(x+y); // 30
선언하지 않는 식별자 y는 마치 선언된 전역 변수처럼 동작한다. 이는 선언하지 않은 식별자에게 값을 할당하면 전역 객체의 프로퍼티가 되기 때문이다.