본문 바로가기

공부/Java script

[Java Script] 래퍼객체와 전역객체

표준 빌트인 객체

자바스크립트는 다양한 표준 빌트인 객체를 제공한다. ECMAScript 사양에 정의된 객체를 말하며, 애플리케이션 전역의 공통 기능을 제공한다. 예를 들어 생성자 함수에 의해 Number 객체를 생성했다고 가정해보자. 표준빌트인 객체인 Number.prototype은 프로토타입 메서드를 제공한다. 이 프로토타입 메서드는 모든 Number 인스턴스가 상속을 통해 사용 할 수있다. 객체는 인스턴스 없이 정적으로 호출할 수 있는 정적 메소드를 갖는다.

1
2
3
4
5
const num = new Number(1.5);
 
//toFixed는 Number.prototype의 프로토타입 메서드다.
console.log(num.toFixed()); //소수점 자리를 반올림하여 문자열로 반환
 
cs

 

래퍼객체

자바스크립트에서는 원시값이 객체처럼 동작할 수 있다. 이는 원시값에 대해 객체처럼 사용할 수 있도록 일시적으로 원시값을 연관된 객체로 변환해주기 때문이다. 암묵적으로 연관객체를 생성하여 프로퍼티에 접근하거나 메서드를 호출하고 다시 원시값으로 되돌린다. 이러한 임시객체를 래퍼 객체라고 한다. 

아래의 예제에서 래퍼 객체인 String 생성자 함수의 인스턴스가 생성되고, 문자열이 객체의 StringData 내부슬롯에 할당된다. String 생성자 함수의 인스턴스는 String.prototype의 메서드를 상속받아 사용할 수 있다. 래퍼객체의 처리가 종료되면 StringData 내부 슬롯에 할당되어있는 값으로 되돌리고, 래퍼객체는 가비지 컬렉션이 된다.

1
2
3
4
5
6
7
8
9
const str = 'hello';
 
//문자열이 래퍼 객체 String 인스턴스로 변환
//String.prototype 메서드 사용
console.log(str.length); // 5
 
//str은 다시 StringData내부 슬롯에 할당된 원시값으로 되돌림
console.log(typeof str); // string 
 
cs

이와같은 특성 덕분에 String, Number, Boolean를 new 연산자로 인스턴스를 굳이 생성할 필요가 없다. 참고로 null과 undefined는 래퍼 객체를 생성하지 않는 원시값으로 객체처럼 사용하면 에러가 발생한다.

 

전역객체

어떤 객체에도 속하지 않는 최상위 객체이다. 브라우저 환경에서는 window, node js 환경에서는 global이다.

브라우저 환경의 모든 코드는 하나의 전역 객체 window를 공유하게 된다.

모든 빌트인 객체의 최상위 객체이며 표준 빌트인 객체와 호스트 객체를 프로퍼티로 소유한다. 개발자가 의도적으로 생성할 수 없고, 전역객체의 프로퍼티를 참조할 때는 window를 생략할 수 있다.

직접 선언하지 않은 변수(암묵적전역) 또는 전역함수는 전역객체의 프로퍼티가 된다. 다만 let이나 const는 전역 객체의 프로퍼티가 아니다.

cf. 암묵적 전역에서 직접 선언하지 않은 변수는 변수가 아니라 전역객체의 프로퍼티이다. 마치 전역 변수인것처럼 동작하기는 하지만 변수가 아니라서 변수 호이스팅이 발생하지 않고, delete 연산자로 삭제할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
console.log(foo); //변수 호이스팅이 발생하지 않으므로 ReferenceError
 
//선언하지 않은 변수, 암묵적 전역은 전역객체(window)의 프로퍼티이다
foo = 2;
console.log(window.foo); //2
 
//전역함수 또한 전역객체의 프로퍼티이다.
function func() { return 2; }
console.log(window.func()); //2
 
let num = 2;
console.log(window.num); //전역객체의 프로퍼티가 아니므로 undefined
 
delete foo;
console.log(foo); //foo라는 프로퍼티가 삭제되었으므로 오류 발생
cs

전역객체는 몇 가지의 프로퍼티와 메서드를 가지고 있다. 이 때 window나 global을 생략하여 호출할 수 있다.
 
전역 객체의 프로퍼티에는 무한대를 나타내는 숫자값 Infinity와 숫자가 아님을 나타내는 숫자값 NaN, 원시타입인 undefined가 있다.
 
전역객체의 메서드(전역함수)에는 eval, isFinte, inNaN, parseFloat, parseInt, encodeURl, decodeURI, encodeURIComponene, decodeURIComponent 등이 있다.