자바스크립트 객체는 크게 표준 빌트인 객체, 호스트 객체, 사용자 정의 객체로 나뉜다. 그 중 표준 빌트인 객체에 대해 자세히 알아볼 예정이다.
ECMAScript 사양에 정의된 객체를 말하며, JS 실행 환경(브라우저 또는 Node.js 환경)과 관계없이 언제나 사용할 수 있다. 표준 빌트인 객체는 전역 객체의 프로퍼티로서 제공되므로 별도의 선언 없이 전역 변수처럼 언제나 참조할 수 있다.
총 40여 개의 표준 빌트인 객체가 제공되며, 그 중 Math
, Reflect
, JSON
을 제외한 표준 빌트인 객체는 모두 인스턴스를 생성할 수 있는 생성자 함수 객체다.
생성자 함수인 표준 빌트인 객체가 생성한 인스턴스의 프로토타입은 표준 빌트인 객체의 prototype
프로퍼티에 바인딩된 객체로, 여기에는 다양한 기능의 빌트인 프로토타입 메서드를 제공한다(ex. Array.prototype.map
). 그리고 표준 빌트인 객체 자체에서도 정적으로 호출할 수 있는 정적 메서드를 제공한다(ex. Array.of
).
원시값인 문자열, 숫자, 불리언, 심벌 값에 대해 객체처럼 마침표 표기법(또는 대괄호 표기법)으로 접근, 즉 객체처럼 사용하면 JS 엔진이 일시적으로 원시값을 임시 객체로 변환해주는데, 이 객체를 래퍼 객체라고 한다.
const str = "hi";
// 1.
console.log(str.toUpperCase()); // 2. HI
console.log(str, typeof str); // 3. hi string
String
생성자 함수의 인스턴스가 생성되고 문자열은 래퍼 객체의 [[StringData]]
내부 슬롯에 할당됨String.prototype
의 메서드를 상속받아 사용할 수 있음[[StringData]]
내부 슬롯에 할당된 원시값으로 되돌리고 래퍼 객체는 가비지 컬렉터의 대상이 됨코드가 실행되기 이전에 JS 엔진에 의해 어떤 객체보다도 먼저 생성되는 최상위 객체이다. 브라우저 환경에서는 window
(this
, self
, frames
)가 전역 객체를 가리키지만, Node.js 환경에서는 global
이 전역 객체를 가리킨다.
-> ES11에서 도입된 globalThis
로 브라우저 환경과 Node.js 환경에서 전역 객체를 가리키던 다양한 식별자를 통일할 수 있음
전역 객체는 표준 빌트인 객체 및 환경에 따른 호스트 객체(클라이언트 Web API 또는 Node.js의 호스트 API), 그리고 var
키워드로 선언한 전역 변수와 전역 함수, 암묵적 전역을 프로퍼티로 갖는다.
참고로,
let
,const
키워드로 선언한 전역 변수는 전역 객체의 프로퍼티가 아닌 전역 렉시컬 환경의 선언적 환경 레코드 내에 존재하게 된다.(23장에서 설명)
Infinity
, NaN
, undefined
등이 존재한다.
eval
자바스크립트 코드를 나타내는 문자열을 인수로 전달받음
인수가 표현식이면 런타임에 평가하여 값을 생성하고, 표현식이 아닌 문이면 런타임에 실행한다.
non-strict mode인 경우 eval 함수는 기존의 스코프를 런타임에 동적으로 수정하며, strict mode에서는 기존의 스코프를 수정하지 않고 eval 함수 자신의 자체적인 스코프를 생성한다.
주의) eval 함수를 통해 사용자로부터 입력받은 콘텐츠를 실행하는 것은 보안에 매우 취약할 뿐만 아니라 JS 엔진에 의해 최적화가 수행되지 않으므로 처리 속도가 느리다. 따라서 eval 함수는 사용하지 않는 것이 좋다.
isFinite
인수가 유한수인 경우 true
반환
인수의 타입의 숫자가 아니면 숫자로 타입을 변환한 후 검사를 수행하며, 이 때 NaN
으로 평가되는 경우 false
반환 (Number.isFinite
의 경우, 타입을 변환하지 않는다.)
isNaN
인수가 NaN
인 경우 true
반환
인수의 타입의 숫자가 아니면 숫자로 타입을 변환한 후 검사를 수행하며, 이 때 NaN
으로 평가되는 경우 true
반환 (Number.isNaN
의 경우, 타입을 변환하지 않는다.)
parseFloat
전달받은 문자열 인수를 실수로 해석하여 반환
공백으로 구분된 문자열은 첫 번째 문자열만 변환되며, 첫 번째 문자열을 숫자로 변환할 수 없다면 NaN
을 반환한다. 앞 뒤 공백은 무시된다.
parseInt
전달받은 문자열 인수를 정수로 해석하여 반환
두 번째 인수로 radix(2
~36
)를 전달할 수 있는데, 이 경우 전달받은 문자열 인수를 radix
진수로 해석하고, 그 결과를 10
진수 정수로 반환하게 된다.
parseInt('10', 2); // 2
// 참고로 10진수 숫자를 해당 기수의 문자열로 변환하여 반환하고 싶을 때는
// Number.prototype.toString 메서드를 사용한다.
const x = 15;
x.toString(2); // 1111
parseInt('20', 2); // NaN: 첫 번째 문자를 2진수로 변환할 수 없음
parseInt('1A0'); // 1: 10진수로 해석할 수 없는 'A' 이후의 문자는 무시됨
parseInt(10.1); // 10: 인수가 문자열이 아니면 문자열로 변환 후 정수로 해석
parseInt('40 years'); // 40: 공백으로 구분 시 첫 번째 문자열만 반환
parseInt('He was 40'); // NaN: 첫 번째 문자열을 숫자로 해석할 수 없는 경우
encodeURI/decodeURI
encodeURI
의 경우 완전한 URI
를 문자열로 전달받아 이스케이프 처리를 위해 인코딩한다. 참고로 URI
는 인터넷에 있는 자원을 나타내는 유일한 주소를 말하며, 하위 개념으로 URL
, URN
이 있다.
이스케이프 처리는 URL
내에서 의미를 갖고 있는 문자(?
, %
, #
)나 URL
에 올 수 없는 문자(한글, 공백 등) 또는 시스템에 의해 해석될 수 있는 문자(<
, >
)로 인해 야기될 수 있는 있는 문제를 예방하기 위해 반드시 필요한 작업이다.
반대로 decodeURI
는 인코딩된 URI를 인수로 받아 이스케이프 처리 이전으로 되돌린다.
encodeURIComponent/decodeURIComponent
encodeURIComponent
는 URI
구성 요소를 인수로 전달받아 인코딩한다. 이 때 인수로 전달받은 문자열은 무조건 URI의 구성요소로 간주되기 때문에 encodeURI
와 달리 쿼리스트링의 구분자로 사용되는 =
, ?
, &
까지 인코딩한다.
decodeURIComponent
는 매개변수로 전달된 URI 구성 요소를 디코딩한다.