Object, String, Number, Boolean, Date, Math, RegExp, Function, Promise, JSON, Error등등 약 40개로 구성되어져 있다.
여기서 Math, Reflect, JSON을 제외하고는 모두 new 연산자를 이용해서 인스턴스를 생성할 수 있는 함수 객체이다.
여기서 생성자 함수로 호출한 표준 빌트인 객체들의 인스턴스는 prototype 프로퍼티에 바인딩된 객체이다. 그래서 다양한 정적 메소드를 활용할 수가 있다. 밑에 코드로 얘기해보겠다.
const number1 = new Number(1.5);
console.log(number1.toFixed());
// prototype 의 키워드를 생략하고 prototype에 있는 메소드를 그대로 활용한 모습니다.
위 코드에서 Number이란 생성자 함수에 prototype의 프로퍼티에 있는 정적 메서드를 그대로 사용이 가능한 모습을 확인할 수 있다.
그럼 여기서 의문은 원시값이 String, Number, Boolean등의 객체는 왜 있는걸까?
결론부터 얘기하면 원시값으로 선언은 했지만 마침표 표기법이나 '(, {'등을 사용해서 내부에서 해당 원시값에 메소드를 사용하면 그대로 사용이 가능하다.
const str = 'hello';
console.log(str.length); // 5
console.log(str.toUpperCase()) // HELLO
위에 코드를 보면 str이라는 원시값으로 선언을 했고 이 원시값에 객체의 prototype에 있는 정적 메서드를 그대로 사용한걸 확인해 볼 수 있다.
이유는 JS엔진은 일시적으로 사용하는 부분에서 원시값을 연관된 객체로 변환해주기 때문에 이와 같은 동작이 가능하다.
이런 임시 객체를 래퍼 객체라고 한다.
그리고 사용이 끝나게 되면 해당 래퍼 객체는 가비지 컬렉션의 대상이 된다.
이와 같은 특징 때문에 원시값인 number, string, boolean은 생성자 함수로 만들기보단 원시값으로 선언하는걸 추천한다.
전역 객체란 코드가 실행되기 이전에 어떠한 객체보다 먼저 생성되는 특수한 객체이다.
브라우저 환경에선 window 불리고 nodejs 환경에선 global라고 불린다.
전역 객체내부에는 표준 필트인 객체와 호스트객체를 모두 포함하고 있으며 전역 환경에서 var로 선언한 변수도 전역 객체에 프로퍼티로 할당이 된다.
앞에서 말한 빌트인 객체와 호스트 객체 말고도 전역 객체에 독립적으로 할당되어져 있는 전역 변수와 데이터들이 있다.