자바스크립트 객체는 3개의 객체로 분류된다
- 표준 빌트인 객체: ECMAScript 사양에 정의된 객체
- 호스트 객체: 실행환경에서 추가로 제공하는 객체
- 사용자 정의 객체: 사용자가 직접 정의한 객체
자바스크립트는 Ojbect
, String
, Boolean
, JSON
등 40여 개의 표준 빌트인 객체를 제공한다.
📌 Math
, Reflect
, JSON
을 제외하면 다 생성자 함수 객체이다.
따라서 아래와 같이 생성자 함수로 호출하여 인스턴스를 생성할 수 있다.
Number
로 생성한 인스턴스의 프로토타입은 Number.prototype
이다.Number.prototype
의 메서드나 프로퍼티를 사용할 수 있다.ex)
const numObj = new Number(1.5);
console.log(typeof numObj); // object
console.log(Object.getPrototypeOf(numObj) === Number.prototype); // true
console.log(numObj.toFixed()); // 2
console.log(Number.isInteger(0.5)); // false
❓ 자바스크립트에서 숫자와 문자열은 Number
, String
타입을 가진다고 배웠다. 근데 그냥 'name' 이렇게 만들기도 하고 new String('name')
이렇게 만들기도 한다. 왜 이렇게 두가지 방식이 있을까.
const str = 'hello';
console.log(str.length); // 5
console.log(str.toUpperCase); // HELLO
위의 예시를 보면 new String('hello')
로 만든것 처럼 동작한다.
❗️ 이는 원시값인 문자열, 숫자, 불리언값에 대해 마침표 표기법으로 접근하면 자바스크립트 엔진이 연관된 객체로 변환해 주기 때문이다. 이를 래퍼 객체
라 한다
문자열의 동작방식을 예로 들면
위의 동작방식을 코드로 보면
// 1
const str = 'hello';
// 2, 3, 4, 5, 6, 7
str.name = 'Lee';
// 8
console.log(str.name); // undefined
📌 null과 undefined는 래퍼 객체를 생성하지 않는다. 따라서 에러 발생
전역객체는 코드가 실행되기 이전 단계에 자바스크립트 엔진에 의해 어떤 객체보다도 먼저 생성되는 특수한 객체이고, 어떤 객체에도 속하지 않은 최상위 객체이다.
전역객체는 표준 빌트인 객체와 환경에 따른 호스트 객체, var 키워드로 선언한 전역변수와 전역 함수를 프로퍼티로 갖는다.
빌트인 전역 프로퍼티는 전역 객체의 프로퍼티를 의미한다.
빌트인 전역 함수는 애플리케이션 전역에서 호출할 수 있는 빌트인 함수이다.
var x = 10;
function foo() {
y = 20;
}
foo();
console.log(x + y); // 30
위의 예시를 보면 정상적이라면 y가 전역에 없기 때문에 오류가 나야하지만 나지 않는다
그 이유는 y를 선언하지 않고 값을 넣었기 때문에 전역 객체의 프로퍼티가 된다
window.y = 20 이 되는 것이다.
이러한 현상을 암묵적 전역이라 한다.
하지만 이 값은 프로퍼티이기 때문에 호이스팅이 발생하지 않고 delete
로 삭제할 수 있다.