20 기본 객체 (Fundamental Objects)

20.1 Object 객체

20.1.1 Object 생성자

Object 생성자는 다음과 같다:

  • %Object% 이다.
  • 전역 객체 "Object" 프로퍼티의 초기 값이다.
  • 생성자로 호출될 때 새로운 일반(ordinary) 객체를 생성한다.
  • 생성자가 아니라 함수로 호출될 때 타입 변환을 수행한다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있다.

20.1.1.1 Object ( [ value ] )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. NewTarget 이 undefined 도 아니고 활성 함수 객체도 아니면
    1. OrdinaryCreateFromConstructor(NewTarget, "%Object.prototype%") 를 반환한다.
  2. valueundefined 또는 null 이면 OrdinaryObjectCreate(%Object.prototype%) 를 반환한다.
  3. ToObject(value) 를 반환한다.

20.1.2 Object 생성자의 프로퍼티

Object 생성자는:

  • 값이 %Function.prototype%[[Prototype]] 내부 슬롯을 갖는다.
  • 값이 1𝔽"length" 프로퍼티를 갖는다.
  • 다음 추가 프로퍼티들을 갖는다:

20.1.2.1 Object.assign ( target, ...sources )

이 함수는 하나 이상의 소스 객체의 열거 가능하고 자체(own)인 모든 프로퍼티 값을 target 객체로 복사한다.

호출될 때 다음 단계를 수행한다:

  1. to 를 ? ToObject(target) 로 둔다.
  2. 인수가 하나만 전달되었다면 to 를 반환한다.
  3. sources 의 각 요소 nextSource 에 대해
    1. nextSourceundefinednull 도 아니면
      1. from 을 ! ToObject(nextSource) 로 둔다.
      2. keys 를 ? from.[[OwnPropertyKeys]]() 로 둔다.
      3. keys 의 각 요소 nextKey 에 대해
        1. desc 를 ? from.[[GetOwnProperty]](nextKey) 로 둔다.
        2. descundefined 가 아니고 desc.[[Enumerable]]true 이면
          1. propValue 를 ? Get(from, nextKey) 로 둔다.
          2. Set(to, nextKey, propValue, true) 를 수행한다.
  4. to 를 반환한다.

이 함수의 "length" 프로퍼티는 2𝔽 이다.

20.1.2.2 Object.create ( O, Properties )

이 함수는 지정된 프로토타입을 가진 새 객체를 생성한다.

호출될 때 다음 단계를 수행한다:

  1. O 가 Object 가 아니고 null 도 아니면 TypeError 예외를 throw 한다.
  2. objOrdinaryObjectCreate(O) 로 둔다.
  3. Propertiesundefined 가 아니면
    1. ObjectDefineProperties(obj, Properties) 를 반환한다.
  4. obj 를 반환한다.

20.1.2.3 Object.defineProperties ( O, Properties )

이 함수는 객체에 자체 프로퍼티를 추가하고/또는 기존 자체 프로퍼티의 특성을 갱신한다.

호출될 때 다음 단계를 수행한다:

  1. O 가 Object 가 아니면 TypeError 예외를 throw 한다.
  2. ObjectDefineProperties(O, Properties) 를 반환한다.

20.1.2.3.1 ObjectDefineProperties ( O, Properties )

The abstract operation ObjectDefineProperties takes arguments O (Object) and Properties (ECMAScript 언어 값) and returns Object 를 담은 정상 completion 또는 throw completion. It performs the following steps when called:

  1. props 를 ? ToObject(Properties) 로 둔다.
  2. keys 를 ? props.[[OwnPropertyKeys]]() 로 둔다.
  3. descriptors 를 새 빈 리스트로 둔다.
  4. keys 의 각 요소 nextKey 에 대해
    1. propDesc 를 ? props.[[GetOwnProperty]](nextKey) 로 둔다.
    2. propDescundefined 가 아니고 propDesc.[[Enumerable]]true 이면
      1. descObj 를 ? Get(props, nextKey) 로 둔다.
      2. desc 를 ? ToPropertyDescriptor(descObj) 로 둔다.
      3. Record { [[Key]]: nextKey, [[Descriptor]]: desc } 를 descriptors 에 추가한다.
  5. descriptors 의 각 요소 property 에 대해
    1. DefinePropertyOrThrow(O, property.[[Key]], property.[[Descriptor]]) 를 수행한다.
  6. O 를 반환한다.

20.1.2.4 Object.defineProperty ( O, P, Attributes )

이 함수는 객체에 자체 프로퍼티를 추가하고/또는 기존 자체 프로퍼티의 특성을 갱신한다.

호출될 때 다음 단계를 수행한다:

  1. O 가 Object 가 아니면 TypeError 예외를 throw 한다.
  2. key 를 ? ToPropertyKey(P) 로 둔다.
  3. desc 를 ? ToPropertyDescriptor(Attributes) 로 둔다.
  4. DefinePropertyOrThrow(O, key, desc) 를 수행한다.
  5. O 를 반환한다.

20.1.2.5 Object.entries ( O )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. obj 를 ? ToObject(O) 로 둔다.
  2. entryList 를 ? EnumerableOwnProperties(obj, key+value) 로 둔다.
  3. CreateArrayFromList(entryList) 를 반환한다.

20.1.2.6 Object.freeze ( O )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. O 가 Object 가 아니면 O 를 반환한다.
  2. status 를 ? SetIntegrityLevel(O, frozen) 으로 둔다.
  3. statusfalse 이면 TypeError 예외를 throw 한다.
  4. O 를 반환한다.

20.1.2.7 Object.fromEntries ( iterable )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. RequireObjectCoercible(iterable) 를 수행한다.
  2. objOrdinaryObjectCreate(%Object.prototype%) 로 둔다.
  3. 단언: obj 는 확장 가능하고 자체 프로퍼티가 없는 ordinary 객체.
  4. closure 를 (key, value) 매개변수로 하고 obj 를 캡처하며 호출 시 다음 단계를 수행하는 새 Abstract Closure 로 둔다:
    1. propertyKey 를 ? ToPropertyKey(key) 로 둔다.
    2. CreateDataPropertyOrThrow(obj, propertyKey, value) 를 수행한다.
    3. NormalCompletion(undefined) 를 반환한다.
  5. adderCreateBuiltinFunction(closure, 2, "", « ») 로 둔다.
  6. AddEntriesFromIterable(obj, iterable, adder) 를 반환한다.
Note
adder 용으로 생성된 함수는 ECMAScript 코드에서 직접 접근할 수 없다.

20.1.2.8 Object.getOwnPropertyDescriptor ( O, P )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. obj 를 ? ToObject(O) 로 둔다.
  2. key 를 ? ToPropertyKey(P) 로 둔다.
  3. desc 를 ? obj.[[GetOwnProperty]](key) 로 둔다.
  4. FromPropertyDescriptor(desc) 를 반환한다.

20.1.2.9 Object.getOwnPropertyDescriptors ( O )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. obj 를 ? ToObject(O) 로 둔다.
  2. ownKeys 를 ? obj.[[OwnPropertyKeys]]() 로 둔다.
  3. descriptorsOrdinaryObjectCreate(%Object.prototype%) 로 둔다.
  4. ownKeys 의 각 요소 key 에 대해
    1. desc 를 ? obj.[[GetOwnProperty]](key) 로 둔다.
    2. descriptorFromPropertyDescriptor(desc) 로 둔다.
    3. descriptorundefined 가 아니면 ! CreateDataPropertyOrThrow(descriptors, key, descriptor) 를 수행한다.
  5. descriptors 를 반환한다.

20.1.2.10 Object.getOwnPropertyNames ( O )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. CreateArrayFromList(? GetOwnPropertyKeys(O, string)) 를 반환한다.

20.1.2.11 Object.getOwnPropertySymbols ( O )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. CreateArrayFromList(? GetOwnPropertyKeys(O, symbol)) 를 반환한다.

20.1.2.11.1 GetOwnPropertyKeys ( O, type )

The abstract operation GetOwnPropertyKeys takes arguments O (ECMAScript 언어 값) and type (string 또는 symbol) and returns 프로퍼티 키 리스트를 담은 정상 completion 또는 throw completion. It performs the following steps when called:

  1. obj 를 ? ToObject(O) 로 둔다.
  2. keys 를 ? obj.[[OwnPropertyKeys]]() 로 둔다.
  3. nameList 를 새 빈 리스트로 둔다.
  4. keys 의 각 요소 nextKey 에 대해
    1. nextKey 가 Symbol 이고 typesymbol 이거나, nextKey 가 String 이고 typestring 이면
      1. nextKeynameList 에 추가한다.
  5. nameList 를 반환한다.

20.1.2.12 Object.getPrototypeOf ( O )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. obj 를 ? ToObject(O) 로 둔다.
  2. obj.[[GetPrototypeOf]]() 를 반환한다.

20.1.2.13 Object.groupBy ( items, callback )

Note

callback 은 두 개의 인수를 받는 함수여야 한다. groupByitems 의 각 요소에 대해 (오름차순으로) callback 을 한 번 호출하고 새 객체를 구성한다. callback 이 반환한 각 값은 프로퍼티 키로 강제 변환된다. 그러한 각 프로퍼티 키에 대해 결과 객체는 그 키를 프로퍼티 키로 가지며 값은 해당 키로 강제 변환된 callback 반환 값을 가진 모든 요소를 담은 배열이다.

callback 은 (요소의 값, 요소의 인덱스) 두 인수로 호출된다.

groupBy 의 반환 값은 %Object.prototype% 을 상속하지 않는 객체이다.

이 함수는 호출될 때 다음 단계를 수행한다:

  1. groups 를 ? GroupBy(items, callback, property) 로 둔다.
  2. objOrdinaryObjectCreate(null) 로 둔다.
  3. Record { [[Key]], [[Elements]] } ggroups 에 대해
    1. elementsCreateArrayFromList(g.[[Elements]]) 로 둔다.
    2. CreateDataPropertyOrThrow(obj, g.[[Key]], elements) 를 수행한다.
  4. obj 를 반환한다.

20.1.2.14 Object.hasOwn ( O, P )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. obj 를 ? ToObject(O) 로 둔다.
  2. key 를 ? ToPropertyKey(P) 로 둔다.
  3. HasOwnProperty(obj, key) 를 반환한다.

20.1.2.15 Object.is ( value1, value2 )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. SameValue(value1, value2) 를 반환한다.

20.1.2.16 Object.isExtensible ( O )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. O 가 Object 가 아니면 false 를 반환한다.
  2. IsExtensible(O) 를 반환한다.

20.1.2.17 Object.isFrozen ( O )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. O 가 Object 가 아니면 true 를 반환한다.
  2. TestIntegrityLevel(O, frozen) 을 반환한다.

20.1.2.18 Object.isSealed ( O )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. O 가 Object 가 아니면 true 를 반환한다.
  2. TestIntegrityLevel(O, sealed) 을 반환한다.

20.1.2.19 Object.keys ( O )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. obj 를 ? ToObject(O) 로 둔다.
  2. keyList 를 ? EnumerableOwnProperties(obj, key) 로 둔다.
  3. CreateArrayFromList(keyList) 를 반환한다.

20.1.2.20 Object.preventExtensions ( O )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. O 가 Object 가 아니면 O 를 반환한다.
  2. status 를 ? O.[[PreventExtensions]]() 로 둔다.
  3. statusfalse 이면 TypeError 예외를 throw 한다.
  4. O 를 반환한다.

20.1.2.21 Object.prototype

Object.prototype 의 초기 값은 Object 프로토타입 객체이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

20.1.2.22 Object.seal ( O )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. O 가 Object 가 아니면 O 를 반환한다.
  2. status 를 ? SetIntegrityLevel(O, sealed) 로 둔다.
  3. statusfalse 이면 TypeError 예외를 throw 한다.
  4. O 를 반환한다.

20.1.2.23 Object.setPrototypeOf ( O, proto )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. RequireObjectCoercible(O) 를 수행한다.
  2. proto 가 Object 가 아니고 null 도 아니면 TypeError 예외를 throw 한다.
  3. O 가 Object 가 아니면 O 를 반환한다.
  4. status 를 ? O.[[SetPrototypeOf]](proto) 로 둔다.
  5. statusfalse 이면 TypeError 예외를 throw 한다.
  6. O 를 반환한다.

20.1.2.24 Object.values ( O )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. obj 를 ? ToObject(O) 로 둔다.
  2. valueList 를 ? EnumerableOwnProperties(obj, value) 로 둔다.
  3. CreateArrayFromList(valueList) 를 반환한다.

20.1.3 Object 프로토타입 객체의 프로퍼티

Object 프로토타입 객체는:

  • %Object.prototype% 이다.
  • 값이 true[[Extensible]] 내부 슬롯을 가진다.
  • 일반 객체에 대해 정의된 내부 메서드를 갖되 [[SetPrototypeOf]] 메서드는 10.4.7.1 에 정의된 대로이다. (즉, 변경 불가능한 프로토타입 특수 객체이다.)
  • 값이 null[[Prototype]] 내부 슬롯을 가진다.

20.1.3.1 Object.prototype.constructor

Object.prototype.constructor 의 초기 값은 %Object% 이다.

20.1.3.2 Object.prototype.hasOwnProperty ( V )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. P 를 ? ToPropertyKey(V) 로 둔다.
  2. O 를 ? ToObject(this value) 로 둔다.
  3. HasOwnProperty(O, P) 를 반환한다.
Note

이전 판에서 step 1 가 던졌을 예외가 this 값이 undefined 또는 null 이어도 계속 던져지도록 step 순서를 선택하였다.

20.1.3.3 Object.prototype.isPrototypeOf ( V )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. V 가 Object 가 아니면 false 반환.
  2. O 를 ? ToObject(this value) 로 둔다.
  3. 반복,
    1. V 를 ? V.[[GetPrototypeOf]]() 로 둔다.
    2. Vnull 이면 false 반환.
    3. SameValue(O, V) 가 true 이면 true 반환.
Note

step 12 순서는 V 가 객체가 아니고 this 값이 undefined 또는 null 인 경우 이전 판 행동을 보존한다.

20.1.3.4 Object.prototype.propertyIsEnumerable ( V )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. P 를 ? ToPropertyKey(V) 로 둔다.
  2. O 를 ? ToObject(this value) 로 둔다.
  3. desc 를 ? O.[[GetOwnProperty]](P) 로 둔다.
  4. descundefined 이면 false 반환.
  5. desc.[[Enumerable]] 를 반환한다.
Note 1

이 메서드는 프로토타입 체인 상의 객체를 고려하지 않는다.

Note 2

이전 판에서 step 1 가 던졌을 예외가 this 값이 undefined 또는 null 이어도 계속 던져지도록 순서를 선택하였다.

20.1.3.5 Object.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. Othis 값으로 둔다.
  2. Invoke(O, "toString") 를 반환한다.

이 메서드의 선택적 매개변수들은 사용되지 않지만 ECMA-402 toLocaleString 메서드의 매개변수 패턴과 대응하도록 의도되었다. ECMA-402 지원이 없는 구현은 그 매개변수 위치를 다른 목적으로 사용해서는 안 된다.

Note 1

이 메서드는 locale 에 민감한 toString 동작이 없는 객체를 위한 일반 toLocaleString 구현을 제공한다. Array, Number, Date, %TypedArray% 는 자체 locale 의존 toLocaleString 을 제공한다.

Note 2

ECMA-402 는 의도적으로 이 기본 구현의 대안을 제공하지 않는다.

20.1.3.6 Object.prototype.toString ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. this 값이 undefined 이면 "[object Undefined]" 를 반환한다.
  2. this 값이 null 이면 "[object Null]" 를 반환한다.
  3. O 를 ! ToObject(this value) 로 둔다.
  4. isArray 를 ? IsArray(O) 로 둔다.
  5. isArraytrue 이면 builtinTag = "Array".
  6. Else O[[ParameterMap]] 내부 슬롯을 가지면 builtinTag = "Arguments".
  7. Else O[[Call]] 내부 메서드를 가지면 builtinTag = "Function".
  8. Else O[[ErrorData]] 내부 슬롯을 가지면 builtinTag = "Error".
  9. Else O[[BooleanData]] 내부 슬롯을 가지면 builtinTag = "Boolean".
  10. Else O[[NumberData]] 내부 슬롯을 가지면 builtinTag = "Number".
  11. Else O[[StringData]] 내부 슬롯을 가지면 builtinTag = "String".
  12. Else O[[DateValue]] 내부 슬롯을 가지면 builtinTag = "Date".
  13. Else O[[RegExpMatcher]] 내부 슬롯을 가지면 builtinTag = "RegExp".
  14. Else builtinTag = "Object".
  15. tag 를 ? Get(O, %Symbol.toStringTag%) 로 둔다.
  16. tag 가 String 이 아니면 tag = builtinTag.
  17. "[object ", tag, "]" 의 문자열 연결을 반환한다.
Note

과거 이 메서드는 이전 판에서 다양한 내장 객체의 공칭 타입 태그로 사용된 [[Class]] 내부 슬롯의 String 값을 얻기 위해 사용되기도 했다. 위 정의는 그러한 특정 종류의 내장 객체를 테스트하기 위해 toString 을 사용하는 레거시 코드와의 호환성을 유지한다. 이는 다른 종류의 내장 혹은 프로그램 정의 객체에 대해 신뢰할 수 있는 타입 테스트 메커니즘을 제공하지 않는다. 또한 프로그램은 %Symbol.toStringTag% 를 이용하여 이러한 레거시 타입 테스트의 신뢰성을 깨뜨릴 수 있다.

20.1.3.7 Object.prototype.valueOf ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. ToObject(this value) 를 반환한다.
Normative Optional, Legacy

20.1.3.8 Object.prototype.__proto__

Object.prototype.__proto__ 는 특성 { [[Enumerable]]: false, [[Configurable]]: true } 를 가진 접근자 프로퍼티이다. [[Get]][[Set]] 특성은 다음과 같이 정의된다:

20.1.3.8.1 get Object.prototype.__proto__

[[Get]] 특성의 값은 인수를 요구하지 않는 내장 함수이다. 호출될 때 다음 단계를 수행한다:

  1. O 를 ? ToObject(this value) 로 둔다.
  2. O.[[GetPrototypeOf]]() 를 반환한다.

20.1.3.8.2 set Object.prototype.__proto__

[[Set]] 특성의 값은 인수 proto 를 받는 내장 함수이다. 호출될 때 다음 단계를 수행한다:

  1. Othis 값으로 둔다.
  2. RequireObjectCoercible(O) 를 수행한다.
  3. proto 가 Object 가 아니고 null 도 아니면 undefined 를 반환한다.
  4. O 가 Object 가 아니면 undefined 를 반환한다.
  5. status 를 ? O.[[SetPrototypeOf]](proto) 로 둔다.
  6. statusfalse 이면 TypeError 예외를 throw 한다.
  7. undefined 를 반환한다.
Normative Optional, Legacy

20.1.3.9 레거시 Object.prototype 접근자 메서드

20.1.3.9.1 Object.prototype.__defineGetter__ ( P, getter )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. O 를 ? ToObject(this value) 로 둔다.
  2. IsCallable(getter) 가 false 이면 TypeError 예외를 throw 한다.
  3. desc 를 PropertyDescriptor { [[Get]]: getter, [[Enumerable]]: true, [[Configurable]]: true } 로 둔다.
  4. key 를 ? ToPropertyKey(P) 로 둔다.
  5. DefinePropertyOrThrow(O, key, desc) 를 수행한다.
  6. undefined 를 반환한다.

20.1.3.9.2 Object.prototype.__defineSetter__ ( P, setter )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. O 를 ? ToObject(this value) 로 둔다.
  2. IsCallable(setter) 가 false 이면 TypeError 예외를 throw 한다.
  3. desc 를 PropertyDescriptor { [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: true } 로 둔다.
  4. key 를 ? ToPropertyKey(P) 로 둔다.
  5. DefinePropertyOrThrow(O, key, desc) 를 수행한다.
  6. undefined 를 반환한다.

20.1.3.9.3 Object.prototype.__lookupGetter__ ( P )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. O 를 ? ToObject(this value) 로 둔다.
  2. key 를 ? ToPropertyKey(P) 로 둔다.
  3. 반복,
    1. desc 를 ? O.[[GetOwnProperty]](key) 로 둔다.
    2. descundefined 가 아니면
      1. IsAccessorDescriptor(desc) 가 true 이면 desc.[[Get]] 를 반환한다.
      2. undefined 를 반환한다.
    3. O 를 ? O.[[GetPrototypeOf]]() 로 둔다.
    4. Onull 이면 undefined 를 반환한다.

20.1.3.9.4 Object.prototype.__lookupSetter__ ( P )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. O 를 ? ToObject(this value) 로 둔다.
  2. key 를 ? ToPropertyKey(P) 로 둔다.
  3. 반복,
    1. desc 를 ? O.[[GetOwnProperty]](key) 로 둔다.
    2. descundefined 가 아니면
      1. IsAccessorDescriptor(desc) 가 true 이면 desc.[[Set]] 를 반환한다.
      2. undefined 를 반환한다.
    3. O 를 ? O.[[GetPrototypeOf]]() 로 둔다.
    4. Onull 이면 undefined 를 반환한다.

20.1.4 Object 인스턴스의 프로퍼티

Object 인스턴스는 Object 프로토타입 객체로부터 상속된 것 외의 특별한 프로퍼티를 가지지 않는다.

20.2 Function 객체

20.2.1 Function 생성자

Function 생성자는 다음과 같다:

  • %Function% 이다.
  • 전역 객체 "Function" 프로퍼티의 초기 값이다.
  • 생성자가 아니라 함수로 호출될 때 새 함수 객체를 생성·초기화한다. 따라서 Function(…) 호출은 동일 인수를 가진 new Function(…) 표현식과 동등하다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있다. 특정 Function 동작을 상속하려는 서브클래스 생성자는 내장 함수 동작에 필요한 내부 슬롯을 가진 서브클래스 인스턴스를 생성·초기화하기 위해 Function 생성자super 호출을 포함해야 한다. 함수 객체를 정의하는 모든 ECMAScript 구문 형태는 Function 인스턴스를 생성한다. built-in GeneratorFunction, AsyncFunction, AsyncGeneratorFunction 서브클래스를 제외하고 Function 서브클래스 인스턴스를 만들 문법적 수단은 없다.

20.2.1.1 Function ( ...parameterArgs, bodyArg )

마지막 인수(있다면)는 함수 본문(실행 코드)을 지정하며 그 앞의 인수들은 형식 매개변수를 지정한다.

이 함수는 호출될 때 다음 단계를 수행한다:

  1. C 를 활성 함수 객체로 둔다.
  2. bodyArg 가 존재하지 않으면 빈 문자열로 설정한다.
  3. CreateDynamicFunction(C, NewTarget, normal, parameterArgs, bodyArg) 를 반환한다.
Note

각 형식 매개변수마다 하나의 인수를 두는 것은 허용되지만 필수는 아니다. 예를 들어 다음 세 표현식은 모두 동일 결과를 생성한다:

new Function("a", "b", "c", "return a+b+c")
new Function("a, b, c", "return a+b+c")
new Function("a,b", "c", "return a+b+c")

20.2.1.1.1 CreateDynamicFunction ( constructor, newTarget, kind, parameterArgs, bodyArg )

The abstract operation CreateDynamicFunction takes arguments constructor (생성자), newTarget (생성자 또는 undefined), kind (normal, generator, async, 또는 async-generator), parameterArgs (ECMAScript 언어 값 리스트), and bodyArg (ECMAScript 언어 값) and returns ECMAScript 함수 객체를 담은 정상 completion 또는 throw completion. constructor 는 이 동작을 수행 중인 생성자 함수. newTarget 은 처음에 new 가 적용된 생성자. parameterArgsbodyArgconstructor 에 전달된 인수 값. It performs the following steps when called:

  1. newTargetundefined 이면 newTarget = constructor.
  2. kindnormal 이면
    1. prefix = "function".
    2. exprSym = FunctionExpression.
    3. bodySym = FunctionBody[~Yield, ~Await].
    4. parameterSym = FormalParameters[~Yield, ~Await].
    5. fallbackProto = "%Function.prototype%".
  3. Else if kind = generator 이면
    1. prefix = "function*".
    2. exprSym = GeneratorExpression.
    3. bodySym = GeneratorBody.
    4. parameterSym = FormalParameters[+Yield, ~Await].
    5. fallbackProto = "%GeneratorFunction.prototype%".
  4. Else if kind = async 이면
    1. prefix = "async function".
    2. exprSym = AsyncFunctionExpression.
    3. bodySym = AsyncFunctionBody.
    4. parameterSym = FormalParameters[~Yield, +Await].
    5. fallbackProto = "%AsyncFunction.prototype%".
  5. Else
    1. 단언: kind = async-generator.
    2. prefix = "async function*".
    3. exprSym = AsyncGeneratorExpression.
    4. bodySym = AsyncGeneratorBody.
    5. parameterSym = FormalParameters[+Yield, +Await].
    6. fallbackProto = "%AsyncGeneratorFunction.prototype%".
  6. argCount = parameterArgs 요소 수.
  7. parameterStrings 를 새 빈 리스트로 둔다.
  8. parameterArgs 의 각 요소 arg 에 대해
    1. ToString(arg) 를 parameterStrings 에 추가한다.
  9. bodyString = ? ToString(bodyArg).
  10. currentRealm = 현재 Realm Record.
  11. HostEnsureCanCompileStrings(currentRealm, parameterStrings, bodyString, false) 수행.
  12. P = 빈 문자열.
  13. argCount > 0 이면
    1. P = parameterStrings[0].
    2. k = 1.
    3. 반복 (k < argCount)
      1. nextArgString = parameterStrings[k].
      2. P = P + "," + nextArgString.
      3. k = k + 1.
  14. bodyParseString = 0x000A, bodyString, 0x000A 의 문자열 연결.
  15. sourceString = prefix, " anonymous(", P, 0x000A, ") {", bodyParseString, "}" 의 문자열 연결.
  16. sourceText = StringToCodePoints(sourceString).
  17. parameters = ParseText(P, parameterSym).
  18. parameters 가 오류 리스트이면 SyntaxError throw.
  19. body = ParseText(bodyParseString, bodySym).
  20. body 가 오류 리스트이면 SyntaxError throw.
  21. NOTE: 매개변수와 본문을 개별적으로 파싱하여 각각 단독으로 유효함을 보장.
  22. NOTE: 이 단계에 도달했다면 sourceTextexprSym 문법을 가져야 한다.
  23. expr = ParseText(sourceText, exprSym).
  24. expr 이 오류 리스트이면 SyntaxError throw.
  25. proto = ? GetPrototypeFromConstructor(newTarget, fallbackProto).
  26. env = currentRealm.[[GlobalEnv]].
  27. privateEnv = null.
  28. F = OrdinaryFunctionCreate(proto, sourceText, parameters, body, non-lexical-this, env, privateEnv).
  29. SetFunctionName(F, "anonymous").
  30. kind = generator 이면
    1. prototype = OrdinaryObjectCreate(%GeneratorPrototype%).
    2. DefinePropertyOrThrow(F, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }).
  31. Else if kind = async-generator 이면
    1. prototype = OrdinaryObjectCreate(%AsyncGeneratorPrototype%).
    2. DefinePropertyOrThrow(F, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }).
  32. Else if kind = normal 이면
    1. MakeConstructor(F) 수행.
  33. NOTE: kindasync 인 함수는 constructable 하지 않다.
  34. F 를 반환한다.
Note

CreateDynamicFunction 은 kindasync 가 아닌 함수에 대해 생성자를 위해 사용할 가능성을 제공하기 위해 "prototype" 프로퍼티를 정의한다.

20.2.2 Function 생성자의 프로퍼티

Function 생성자는:

  • 자체가 내장 함수 객체이다.
  • 값이 %Function.prototype%[[Prototype]] 내부 슬롯을 가진다.
  • 값이 1𝔽"length" 프로퍼티를 가진다.
  • 다음 프로퍼티들을 가진다:

20.2.2.1 Function.prototype

Function.prototype 의 값은 Function 프로토타입 객체이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

20.2.3 Function 프로토타입 객체의 프로퍼티

Function 프로토타입 객체는:

  • %Function.prototype% 이다.
  • 자체가 내장 함수 객체이다.
  • 임의의 인수를 받아 호출되면 undefined 를 반환한다.
  • [[Construct]] 내부 메서드를 가지지 않아 new 와 함께 생성자로 사용할 수 없다.
  • 값이 %Object.prototype%[[Prototype]] 내부 슬롯을 가진다.
  • "prototype" 프로퍼티를 가지지 않는다.
  • 값이 +0𝔽"length" 프로퍼티를 가진다.
  • 값이 빈 문자열인 "name" 프로퍼티를 가진다.
Note

Function 프로토타입 객체를 함수 객체로 지정한 것은 ECMAScript 2015 이전 코드와의 호환성을 보장하기 위함이다.

20.2.3.1 Function.prototype.apply ( thisArg, argArray )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. functhis 값으로 둔다.
  2. IsCallable(func) 이 false 이면 TypeError 예외 throw.
  3. argArrayundefined 또는 null 이면
    1. PrepareForTailCall() 수행.
    2. Call(func, thisArg) 반환.
  4. argList 를 ? CreateListFromArrayLike(argArray) 로 둔다.
  5. PrepareForTailCall() 수행.
  6. Call(func, thisArg, argList) 반환.
Note 1

thisArg 값은 수정 없이 this 값으로 전달된다. 이는 3판과의 차이로, 그때는 undefined 또는 null thisArg전역 객체로 대체되고 다른 값에는 ToObject 가 적용되었다. 비엄격 함수는 진입 시 여전히 이러한 변환을 수행한다.

Note 2

func 이 화살표 함수나 bound 함수 특수 객체라면 step 6[[Call]] 에서 thisArg 는 무시된다.

20.2.3.2 Function.prototype.bind ( thisArg, ...args )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. Targetthis 값으로 둔다.
  2. IsCallable(Target) 이 false 이면 TypeError 예외 throw.
  3. F 를 ? BoundFunctionCreate(Target, thisArg, args) 로 둔다.
  4. L = 0.
  5. targetHasLength = ? HasOwnProperty(Target, "length").
  6. targetHasLength true 이면
    1. targetLen = ? Get(Target, "length").
    2. targetLen 이 Number 이면
      1. targetLen = +∞𝔽 이면 L = +∞.
      2. Else if targetLen = -∞𝔽 이면 L = 0.
      3. Else
        1. targetLenAsInt = ! ToIntegerOrInfinity(targetLen).
        2. 단언: targetLenAsInt 는 finite.
        3. argCount = args 요소 수.
        4. L = max(targetLenAsInt - argCount, 0).
  7. SetFunctionLength(F, L) 수행.
  8. targetName = ? Get(Target, "name").
  9. targetName 이 String 이 아니면 빈 문자열로 설정.
  10. SetFunctionName(F, targetName, "bound") 수행.
  11. F 반환.
Note 1

Function.prototype.bind 로 생성된 함수 객체는 특수(exotic) 객체이며 "prototype" 프로퍼티를 가지지 않는다.

Note 2

Target 이 화살표 함수나 bound 함수 특수 객체이면 이 메서드에 전달된 thisArg 는 이후 F 호출에서 사용되지 않는다.

20.2.3.3 Function.prototype.call ( thisArg, ...args )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. functhis 값으로 둔다.
  2. IsCallable(func) false 이면 TypeError 예외 throw.
  3. PrepareForTailCall() 수행.
  4. Call(func, thisArg, args) 반환.
Note 1

thisArg 는 수정 없이 전달된다(3판과의 차이). 비엄격 함수는 진입 시 변환 수행.

Note 2

func 이 화살표 또는 bound 함수 특수 객체이면 step 4[[Call]] 에서 thisArg 는 무시된다.

20.2.3.4 Function.prototype.constructor

Function.prototype.constructor 의 초기 값은 %Function%.

20.2.3.5 Function.prototype.toString ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. functhis 값으로 둔다.
  2. func 이 Object 이고 [[SourceText]] 내부 슬롯을 가지며 func.[[SourceText]] 가 유니코드 코드 포인트 시퀀스이고 HostHasSourceTextAvailable(func) 이 true 이면
    1. CodePointsToString(func.[[SourceText]]) 반환.
  3. func내장 함수 객체 이면 구현 정의 String 소스 표현을 반환한다. 표현은 NativeFunction 문법을 가져야 한다. 또한 func[[InitialName]] 내부 슬롯을 가지고 그것이 String 이면 반환된 String 중 NativeFunctionAccessoropt PropertyName 에 매치될 부분은 그 값이어야 한다.
  4. func 이 Object 이고 IsCallable(func) true 이면 구현 정의 String 소스 표현을 반환하며 문법은 NativeFunction.
  5. TypeError 예외 throw.
NativeFunction : function NativeFunctionAccessoropt PropertyName[~Yield, ~Await]opt ( FormalParameters[~Yield, ~Await] ) { [ native code ] } NativeFunctionAccessor : get set

20.2.3.6 Function.prototype [ %Symbol.hasInstance% ] ( V )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. Fthis 값으로 둔다.
  2. OrdinaryHasInstance(F, V) 를 반환한다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

Note

이것은 대부분의 함수가 상속하는 기본 %Symbol.hasInstance% 구현이다. %Symbol.hasInstance%instanceof 연산자가 값이 특정 생성자의 인스턴스인지 판정하기 위해 호출한다. 다음 표현식은

v instanceof F

다음과 같이 평가된다

F[%Symbol.hasInstance%](v)

생성자 함수는 함수에 다른 %Symbol.hasInstance% 메서드를 노출하여 어떤 객체를 자신의 인스턴스로 인식할지 제어할 수 있다.

이 프로퍼티는 bound 함수의 대상 함수를 전역적으로 노출할 수 있는 변조를 막기 위해 writable / configurable 이 아니다.

이 메서드의 "name" 프로퍼티 값은 "[Symbol.hasInstance]" 이다.

20.2.4 Function 인스턴스

모든 Function 인스턴스는 ECMAScript 함수 객체이며 Table 28 에 나열된 내부 슬롯을 가진다. Function.prototype.bind (20.2.3.2) 로 생성된 함수 객체Table 29 에 있는 내부 슬롯을 가진다.

Function 인스턴스는 다음 프로퍼티를 가진다:

20.2.4.1 length

"length" 프로퍼티 값은 함수가 일반적으로 기대하는 인수 수를 나타내는 정수 Number 이다. 언어는 다른 수의 인수로 호출하는 것을 허용한다. 지정된 "length" 와 다른 인수 수로 호출될 때의 동작은 함수에 따라 다르다. 이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.

20.2.4.2 name

"name" 프로퍼티 값은 함수를 서술하는 String 이다. 이름은 의미론적 중요성을 갖지 않고 보통 ECMAScript 소스에서 정의 지점에서 그 함수를 참조하는 변수 또는 프로퍼티 이름이다. 이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.

명세에 의해 문맥적 이름이 연관되지 않은 익명 함수 객체는 빈 문자열을 "name" 값으로 사용한다.

20.2.4.3 prototype

생성자로 사용할 수 있는 Function 인스턴스는 "prototype" 프로퍼티를 가진다. 그러한 Function 인스턴스가 생성될 때마다 또 다른 ordinary 객체가 생성되어 함수의 "prototype" 프로퍼티 초기 값이 된다. 달리 명시되지 않는 한 생성자로 그 함수가 호출될 때 생성되는 객체의 [[Prototype]] 내부 슬롯을 초기화하는 데 이 값이 사용된다.

이 프로퍼티는 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

Note

Function.prototype.bind 로 생성되거나 MethodDefinition (GeneratorMethod 또는 AsyncGeneratorMethod 아님) 평가 또는 ArrowFunction 으로 생성된 함수 객체"prototype" 프로퍼티를 가지지 않는다.

20.2.5 HostHasSourceTextAvailable ( func )

The host-defined abstract operation HostHasSourceTextAvailable takes argument func (함수 객체) and returns Boolean. 호스트 환경func 의 소스 텍스트 제공을 차단할 수 있도록 한다.

HostHasSourceTextAvailable 구현은 다음 요구사항을 따른다:

  • 매개변수에 대해 결정적이어야 한다. 특정 func 로 호출될 때마다 동일 결과를 반환해야 한다.

기본 구현은 true 를 반환한다.

20.3 Boolean 객체

20.3.1 Boolean 생성자

Boolean 생성자는 다음과 같다:

  • %Boolean% 이다.
  • 전역 객체 "Boolean" 프로퍼티의 초기 값이다.
  • 생성자로 호출될 때 새로운 Boolean 객체를 생성·초기화한다.
  • 생성자가 아니라 함수로 호출되면 타입 변환을 수행한다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 Boolean 동작을 상속하려는 서브클래스 생성자[[BooleanData]] 내부 슬롯을 가진 서브클래스 인스턴스를 생성·초기화하기 위해 Boolean 생성자super 호출을 포함해야 한다.

20.3.1.1 Boolean ( value )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. bToBoolean(value) 로 둔다.
  2. NewTarget 이 undefined 이면 b 를 반환한다.
  3. O 를 ? OrdinaryCreateFromConstructor(NewTarget, "%Boolean.prototype%", « [[BooleanData]] ») 로 둔다.
  4. O.[[BooleanData]] = b 로 설정한다.
  5. O 를 반환한다.

20.3.2 Boolean 생성자의 프로퍼티

Boolean 생성자는:

  • 값이 %Function.prototype%[[Prototype]] 내부 슬롯을 가진다.
  • 다음 프로퍼티들을 가진다:

20.3.2.1 Boolean.prototype

Boolean.prototype 의 초기 값은 Boolean 프로토타입 객체이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

20.3.3 Boolean 프로토타입 객체의 프로퍼티

Boolean 프로토타입 객체는:

  • %Boolean.prototype% 이다.
  • ordinary 객체이다.
  • 자체가 Boolean 객체이며 값이 false[[BooleanData]] 내부 슬롯을 가진다.
  • 값이 %Object.prototype%[[Prototype]] 내부 슬롯을 가진다.

20.3.3.1 Boolean.prototype.constructor

Boolean.prototype.constructor 의 초기 값은 %Boolean%.

20.3.3.2 Boolean.prototype.toString ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. b 를 ? ThisBooleanValue(this value) 로 둔다.
  2. btrue 이면 "true" 반환; 아니면 "false" 반환.

20.3.3.3 Boolean.prototype.valueOf ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. ThisBooleanValue(this value) 를 반환한다.

20.3.3.3.1 ThisBooleanValue ( value )

The abstract operation ThisBooleanValue takes argument value (ECMAScript 언어 값) and returns Boolean 을 담은 정상 completion 또는 throw completion. It performs the following steps when called:

  1. value 가 Boolean 이면 value 반환.
  2. value 가 Object 이고 [[BooleanData]] 내부 슬롯을 가지면
    1. bvalue.[[BooleanData]] 로 둔다.
    2. 단언: b 는 Boolean.
    3. b 반환.
  3. TypeError 예외 throw.

20.3.4 Boolean 인스턴스의 프로퍼티

Boolean 인스턴스는 Boolean 프로토타입 객체로부터 프로퍼티를 상속하는 ordinary 객체이다. Boolean 인스턴스는 [[BooleanData]] 내부 슬롯을 가진다. [[BooleanData]] 내부 슬롯은 이 Boolean 객체가 나타내는 Boolean 값이다.

20.4 Symbol 객체

20.4.1 Symbol 생성자

Symbol 생성자는 다음과 같다:

  • %Symbol% 이다.
  • 전역 객체 "Symbol" 프로퍼티의 초기 값이다.
  • 함수로 호출되면 새로운 Symbol 값을 반환한다.
  • new 연산자와 함께 사용하도록 의도되지 않았다.
  • 서브클래싱을 의도하지 않는다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있으나 그에 대한 super 호출은 예외를 유발한다.

20.4.1.1 Symbol ( [ description ] )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. NewTarget 가 undefined 가 아니면 TypeError 예외를 throw 한다.
  2. descriptionundefined 이면 descStringundefined 로 둔다.
  3. 그렇지 않으면 descString 을 ? ToString(description) 로 둔다.
  4. [[Description]]descString 인 새 Symbol 을 반환한다.

20.4.2 Symbol 생성자의 프로퍼티

Symbol 생성자는:

  • 값이 %Function.prototype%[[Prototype]] 내부 슬롯을 가진다.
  • 다음 프로퍼티들을 가진다:

20.4.2.1 Symbol.asyncIterator

Symbol.asyncIterator 의 초기 값은 well-known symbol %Symbol.asyncIterator% (Table 1) 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

20.4.2.2 Symbol.for ( key )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. Let stringKey be ? ToString(key).
  2. For each element e of the GlobalSymbolRegistry List, do
    1. If e.[[Key]] is stringKey, return e.[[Symbol]].
  3. Assert: The GlobalSymbolRegistry List does not currently contain an entry for stringKey.
  4. Let newSymbol be a new Symbol whose [[Description]] is stringKey.
  5. Append the GlobalSymbolRegistry Record { [[Key]]: stringKey, [[Symbol]]: newSymbol } to the GlobalSymbolRegistry List.
  6. Return newSymbol.

GlobalSymbolRegistry List 는 전역적으로 이용 가능한 append-only 리스트이다. 모든 realm 이 공유한다. 어떤 ECMAScript 코드도 평가되기 전에 새 빈 리스트로 초기화된다. 요소는 Table 61 에 정의된 구조의 Record 이다.

Table 61: GlobalSymbolRegistry Record 필드
Field Name Value Usage
[[Key]] a String 전역적으로 Symbol 을 식별하는 문자열 키.
[[Symbol]] a Symbol 어떤 realm 에서든 조회 가능한 symbol.

20.4.2.3 Symbol.hasInstance

Symbol.hasInstance 의 초기 값은 well-known symbol %Symbol.hasInstance% (Table 1) 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

20.4.2.4 Symbol.isConcatSpreadable

Symbol.isConcatSpreadable 의 초기 값은 well-known symbol %Symbol.isConcatSpreadable% (Table 1) 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

20.4.2.5 Symbol.iterator

Symbol.iterator 의 초기 값은 well-known symbol %Symbol.iterator% (Table 1) 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

20.4.2.6 Symbol.keyFor ( sym )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. sym 이 Symbol 이 아니면 TypeError 예외 throw.
  2. KeyForSymbol(sym) 을 반환한다.

20.4.2.7 Symbol.match

Symbol.match 의 초기 값은 well-known symbol %Symbol.match% (Table 1) 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

20.4.2.8 Symbol.matchAll

Symbol.matchAll 의 초기 값은 well-known symbol %Symbol.matchAll% (Table 1) 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

20.4.2.9 Symbol.prototype

Symbol.prototype 의 초기 값은 Symbol 프로토타입 객체이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

20.4.2.10 Symbol.replace

Symbol.replace 의 초기 값은 well-known symbol %Symbol.replace% (Table 1) 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

20.4.2.11 Symbol.search

Symbol.search 의 초기 값은 well-known symbol %Symbol.search% (Table 1) 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

20.4.2.12 Symbol.species

Symbol.species 의 초기 값은 well-known symbol %Symbol.species% (Table 1) 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

20.4.2.13 Symbol.split

Symbol.split 의 초기 값은 well-known symbol %Symbol.split% (Table 1) 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

20.4.2.14 Symbol.toPrimitive

Symbol.toPrimitive 의 초기 값은 well-known symbol %Symbol.toPrimitive% (Table 1) 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

20.4.2.15 Symbol.toStringTag

Symbol.toStringTag 의 초기 값은 well-known symbol %Symbol.toStringTag% (Table 1) 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

20.4.2.16 Symbol.unscopables

Symbol.unscopables 의 초기 값은 well-known symbol %Symbol.unscopables% (Table 1) 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

20.4.3 Symbol 프로토타입 객체의 프로퍼티

Symbol 프로토타입 객체는:

  • %Symbol.prototype% 이다.
  • ordinary 객체이다.
  • Symbol 인스턴스가 아니며 [[SymbolData]] 내부 슬롯을 갖지 않는다.
  • 값이 %Object.prototype%[[Prototype]] 내부 슬롯을 가진다.

20.4.3.1 Symbol.prototype.constructor

Symbol.prototype.constructor 의 초기 값은 %Symbol%.

20.4.3.2 get Symbol.prototype.description

Symbol.prototype.description 은 set 접근자 함수가 undefined접근자 프로퍼티이다. 그 get 접근자 함수는 호출 시 다음 단계를 수행한다:

  1. sthis 값으로 둔다.
  2. sym 을 ? ThisSymbolValue(s) 로 둔다.
  3. sym.[[Description]] 를 반환한다.

20.4.3.3 Symbol.prototype.toString ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. sym 을 ? ThisSymbolValue(this value) 로 둔다.
  2. SymbolDescriptiveString(sym) 을 반환한다.

20.4.3.3.1 SymbolDescriptiveString ( sym )

The abstract operation SymbolDescriptiveString takes argument sym (Symbol) and returns String. It performs the following steps when called:

  1. desc = sym.[[Description]].
  2. descundefined 이면 빈 문자열로 설정.
  3. 단언: desc 는 String.
  4. "Symbol(", desc, ")" 의 문자열 연결을 반환.

20.4.3.4 Symbol.prototype.valueOf ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. ThisSymbolValue(this value) 를 반환한다.

20.4.3.4.1 ThisSymbolValue ( value )

The abstract operation ThisSymbolValue takes argument value (ECMAScript 언어 값) and returns Symbol 을 담은 정상 completion 또는 throw completion. It performs the following steps when called:

  1. value 가 Symbol 이면 value 반환.
  2. value 가 Object 이고 [[SymbolData]] 내부 슬롯을 가지면
    1. svalue.[[SymbolData]] 로 둔다.
    2. 단언: s 는 Symbol.
    3. s 반환.
  3. TypeError 예외 throw.

20.4.3.5 Symbol.prototype [ %Symbol.toPrimitive% ] ( hint )

이 메서드는 ECMAScript 언어 연산자가 Symbol 객체를 원시 값으로 변환할 때 호출된다.

호출될 때 다음 단계를 수행한다:

  1. ThisSymbolValue(this value) 를 반환한다.
Note

인수는 무시된다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.

이 메서드의 "name" 프로퍼티 값은 "[Symbol.toPrimitive]" 이다.

20.4.3.6 Symbol.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 "Symbol" String 값이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.

20.4.4 Symbol 인스턴스의 프로퍼티

Symbol 인스턴스는 Symbol 프로토타입 객체로부터 프로퍼티를 상속하는 ordinary 객체이다. Symbol 인스턴스는 [[SymbolData]] 내부 슬롯을 가진다. [[SymbolData]] 내부 슬롯은 이 Symbol 객체가 나타내는 Symbol 값이다.

20.4.5 Symbol 을 위한 추상 연산

20.4.5.1 KeyForSymbol ( sym )

The abstract operation KeyForSymbol takes argument sym (Symbol) and returns String 또는 undefined. symGlobalSymbolRegistry List 에 있으면 sym 을 등록하는 데 사용된 String 이 반환된다. It performs the following steps when called:

  1. GlobalSymbolRegistry List 의 각 요소 e 에 대해
    1. SameValue(e.[[Symbol]], sym) 가 true 이면 e.[[Key]] 반환.
  2. 단언: GlobalSymbolRegistry List 에 현재 sym 항목 없음.
  3. undefined 반환.

20.5 Error 객체

Error 객체 인스턴스는 런타임 오류 발생 시 예외로 throw 된다. Error 객체는 사용자 정의 예외 클래스의 기반 객체로도 사용될 수 있다.

ECMAScript 구현이 런타임 오류를 감지하면 20.5.5 에 정의된 NativeError 객체 중 하나의 새 인스턴스나 20.5.7 에 정의된 AggregateError 객체의 새 인스턴스를 throw 한다.

20.5.1 Error 생성자

Error 생성자는 다음과 같다:

  • %Error% 이다.
  • 전역 객체 "Error" 프로퍼티의 초기 값이다.
  • 생성자가 아니라 함수로 호출될 때 새 Error 객체를 생성·초기화한다. 따라서 Error(…) 호출은 동일 인수를 가진 new Error(…) 와 동등하다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 Error 동작을 상속하려는 서브클래스 생성자[[ErrorData]] 내부 슬롯을 가진 서브클래스 인스턴스를 만들기 위해 Error 생성자super 호출을 포함해야 한다.

20.5.1.1 Error ( message [ , options ] )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. NewTarget 이 undefined 이면 newTarget = 활성 함수 객체; 아니면 newTarget = NewTarget.
  2. O 를 ? OrdinaryCreateFromConstructor(newTarget, "%Error.prototype%", « [[ErrorData]] ») 로 둔다.
  3. messageundefined 가 아니면
    1. msg = ? ToString(message).
    2. CreateNonEnumerableDataPropertyOrThrow(O, "message", msg) 수행.
  4. InstallErrorCause(O, options) 수행.
  5. O 반환.

20.5.2 Error 생성자의 프로퍼티

Error 생성자는:

  • 값이 %Function.prototype%[[Prototype]] 내부 슬롯을 가진다.
  • 다음 프로퍼티들을 가진다:

20.5.2.1 Error.isError ( arg )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. arg 가 Object 가 아니면 false 반환.
  2. arg[[ErrorData]] 내부 슬롯을 가지지 않으면 false 반환.
  3. true 반환.

20.5.2.2 Error.prototype

Error.prototype 의 초기 값은 Error 프로토타입 객체이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

20.5.3 Error 프로토타입 객체의 프로퍼티

Error 프로토타입 객체는:

  • %Error.prototype% 이다.
  • ordinary 객체이다.
  • Error 인스턴스가 아니며 [[ErrorData]] 내부 슬롯을 갖지 않는다.
  • 값이 %Object.prototype%[[Prototype]] 내부 슬롯을 가진다.

20.5.3.1 Error.prototype.constructor

Error.prototype.constructor 의 초기 값은 %Error%.

20.5.3.2 Error.prototype.message

Error.prototype.message 의 초기 값은 빈 문자열이다.

20.5.3.3 Error.prototype.name

Error.prototype.name 의 초기 값은 "Error".

20.5.3.4 Error.prototype.toString ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. Othis 값으로 둔다.
  2. O 가 Object 가 아니면 TypeError 예외 throw.
  3. name = ? Get(O, "name").
  4. nameundefined 이면 name = "Error"; 아니면 name = ? ToString(name).
  5. msg = ? Get(O, "message").
  6. msgundefined 이면 msg = 빈 문자열; 아니면 msg = ? ToString(msg).
  7. name 이 빈 문자열이면 msg 반환.
  8. msg 가 빈 문자열이면 name 반환.
  9. name, 0x003A, 0x0020, msg 의 문자열 연결을 반환.

20.5.4 Error 인스턴스의 프로퍼티

Error 인스턴스는 Error 프로토타입 객체로부터 프로퍼티를 상속하는 ordinary 객체이며 값이 undefined[[ErrorData]] 내부 슬롯을 가진다. [[ErrorData]] 의 유일한 지정 용도는 Object.prototype.toStringError.isError 에서 Error, AggregateError, NativeError 인스턴스를 식별하는 것이다.

20.5.5 이 표준에서 사용되는 Native Error 타입

런타임 오류가 감지되면 아래 NativeError 객체 중 하나 또는 AggregateError 객체의 새 인스턴스가 throw 된다. 모든 NativeError 객체는 20.5.6 에 설명된 동일 구조를 공유한다.

20.5.5.1 EvalError

EvalError 생성자%EvalError% 이다.

이 예외는 현재 이 명세 내부에서는 사용되지 않는다. 이전 판과의 호환성을 위해 남아 있다.

20.5.5.2 RangeError

RangeError 생성자%RangeError% 이다.

허용 가능한 값의 집합 또는 범위에 속하지 않는 값을 나타낸다.

20.5.5.3 ReferenceError

ReferenceError 생성자%ReferenceError% 이다.

잘못된 참조가 감지되었음을 나타낸다.

20.5.5.4 SyntaxError

SyntaxError 생성자%SyntaxError% 이다.

파싱 오류가 발생했음을 나타낸다.

20.5.5.5 TypeError

TypeError 생성자%TypeError% 이다.

다른 NativeError 객체 어느 것도 실패 원인을 적절히 나타내지 못할 때 실패한 연산을 나타내는 데 사용된다.

20.5.5.6 URIError

URIError 생성자%URIError% 이다.

글로벌 URI 처리 함수 중 하나가 그 정의와 호환되지 않는 방식으로 사용되었음을 나타낸다.

20.5.6 NativeError 객체 구조

이 객체 각각은 아래에 설명된 구조를 가지며, 생성자 이름과 프로토타입 객체의 "name" 프로퍼티만 다르다.

각 error 객체에 대해 정의 내 NativeError 참조는 20.5.5 의 해당 error 객체 이름으로 대체되어야 한다.

20.5.6.1 NativeError 생성자

NativeError 생성자는:

  • 생성자가 아니라 함수로 호출될 때 새 NativeError 객체를 생성·초기화한다. 함수 호출 NativeError(…) 는 동일 인수를 가진 new NativeError(…) 와 동등하다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 NativeError 동작을 상속하려는 서브클래스 생성자[[ErrorData]] 내부 슬롯을 가진 서브클래스 인스턴스를 생성·초기화하기 위해 NativeError 생성자super 호출을 포함해야 한다.

20.5.6.1.1 NativeError ( message [ , options ] )

NativeError 함수는 호출될 때 다음 단계를 수행한다:

  1. NewTarget 이 undefined 이면 newTarget = 활성 함수 객체; 아니면 newTarget = NewTarget.
  2. O 를 ? OrdinaryCreateFromConstructor(newTarget, "%NativeError.prototype%", « [[ErrorData]] ») 로 둔다.
  3. messageundefined 가 아니면
    1. msg = ? ToString(message).
    2. CreateNonEnumerableDataPropertyOrThrow(O, "message", msg) 수행.
  4. InstallErrorCause(O, options) 수행.
  5. O 반환.

step 2 에 전달되는 문자열의 실제 값은 정의 중인 NativeError 생성자에 따라 "%EvalError.prototype%", "%RangeError.prototype%", "%ReferenceError.prototype%", "%SyntaxError.prototype%", "%TypeError.prototype%", "%URIError.prototype%" 중 하나이다.

20.5.6.2 NativeError 생성자의 프로퍼티

NativeError 생성자는:

  • 값이 %Error%[[Prototype]] 내부 슬롯을 가진다.
  • 값이 String "NativeError""name" 프로퍼티를 가진다.
  • 다음 프로퍼티들을 가진다:

20.5.6.2.1 NativeError.prototype

NativeError.prototype 의 초기 값은 NativeError 프로토타입 객체 (20.5.6.3). 각 NativeError 생성자는 서로 다른 프로토타입 객체를 가진다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

20.5.6.3 NativeError 프로토타입 객체의 프로퍼티

NativeError 프로토타입 객체는:

  • ordinary 객체이다.
  • Error 인스턴스가 아니며 [[ErrorData]] 내부 슬롯을 갖지 않는다.
  • 값이 %Error.prototype%[[Prototype]] 내부 슬롯을 가진다.

20.5.6.3.1 NativeError.prototype.constructor

특정 NativeError 생성자에 대한 프로토타입의 "constructor" 프로퍼티 초기 값은 그 생성자 자체이다.

20.5.6.3.2 NativeError.prototype.message

특정 NativeError 생성자 프로토타입의 "message" 프로퍼티 초기 값은 빈 문자열이다.

20.5.6.3.3 NativeError.prototype.name

특정 NativeError 생성자 프로토타입의 "name" 프로퍼티 초기 값은 ( NativeError 대신 사용되는 ) 생성자의 이름으로 이루어진 String 값이다.

20.5.6.4 NativeError 인스턴스의 프로퍼티

NativeError 인스턴스는 해당 NativeError 프로토타입 객체로부터 프로퍼티를 상속하는 ordinary 객체이며 값이 undefined[[ErrorData]] 내부 슬롯을 가진다. [[ErrorData]] 의 유일한 지정 용도는 Object.prototype.toString (20.1.3.6) 과 Error.isError (20.5.2.1) 에서 Error, AggregateError 또는 NativeError 인스턴스를 식별하는 것이다.

20.5.7 AggregateError 객체

20.5.7.1 AggregateError 생성자

AggregateError 생성자는 다음과 같다:

  • %AggregateError% 이다.
  • 전역 객체 "AggregateError" 프로퍼티의 초기 값이다.
  • 생성자가 아니라 함수로 호출될 때 새 AggregateError 객체를 생성·초기화한다. 따라서 AggregateError(…) 호출은 동일 인수를 가진 new AggregateError(…) 와 동등하다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 AggregateError 동작을 상속하려는 서브클래스 생성자[[ErrorData]] 내부 슬롯을 가진 서브클래스 인스턴스를 생성·초기화하기 위해 AggregateError 생성자super 호출을 포함해야 한다.

20.5.7.1.1 AggregateError ( errors, message [ , options ] )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. NewTarget 이 undefined 이면 newTarget = 활성 함수 객체; 아니면 newTarget = NewTarget.
  2. O 를 ? OrdinaryCreateFromConstructor(newTarget, "%AggregateError.prototype%", « [[ErrorData]] ») 로 둔다.
  3. messageundefined 가 아니면
    1. msg = ? ToString(message).
    2. CreateNonEnumerableDataPropertyOrThrow(O, "message", msg) 수행.
  4. InstallErrorCause(O, options) 수행.
  5. errorsList 를 ? IteratorToList(? GetIterator(errors, sync)) 로 둔다.
  6. DefinePropertyOrThrow(O, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errorsList) }) 수행.
  7. O 반환.

20.5.7.2 AggregateError 생성자의 프로퍼티

AggregateError 생성자는:

  • 값이 %Error%[[Prototype]] 내부 슬롯을 가진다.
  • 다음 프로퍼티들을 가진다:

20.5.7.2.1 AggregateError.prototype

AggregateError.prototype 의 초기 값은 %AggregateError.prototype% 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

20.5.7.3 AggregateError 프로토타입 객체의 프로퍼티

AggregateError 프로토타입 객체는:

  • %AggregateError.prototype% 이다.
  • ordinary 객체이다.
  • Error 인스턴스나 AggregateError 인스턴스가 아니며 [[ErrorData]] 내부 슬롯을 갖지 않는다.
  • 값이 %Error.prototype%[[Prototype]] 내부 슬롯을 가진다.

20.5.7.3.1 AggregateError.prototype.constructor

AggregateError.prototype.constructor 의 초기 값은 %AggregateError%.

20.5.7.3.2 AggregateError.prototype.message

AggregateError.prototype.message 의 초기 값은 빈 문자열이다.

20.5.7.3.3 AggregateError.prototype.name

AggregateError.prototype.name 의 초기 값은 "AggregateError".

20.5.7.4 AggregateError 인스턴스의 프로퍼티

AggregateError 인스턴스는 해당 AggregateError 프로토타입 객체로부터 프로퍼티를 상속하는 ordinary 객체이며 값이 undefined[[ErrorData]] 내부 슬롯을 가진다. [[ErrorData]] 의 유일한 지정 용도는 Object.prototype.toString (20.1.3.6) 과 Error.isError (20.5.2.1) 에서 Error, AggregateError, NativeError 인스턴스를 식별하는 것이다.

20.5.8 Error 객체를 위한 추상 연산

20.5.8.1 InstallErrorCause ( O, options )

The abstract operation InstallErrorCause takes arguments O (Object) and options (ECMAScript 언어 값) and returns unused 를 담은 정상 completion 또는 throw completion. options"cause" 프로퍼티가 존재할 때 O"cause" 프로퍼티를 생성하는 데 사용된다. It performs the following steps when called:

  1. options 가 Object 이고 ? HasProperty(options, "cause") 가 true 이면
    1. cause 를 ? Get(options, "cause") 로 둔다.
    2. CreateNonEnumerableDataPropertyOrThrow(O, "cause", cause) 수행.
  2. unused 를 반환한다.