💡 빌트인 객체
✔ 자바스크립트 객체의 분류
- 표준 빌트인 객체
- ECMAScript 사양에 정의된 객체를 말하며 애플리케이션 전역의 공통 기능을 제공한다
- 자바스크립트 실행 환경에 관계없이 언제나 사용할 수 있다
- 전역 객체의 프로퍼티로서 제공된다
- 호스트 객체
- ECMAScript 사양에 정의되어 있지 않지만 자바스크립트 실행 환경에서 추가로 제공하는 객체를 말한다
- 브라우저 환경에서는 DOM, BOM, Canvas, XMLHttpRequest, fetch 등과 같은 클라이언트 사이드 웹 API를 호스트 객체로 제공한다
- 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
을 제외한 표준 빌트인 객체는 모두 인스턴스를 생성할 수 있는 생성자 함수 객체다
const numObj = new Number(1.5);
//프로토타입 메서드?
//모든 인스턴스가 상속을 통해 사용할 수 있다.
console.log(numObj.toFixed()); // 2
//정적 메서드?
//인스턴스를 생성하지 않아도 생성자 함수를 통해 사용할 수 있다.
console.log(Number.isInteger(0.5)); // false
✔ 원시값과 래퍼 객체
const str = "hello";
str.name = "Lee"
//래퍼 객체가 암묵적으로 생성되고, [[StringData]] 슬롯에 hello가 할당된다.
//name 프로퍼티가 동적 생성되며, 값으로 Sangjo가 할당된다
//그리고 str은 다시 [[StringData]] 슬롯의 문자열로 돌아간다.
console.log(str.name); // undefined
//위에서 생성되었던 래퍼 객체는 이미 가비지 컬렉션의 대상이 되어 사라졌다.
//이번에 생성된 래퍼 객체는 이전의 래퍼 객체와 다르다. 따라서 name 프로퍼티가 존재하지 않는다.
✔ 전역 객체
- 코드가 실행되기 이전 단계에 자바스크립트 엔진에 의해 어떤 객체보다도 먼저 생성되는 특수한 객체이며, 어떤 객체에도 속하지 않은 최상위 객체다
- 브라우저 환경에서는
window
, Node.js 환경에서는 global
이 전역 객체를 가리킨다
- 전역 객체의 특징
- 개발자가 의도적으로 생성할 수 없다(전역 객체를 생성할 수 있는 생성자 함수가 없다)
- 전역 객체의 프로퍼티를 참조할 때
window
또는 global
을 생략할 수 있다
- 전역 객체는 모든 표준 빌트인 객체를 프로퍼티로 가지고 있다
- 자바스크립트 실행 환경에 따라 추가적인 프로퍼티와 메서드를 갖는다(호스트 객체)
- var 키워드로 선언한 전역 변수와 암묵적 전역, 그리고 전역 함수는 전역 객체의 프로퍼티다
- 브라우저 환경의 모든 자바스크립트 코드는 전역 객체
window
를 공유한다
1. 빌트인 전역 프로퍼티
- 빌트인 전역 프로퍼티는 전역 객체의 프로퍼티를 의미한고, 주로 애플리케이션 전역에서 사용하는 값을 제공한다
- Infinity
Infinity
프로퍼티는 무한대를 나타내는 숫자값 Infinity
를 갖는다
console.log(3/0); // Infinity
console.log(-3/0); // -Infinity
console.log(typeof Infinity); // number
- NaN
NaN
프로퍼티는 숫자가 아님을 나타내는 숫자값 NaN
을 갖는다
console.log(window.NaN); // NaN
console.log(Number("str")); // NaN
console.log(1 * "str"); // NaN
console.log(typeof NaN); // number
- undefined
undefined
프로퍼티는 원시 타입 undefined
를 값으로 갖는다
console.log(window.undefined); // undefined
var foo;
console.log(foo); // undefined
console.log(typeof undefined); // undefined
2. 빌트인 전역 함수
- 빌트인 전역 함수는 애플리케이션 전역에서 호출할 수 있는 빌트인 함수로서 전역 객체의 메서드다
- eval
eval
함수는 자바스크립트 코드를 나타내는 문자열을 인수로 전달받는다
const x = 1;
function foo() {
eval("var x = 2;");
console.log(x) // 2
}
foo()
console.log(x) // 1
eval
함수를 통해 사용자로부터 입력받은 콘텐츠를 수행하는 것은 보안에 매우 취약하다
- 또한
eval
함수를 통해 실행되는 코드는 자바스크립트 엔진에 의해 최적화가 수행되지 않으므로 일반적인 코드 실행에 비해 처리 속도가 느리다
- 따라서
eval
함수의 사용은 금지해야 한다
- isFinite
- 전달받은 인수가 유한수이면
true
를, 무한수이면 false
를 반환한다
- isNaN
- 전달받은 인수가
NaN
인지 검사하여 결과를 불리언 타입으로 반환한다
- parseFloat
- 전달받은 문자열 인수를 부동 소수점 숫자, 즉 실수로 해석하여 반환한다\
- parseInt
- 전달받은 문자열 인수를 정수로 해석하여 반환한다
- 전달받은 인수가 문자열이 아니면 문자열로 변환한 다음 정수로 해석하여 반환한다
- encodeURI / decodeURI
encodeURI
함수는 완전한 URI를 문자열로 전달받아 이스케이프 처리를 위해 인코딩한다
decodeURI
함수는 인코딩된 URI를 문자열로 전달받아 이스케이프 처리 이전으로 디코딩한다.
3. 암묵적 전역
var x = 10; // 전역 변수
function foo() {
// 선언하지 않은 식별자에 값을 할당
y = 20; // window.y = 20;
}
foo();
// 선언하지 않은 식별자 y를 전역에서 참조할 수 있다
console.log(x + y); // 30
- 식별자 y는 선언된 전역 변수처럼 동작하는데, 이는 선언하지 않은 식별자에 값을 할당하면 전역 객체의 프로퍼티가 되기 때문이다
- 이러한 현상을 암묵적 전역이라 한다