18 ECMAScript 표준 내장 객체

ECMAScript Script 또는 Module이 실행을 시작할 때 항상 이용 가능한 특정 내장 객체들이 있다. 그중 하나인 전역 객체는 실행 프로그램의 전역 환경의 일부이다. 나머지 객체들은 전역 객체의 초기 속성으로 접근 가능하거나 접근 가능한 내장 객체의 속성으로 간접적으로 접근 가능하다.

별도 명시가 없는 한, 함수로 호출 가능한 내장 객체는 10.3에 설명된 특성을 갖는 내장 함수 객체이다. 별도 명시가 없는 한, 내장 객체의 [[Extensible]] 내부 슬롯은 초기값으로 true를 가진다. 모든 내장 함수 객체는 [[Realm]] 내부 슬롯을 가지며 그 값은 객체가 처음 생성된 realmRealm 레코드이다.

많은 내장 객체들이 함수이다: 인수와 함께 호출될 수 있다. 그중 일부는 또한 생성자이다: new 연산자와 함께 사용하도록 의도된 함수이다. 각 내장 함수에 대해 이 명세서는 그 함수가 요구하는 인수와 그 함수 객체의 속성을 설명한다. 각 내장 생성자에 대해서는, 해당 생성자를 호출하는 new 표현식이 반환하는 특정 객체 인스턴스의 속성 및 그 생성자의 프로토타입 객체의 속성도 추가로 설명한다.

특정 함수의 설명에서 달리 명시되지 않는 한, 내장 함수나 생성자에 요구된 것보다 적은 인수가 제공되면, 그 함수나 생성자는 충분한 추가 인수가 제공된 것과 정확히 동일하게 동작해야 하며, 각각의 추가 인수는 undefined 값이다. 이러한 누락된 인수는 “존재하지 않음”으로 간주되며 명세 알고리즘에서 그 방식으로 식별될 수 있다. 특정 함수의 설명에서 “this 값”과 “NewTarget” 용어는 10.3에 주어진 의미를 갖는다.

특정 함수의 설명에서 달리 명시되지 않는 한, 내장 함수나 생성자에 허용된 것보다 더 많은 인수가 제공되면 초과 인수들은 호출 시 평가된 다음 함수에 의해 무시된다. 그러나 구현체는 그러한 인수들에 관해 구현체 특정 동작을 정의할 수 있으며, 그 동작이 단지 초과 인수의 존재만을 근거로 TypeError 예외를 던지는 방식이어서는 안 된다.

Note 1

내장 함수 집합에 추가 기능을 더하는 구현체는 기존 함수에 새로운 매개변수를 추가하기보다는 새로운 함수를 추가하는 방식으로 하는 것이 권장된다.

달리 명시되지 않는 한, 모든 내장 함수와 모든 내장 생성자는 Function 프로토타입 객체, 즉 표현식 Function.prototype(20.2.3)의 초기값을 [[Prototype]] 내부 슬롯의 값으로 가진다.

달리 명시되지 않는 한, 모든 내장 프로토타입 객체는 Object 프로토타입 객체, 즉 표현식 Object.prototype(20.1.3)의 초기값을 [[Prototype]] 내부 슬롯의 값으로 가진다. 단, Object 프로토타입 객체 자신은 예외이다.

만약 이 명세서가 내장 생성자의 동작을 알고리즘 단계로 정의하면, 그 알고리즘이 [[Call]][[Construct]]의 목적상 그 동작이다. 만약 알고리즘이 이 두 경우를 구분할 필요가 있으면, NewTarget이 undefined인지 확인하는데, 이는 [[Call]] 호출을 나타낸다.

내장 함수 객체로 식별되지만 생성자로 식별되지 않은 함수 객체는, 특정 함수 설명에서 달리 명시되지 않는 한, [[Construct]] 내부 메서드를 구현하지 않는다.

생성자가 아닌 내장 함수 객체는 특정 함수 설명에서 달리 명시되지 않는 한 "prototype" 속성을 갖지 않는다.

이 명세서에 정의된 모든 내장 함수는 CreateBuiltinFunction 추상 연산(10.3.4)을 호출하여 생성된다. lengthname 매개변수의 값은 아래에서 논의되는 "length""name" 속성의 초기값이다. prefix 매개변수의 값도 아래에서 유사하게 논의된다.

모든 내장 함수 객체는 생성자를 포함하여 "length" 속성을 가지며 그 값은 음이 아닌 정수 Number이다. 달리 명시되지 않는 한, 이 값은 함수 설명의 하위절 제목에 표시된 필수 매개변수의 수이다. 선택적 매개변수와 나머지 매개변수는 매개변수 수에 포함되지 않는다.

Note 2

예를 들어, Array 프로토타입 객체"map" 속성의 초기값인 함수 객체는 하위절 제목 «Array.prototype.map (callback [ , thisArg])» 아래에 설명되어 있으며 여기에는 두 개의 명명된 인수 callback과 thisArg가 표시되고 후자는 선택적이다; 따라서 그 함수 객체의 "length" 속성의 값은 1𝔽이다.

달리 명시되지 않는 한, 내장 함수 객체의 "length" 속성은 속성 어트리뷰트 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }를 가진다.

모든 내장 함수 객체는 생성자를 포함하여 "name" 속성을 가지며 그 값은 문자열이다. 달리 명시되지 않는 한, 이 값은 명세에서 함수에 부여된 이름이다. 익명 함수로 식별된 함수는 "name" 속성의 값으로 빈 문자열을 사용한다. 객체의 속성으로 지정된 함수에 대해 이름 값은 함수를 접근하는 데 사용되는 속성 이름 문자열이다. 내장 속성의 get 또는 set 접근자 함수로 지정된 함수들은 CreateBuiltinFunction을 호출할 때 prefix 매개변수로 "get" 또는 "set"이 전달된다.

만약 내장 함수의 속성 키가 Symbol 값인 경우 그 "name" 속성의 값은 명시적으로 지정된다. 만약 그러한 명시된 값이 접두사 "get " 또는 "set "으로 시작하고 그 값이 지정된 함수가 내장 속성의 get 또는 set 접근자 함수라면, 접두사를 제외한 값이 name 매개변수로 전달되고 "get" 또는 "set"(각각)이 prefix 매개변수로 전달되어 CreateBuiltinFunction을 호출한다.

달리 명시되지 않는 한, 내장 함수 객체의 "name" 속성은 속성 어트리뷰트 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }를 가진다.

19에서 28까지의 절들과 부록 B.2에 설명된 모든 다른 데이터 속성은 달리 명시되지 않는 한 속성 어트리뷰트 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }를 가진다.

19에서 28까지의 절들과 부록 B.2에 설명된 모든 다른 접근자 속성은 달리 명시되지 않는 한 속성 어트리뷰트 { [[Enumerable]]: false, [[Configurable]]: true }를 가진다. 만약 get 접근자 함수만 설명되어 있다면 set 접근자 함수의 기본값은 undefined이다. 만약 set 접근자만 설명되어 있다면 get 접근자의 기본값은 undefined이다.