페이지 표시 설정

7 추상 연산

이러한 연산은 ECMAScript 언어의 일부가 아닙니다. ECMAScript 언어의 의미론을 명시하는 데 도움을 주기 위해서만 여기에서 정의합니다. 그 밖의 보다 특수한 추상 연산은 이 명세 전반에 걸쳐 정의되어 있습니다.

7.1 타입 변환

ECMAScript 언어는 필요에 따라 자동 타입 변환을 암묵적으로 수행합니다. 특정 구성 요소의 의미론을 명확히 하기 위해 변환 추상 연산의 집합을 정의하는 것이 유용합니다. 변환 추상 연산은 다형적이며 모든 ECMAScript 언어 타입의 값을 받을 수 있습니다. 그러나 이러한 연산에는 다른 명세 타입을 사용하지 않습니다.

BigInt 타입에는 ECMAScript 언어의 암묵적 변환이 없습니다. 프로그래머는 다른 타입의 값을 변환하려면 BigInt를 명시적으로 호출해야 합니다.

7.1.1 ToPrimitive ( input [ , preferredType ] )

추상 연산 ToPrimitive. 인수 input (ECMAScript 언어 값) 및 선택적 인수 preferredType ((string 또는 number)). 반환값: (정상 완료 (값: ECMAScript 언어 값) 또는 throw 완료). input 인수를 Object가 아닌 타입으로 변환합니다. 객체가 둘 이상의 원시 타입으로 변환될 수 있는 경우, 선택적 힌트 preferredType을 사용하여 해당 타입을 우선할 수 있습니다. 호출되면 다음 단계를 수행한다.

  1. input이 Object이면, 다음을 수행합니다.
    1. exoticToPrimitive를 ? GetMethod(input, %Symbol.toPrimitive%)로 둡니다.
    2. exoticToPrimitive가 undefined가 아니면, 다음을 수행합니다.
      1. preferredType이 존재하지 않으면, 다음을 수행합니다.
        1. hint를 "default"로 둡니다.
      2. 그렇지 않고 preferredType이 string이면, 다음을 수행합니다.
        1. hint를 "string"으로 둡니다.
      3. 그렇지 않으면,
        1. 단언: preferredType은 number입니다.
        2. hint를 "number"로 둡니다.
      4. result를 ? Call(exoticToPrimitive, input, « hint »)로 둡니다.
      5. result가 Object가 아니면, result를 반환합니다.
      6. TypeError 예외를 던집니다.
    3. preferredType이 존재하지 않으면, preferredType을 number로 설정합니다.
    4. ? OrdinaryToPrimitive(input, preferredType)를 반환합니다.
  2. input을 반환합니다.
참고

힌트 없이 ToPrimitive를 호출하면 일반적으로 힌트가 number인 것처럼 동작합니다. 그러나 객체는 %Symbol.toPrimitive% 메서드를 정의하여 이 동작을 재정의할 수 있습니다. 이 명세에 정의된 객체 중 기본 ToPrimitive 동작을 재정의하는 것은 Date(21.4.4.45 참조)와 Symbol 객체(20.4.3.5 참조)뿐입니다. Date는 힌트가 없는 경우를 힌트가 string인 것처럼 취급합니다.

7.1.1.1 OrdinaryToPrimitive ( obj, hint )

추상 연산 OrdinaryToPrimitive. 인수 obj (Object) 및 hint (string 또는 number). 반환값: ECMAScript 언어 값을 포함하는 정상 완료 또는 throw 완료. 호출되면 다음 단계를 수행한다.

  1. hint가 string이면, 다음을 수행합니다.
    1. methodNames를 « "toString", "valueOf" »로 둡니다.
  2. 그렇지 않으면,
    1. methodNames를 « "valueOf", "toString" »로 둡니다.
  3. methodNames의 각 요소 name에 대해 다음을 수행합니다.
    1. method를 ? Get(obj, name)으로 둡니다.
    2. IsCallable(method)이 true이면, 다음을 수행합니다.
      1. result를 ? Call(method, obj)로 둡니다.
      2. result가 Object가 아니면, result를 반환합니다.
  4. TypeError 예외를 던집니다.

7.1.2 ToBoolean ( arg )

추상 연산 ToBoolean. 인수 arg (ECMAScript 언어 값). 반환값: Boolean. arg를 Boolean 타입의 값으로 변환합니다. 호출되면 다음 단계를 수행한다.

  1. arg가 Boolean이면, arg를 반환합니다.
  2. arg가 undefined, null, +0𝔽, -0𝔽, NaN, 0ℤ 또는 빈 String 중 하나이면, false를 반환합니다.
  3. Normative Optional
    호스트가 웹 브라우저이거나 그 밖의 방식으로 [[IsHTMLDDA]] 내부 슬롯을 지원하면, 다음을 수행합니다.
    1. arg가 Object이고 arg에 [[IsHTMLDDA]] 내부 슬롯이 있으면, false를 반환합니다.
  4. true를 반환합니다.

7.1.3 ToNumeric ( arg )

추상 연산 ToNumeric. 인수 arg (ECMAScript 언어 값). 반환값: Number 또는 BigInt를 포함하는 정상 완료 또는 throw 완료. arg를 Number 또는 BigInt로 변환하여 반환합니다. 호출되면 다음 단계를 수행한다.

  1. primitiveValue를 ? ToPrimitive(arg, number)로 둡니다.
  2. primitiveValue가 BigInt이면, primitiveValue를 반환합니다.
  3. ? ToNumber(primitiveValue)를 반환합니다.

7.1.4 ToNumber ( arg )

추상 연산 ToNumber. 인수 arg (ECMAScript 언어 값). 반환값: Number를 포함하는 정상 완료 또는 throw 완료. arg를 Number 타입의 값으로 변환합니다. 호출되면 다음 단계를 수행한다.

  1. arg가 Number이면, arg를 반환합니다.
  2. arg가 Symbol 또는 BigInt이면, TypeError 예외를 던집니다.
  3. arg가 undefined이면, NaN을 반환합니다.
  4. arg가 null 또는 false이면, +0𝔽을 반환합니다.
  5. arg가 true이면, 1𝔽을 반환합니다.
  6. arg가 String이면, StringToNumber(arg)를 반환합니다.
  7. 단언: arg는 Object입니다.
  8. primitiveValue를 ? ToPrimitive(arg, number)로 둡니다.
  9. 단언: primitiveValue는 Object가 아닙니다.
  10. ? ToNumber(primitiveValue)를 반환합니다.

7.1.4.1 String 타입에 적용되는 ToNumber

추상 연산 StringToNumber는 다음 문법을 사용하여 String 값을 Number 값으로 변환하는 방법을 명시합니다.

구문

StringNumericLiteral ::: StrWhiteSpaceopt StrWhiteSpaceopt StrNumericLiteral StrWhiteSpaceopt StrWhiteSpace ::: StrWhiteSpaceChar StrWhiteSpaceopt StrWhiteSpaceChar ::: WhiteSpace LineTerminator StrNumericLiteral ::: StrDecimalLiteral NonDecimalIntegerLiteral[~Sep] StrDecimalLiteral ::: StrUnsignedDecimalLiteral + StrUnsignedDecimalLiteral - StrUnsignedDecimalLiteral StrUnsignedDecimalLiteral ::: Infinity DecimalDigits[~Sep] . DecimalDigits[~Sep]opt ExponentPart[~Sep]opt . DecimalDigits[~Sep] ExponentPart[~Sep]opt DecimalDigits[~Sep] ExponentPart[~Sep]opt

위에서 명시적으로 정의되지 않은 모든 문법 기호에는 숫자 리터럴의 어휘 문법(12.9.3)에서 사용하는 정의가 적용됩니다.

참고

StringNumericLiteral과 NumericLiteral의 구문에는 다음과 같은 몇 가지 차이가 있음을 유의하시기 바랍니다:

7.1.4.1.1 StringToNumber ( string )

추상 연산 StringToNumber. 인수 string (String). 반환값: Number. 호출되면 다음 단계를 수행한다.

  1. literal을 ParseText(string, StringNumericLiteral)로 둡니다.
  2. literal이 오류의 List이면, NaN을 반환합니다.
  3. literal의 StringNumericValue를 반환합니다.

7.1.4.1.2 Runtime Semantics: StringNumericValue

구문 지향 연산 StringNumericValue. 인수 없음. 반환값: Number.

참고

StringNumericLiteral을 Number 값으로 변환하는 것은 전반적으로 NumericLiteral의 NumericValue를 결정하는 것과 유사하지만(12.9.3 참조), 일부 세부 사항은 다릅니다.

다음 생성 규칙별로 정의된다.

StringNumericLiteral ::: StrWhiteSpaceopt
  1. +0𝔽을 반환합니다.
StringNumericLiteral ::: StrWhiteSpaceopt StrNumericLiteral StrWhiteSpaceopt
  1. StrNumericLiteral의 StringNumericValue를 반환합니다.
StrNumericLiteral ::: NonDecimalIntegerLiteral
  1. 𝔽(NonDecimalIntegerLiteral의 MV)를 반환합니다.
StrDecimalLiteral ::: - StrUnsignedDecimalLiteral
  1. a를 StrUnsignedDecimalLiteral의 StringNumericValue로 둡니다.
  2. a가 +0𝔽이면, -0𝔽을 반환합니다.
  3. -a를 반환합니다.
StrUnsignedDecimalLiteral ::: Infinity
  1. +∞𝔽을 반환합니다.
StrUnsignedDecimalLiteral ::: DecimalDigits . DecimalDigitsopt ExponentPartopt
  1. a를 첫 번째 DecimalDigits의 MV로 둡니다.
  2. 두 번째 DecimalDigits가 존재하면, 다음을 수행합니다.
    1. b를 두 번째 DecimalDigits의 MV로 둡니다.
    2. n을 두 번째 DecimalDigits의 코드 포인트 수로 둡니다.
  3. 그렇지 않으면,
    1. b를 0으로 둡니다.
    2. n을 0으로 둡니다.
  4. ExponentPart가 존재하면 e를 ExponentPart의 MV로 둡니다. 그렇지 않으면 e를 0으로 둡니다.
  5. RoundMVResult((a + (b × 10-n)) × 10e)를 반환합니다.
StrUnsignedDecimalLiteral ::: . DecimalDigits ExponentPartopt
  1. b를 DecimalDigits의 MV로 둡니다.
  2. ExponentPart가 존재하면 e를 ExponentPart의 MV로 둡니다. 그렇지 않으면 e를 0으로 둡니다.
  3. n을 DecimalDigits의 코드 포인트 수로 둡니다.
  4. RoundMVResult(b × 10e - n)를 반환합니다.
StrUnsignedDecimalLiteral ::: DecimalDigits ExponentPartopt
  1. a를 DecimalDigits의 MV로 둡니다.
  2. ExponentPart가 존재하면 e를 ExponentPart의 MV로 둡니다. 그렇지 않으면 e를 0으로 둡니다.
  3. RoundMVResult(a × 10e)를 반환합니다.

7.1.4.1.3 RoundMVResult ( n )

추상 연산 RoundMVResult. 인수 n (수학적 값). 반환값: Number. 구현체 정의 방식으로 n을 Number로 변환합니다. 이 추상 연산에서 숫자가 0이 아니거나, 그 왼쪽에 0이 아닌 숫자가 있고 오른쪽에도 0이 아닌 숫자가 있으면 해당 숫자는 유효한 것으로 간주됩니다. 이 추상 연산에서 수학적 값의 표현이 “나타내는 수학적 값”은 수학적 값의 “십진 표현”의 역변환입니다. 호출되면 다음 단계를 수행한다.

  1. n의 십진 표현에 유효 숫자가 20개 이하이면, 𝔽(n)을 반환합니다.
  2. option1을 n의 십진 표현에서 20번째 이후의 각 유효 숫자를 0 숫자로 바꾼 결과가 나타내는 수학적 값으로 둡니다.
  3. option2를 n의 십진 표현에서 20번째 이후의 각 유효 숫자를 0 숫자로 바꾼 다음 20번째 위치의 값을 1 증가시킨 결과(필요한 경우 올림 포함)가 나타내는 수학적 값으로 둡니다.
  4. chosen을 option1 또는 option2 중 구현체 정의 방식으로 선택한 값으로 둡니다.
  5. 𝔽(chosen)을 반환합니다.

7.1.5 ToIntegerOrInfinity ( arg )

추상 연산 ToIntegerOrInfinity. 인수 arg (ECMAScript 언어 값). 반환값: (정상 완료 (값: (정수, +∞ 또는 -∞)) 또는 throw 완료). arg를 소수 부분을 잘라낸 Number 값을 나타내는 정수로 변환하거나, 해당 Number 값이 무한이면 +∞ 또는 -∞로 변환합니다. 호출되면 다음 단계를 수행한다.

  1. number를 ? ToNumber(arg)로 둡니다.
  2. number가 NaN, +0𝔽 또는 -0𝔽 중 하나이면, 0을 반환합니다.
  3. number가 +∞𝔽이면, +∞를 반환합니다.
  4. number가 -∞𝔽이면, -∞를 반환합니다.
  5. truncate(ℝ(number))를 반환합니다.
참고
𝔽(ToIntegerOrInfinity(x))는 x의 어떤 값에 대해서도 -0𝔽을 반환하지 않습니다. 소수 부분의 절삭은 x를 수학적 값으로 변환한 후 수행됩니다.

7.1.6 SnapToInteger ( arg, nonIntHandling [ , minimum [ , maximum ] ] )

추상 연산 SnapToInteger. 인수 arg (ECMAScript 언어 값) 및 nonIntHandling ((reject 또는 truncate)) 및 선택적 인수 minimum (정수) 및 maximum (정수). 반환값: (정상 완료 (값: 정수) 또는 throw 완료). arg를 해당 Number 값을 나타내는 정수로 변환하며, 유한하지 않은 값을 거부하고 유한하지만 정수가 아닌 값은 거부하거나 절삭하여 처리하며, 선택적으로 양 끝을 포함하는 제한 범위를 적용합니다. 호출되면 다음 단계를 수행한다.

  1. number를 ? ToNumber(arg)로 둡니다.
  2. number가 NaN, +∞𝔽 또는 -∞𝔽 중 하나이면, RangeError 예외를 던집니다.
  3. mv를 ℝ(number)로 둡니다.
  4. nonIntHandling이 truncate이면, mv를 truncate(mv)로 설정합니다.
  5. mv가 정수가 아니면, RangeError 예외를 던집니다.
  6. minimum이 존재하고 mv < minimum이면, RangeError 예외를 던집니다.
  7. maximum이 존재하고 mv > maximum이면, RangeError 예외를 던집니다.
  8. mv를 반환합니다.

7.1.7 ToFixedSizeInteger ( int, signed, bitWidth )

추상 연산 ToFixedSizeInteger. 인수 int ((정수, +∞ 또는 -∞)), signed ((unsigned 또는 signed)) 및 bitWidth (양의 정수). 반환값: 정수. int를 2bitWidth개의 정수 중 하나로 매핑합니다. signed가 unsigned이면 0부터 2bitWidth - 1까지의 닫힌 구간에 있는 정수로, signed가 signed이면 -2bitWidth - 1부터 2bitWidth - 1 - 1까지의 닫힌 구간에 있는 정수로 매핑합니다. 호출되면 다음 단계를 수행한다.

  1. int = +∞ 또는 int = -∞이면, 0을 반환합니다.
  2. fixedInt를 int modulo 2bitWidth로 둡니다.
  3. 참고: 다음 단계는 fixedInt의 2의 보수 표현을 변경하지 않습니다.
  4. signed가 signed이고 fixedInt ≥ 2bitWidth - 1이면, fixedInt를 fixedInt - 2bitWidth로 설정합니다.
  5. fixedInt를 반환합니다.
참고

ToFixedSizeInteger는 멱등성을 가집니다. 즉, 임의의 ECMAScript 언어 값 x에 대해 ToFixedSizeInteger(ToFixedSizeInteger(x, signed, bitWidth), signed, bitWidth)는 ToFixedSizeInteger(x, signed, bitWidth)와 같습니다. 실제로 +∞와 -∞가 0으로 매핑되므로 이 불변 조건은 signed를 반대로 바꾸더라도 유지됩니다(예: ToFixedSizeInteger(ToFixedSizeInteger(x, signed, 32), unsigned, 32)는 ToFixedSizeInteger(x, unsigned, 32)와 같습니다).

7.1.8 ToInt32 ( arg )

추상 연산 ToInt32. 인수 arg (ECMAScript 언어 값). 반환값: (정상 완료 (값: 정수인 Number) 또는 throw 완료). arg를 𝔽(-231)부터 𝔽(231 - 1)까지의 닫힌 구간에 있는 232개의 정수인 Number 값 중 하나로 변환하며, -0𝔽은 제외합니다. 호출되면 다음 단계를 수행한다.

  1. int를 ? ToIntegerOrInfinity(arg)로 둡니다.
  2. 𝔽(ToFixedSizeInteger(int, signed, 32))를 반환합니다.

7.1.9 ToUint32 ( arg )

추상 연산 ToUint32. 인수 arg (ECMAScript 언어 값). 반환값: (정상 완료 (값: 정수인 Number) 또는 throw 완료). arg를 +0𝔽부터 𝔽(232 - 1)까지의 닫힌 구간에 있는 232개의 정수인 Number 값 중 하나로 변환합니다. 호출되면 다음 단계를 수행한다.

  1. int를 ? ToIntegerOrInfinity(arg)로 둡니다.
  2. 𝔽(ToFixedSizeInteger(int, unsigned, 32))를 반환합니다.

7.1.10 ToInt16 ( arg )

추상 연산 ToInt16. 인수 arg (ECMAScript 언어 값). 반환값: (정상 완료 (값: 정수인 Number) 또는 throw 완료). arg를 𝔽(-215)부터 𝔽(215 - 1)까지의 닫힌 구간에 있는 216개의 정수인 Number 값 중 하나로 변환하며, -0𝔽은 제외합니다. 호출되면 다음 단계를 수행한다.

  1. int를 ? ToIntegerOrInfinity(arg)로 둡니다.
  2. 𝔽(ToFixedSizeInteger(int, signed, 16))를 반환합니다.

7.1.11 ToUint16 ( arg )

추상 연산 ToUint16. 인수 arg (ECMAScript 언어 값). 반환값: (정상 완료 (값: 정수인 Number) 또는 throw 완료). arg를 +0𝔽부터 𝔽(216 - 1)까지의 닫힌 구간에 있는 216개의 정수인 Number 값 중 하나로 변환합니다. 호출되면 다음 단계를 수행한다.

  1. int를 ? ToIntegerOrInfinity(arg)로 둡니다.
  2. 𝔽(ToFixedSizeInteger(int, unsigned, 16))를 반환합니다.

7.1.12 ToInt8 ( arg )

추상 연산 ToInt8. 인수 arg (ECMAScript 언어 값). 반환값: (정상 완료 (값: 정수인 Number) 또는 throw 완료). arg를 -128𝔽부터 127𝔽까지의 닫힌 구간에 있는 28개의 정수인 Number 값 중 하나로 변환하며, -0𝔽은 제외합니다. 호출되면 다음 단계를 수행한다.

  1. int를 ? ToIntegerOrInfinity(arg)로 둡니다.
  2. 𝔽(ToFixedSizeInteger(int, signed, 8))를 반환합니다.

7.1.13 ToUint8 ( arg )

추상 연산 ToUint8. 인수 arg (ECMAScript 언어 값). 반환값: (정상 완료 (값: 정수인 Number) 또는 throw 완료). arg를 +0𝔽부터 255𝔽까지의 닫힌 구간에 있는 28개의 정수인 Number 값 중 하나로 변환합니다. 호출되면 다음 단계를 수행한다.

  1. int를 ? ToIntegerOrInfinity(arg)로 둡니다.
  2. 𝔽(ToFixedSizeInteger(int, unsigned, 8))를 반환합니다.

7.1.14 ToUint8Clamp ( arg )

추상 연산 ToUint8Clamp. 인수 arg (ECMAScript 언어 값). 반환값: (정상 완료 (값: 정수인 Number) 또는 throw 완료). arg를 제한하고 반올림하여 +0𝔽부터 255𝔽까지의 닫힌 구간에 있는 28개의 정수인 Number 값 중 하나로 변환합니다. 호출되면 다음 단계를 수행한다.

  1. number를 ? ToNumber(arg)로 둡니다.
  2. number가 NaN이면, +0𝔽을 반환합니다.
  3. mv를 number의 확장된 수학적 값으로 둡니다.
  4. clamped를 mv를 0과 255 사이로 제한한 결과로 둡니다.
  5. f를 floor(clamped)로 둡니다.
  6. clamped < f + 0.5이면, 𝔽(f)를 반환합니다.
  7. clamped > f + 0.5이면, 𝔽(f + 1)을 반환합니다.
  8. f가 짝수이면, 𝔽(f)를 반환합니다.
  9. 𝔽(f + 1)을 반환합니다.
참고

대부분의 다른 ECMAScript 정수 변환 연산과 달리 ToUint8Clamp는 정수가 아닌 값을 절삭하지 않고 반올림합니다. 또한 “가장 가까운 짝수로 절반 반올림” 동률 결정 방식을 사용하며, 이는 Math.round의 “절반 올림” 동률 결정 방식과 다릅니다.

7.1.15 ToBigInt ( arg )

추상 연산 ToBigInt. 인수 arg (ECMAScript 언어 값). 반환값: (정상 완료 (값: BigInt) 또는 throw 완료). arg를 BigInt 값으로 변환하며, Number에서 암묵적 변환이 필요하면 예외를 던집니다. 호출되면 다음 단계를 수행한다.

  1. primitive를 ? ToPrimitive(arg, number)로 둡니다.
  2. 표 12에서 primitive에 대응하는 값을 반환합니다.
표 12: BigInt 변환
인수 타입 결과
Undefined TypeError 예외를 던집니다.
Null TypeError 예외를 던집니다.
Boolean primitive가 true이면 1n을 반환하고, primitive가 false이면 0n을 반환합니다.
BigInt primitive를 반환합니다.
Number TypeError 예외를 던집니다.
String
  1. n을 StringToBigInt(primitive)로 둡니다.
  2. n이 undefined이면, SyntaxError 예외를 던집니다.
  3. n을 반환합니다.
Symbol TypeError 예외를 던집니다.

7.1.16 StringToBigInt ( string )

추상 연산 StringToBigInt. 인수 string (String). 반환값: (BigInt 또는 undefined). 호출되면 다음 단계를 수행한다.

  1. literal을 ParseText(string, StringIntegerLiteral)로 둡니다.
  2. literal이 오류의 List이면, undefined를 반환합니다.
  3. mv를 literal의 MV로 둡니다.
  4. 단언: mv는 정수입니다.
  5. ℤ(mv)를 반환합니다.

7.1.16.1 StringIntegerLiteral 문법

StringToBigInt는 다음 문법을 사용합니다.

구문

StringIntegerLiteral ::: StrWhiteSpaceopt StrWhiteSpaceopt StrIntegerLiteral StrWhiteSpaceopt StrIntegerLiteral ::: SignedInteger[~Sep] NonDecimalIntegerLiteral[~Sep]

7.1.16.2 Runtime Semantics: MV

7.1.17 ToBigInt64 ( arg )

추상 연산 ToBigInt64. 인수 arg (ECMAScript 언어 값). 반환값: (정상 완료 (값: BigInt) 또는 throw 완료). arg를 ℤ(-263)부터 ℤ(263 - 1)까지의 닫힌 구간에 있는 264개의 BigInt 값 중 하나로 변환합니다. 호출되면 다음 단계를 수행한다.

  1. int를 ℝ(? ToBigInt(arg))로 둡니다.
  2. ℤ(ToFixedSizeInteger(int, signed, 64))를 반환합니다.

7.1.18 ToBigUint64 ( arg )

추상 연산 ToBigUint64. 인수 arg (ECMAScript 언어 값). 반환값: (정상 완료 (값: BigInt) 또는 throw 완료). arg를 0ℤ부터 ℤ(264 - 1)까지의 닫힌 구간에 있는 264개의 BigInt 값 중 하나로 변환합니다. 호출되면 다음 단계를 수행한다.

  1. int를 ℝ(? ToBigInt(arg))로 둡니다.
  2. ℤ(ToFixedSizeInteger(int, unsigned, 64))를 반환합니다.

7.1.19 ToString ( arg )

추상 연산 ToString. 인수 arg (ECMAScript 언어 값). 반환값: (정상 완료 (값: String) 또는 throw 완료). arg를 String 타입의 값으로 변환합니다. 호출되면 다음 단계를 수행한다.

  1. arg가 String이면, arg를 반환합니다.
  2. arg가 Symbol이면, TypeError 예외를 던집니다.
  3. arg가 undefined이면, "undefined"를 반환합니다.
  4. arg가 null이면, "null"을 반환합니다.
  5. arg가 true이면, "true"를 반환합니다.
  6. arg가 false이면, "false"를 반환합니다.
  7. arg가 Number이면, Number::toString(arg, 10)을 반환합니다.
  8. arg가 BigInt이면, BigInt::toString(arg, 10)을 반환합니다.
  9. 단언: arg는 Object입니다.
  10. primitiveValue를 ? ToPrimitive(arg, string)로 둡니다.
  11. 단언: primitiveValue는 Object가 아닙니다.
  12. ? ToString(primitiveValue)를 반환합니다.

7.1.20 ToObject ( arg )

추상 연산 ToObject. 인수 arg (ECMAScript 언어 값). 반환값: (정상 완료 (값: Object) 또는 throw 완료). arg를 Object 타입의 값으로 변환합니다. 호출되면 다음 단계를 수행한다.

  1. arg가 undefined 또는 null이면, TypeError 예외를 던집니다.
  2. arg가 Boolean이면, [[BooleanData]] 내부 슬롯이 arg로 설정된 새로운 Boolean 객체를 반환합니다. Boolean 객체에 대한 설명은 20.3를 참조하시기 바랍니다.
  3. arg가 Number이면, [[NumberData]] 내부 슬롯이 arg로 설정된 새로운 Number 객체를 반환합니다. Number 객체에 대한 설명은 21.1를 참조하시기 바랍니다.
  4. arg가 String이면, [[StringData]] 내부 슬롯이 arg로 설정된 새로운 String 객체를 반환합니다. String 객체에 대한 설명은 22.1를 참조하시기 바랍니다.
  5. arg가 Symbol이면, [[SymbolData]] 내부 슬롯이 arg로 설정된 새로운 Symbol 객체를 반환합니다. Symbol 객체에 대한 설명은 20.4를 참조하시기 바랍니다.
  6. arg가 BigInt이면, [[BigIntData]] 내부 슬롯이 arg로 설정된 새로운 BigInt 객체를 반환합니다. BigInt 객체에 대한 설명은 21.2를 참조하시기 바랍니다.
  7. 단언: arg는 Object입니다.
  8. arg를 반환합니다.

7.1.21 ToPropertyKey ( arg )

추상 연산 ToPropertyKey. 인수 arg (ECMAScript 언어 값). 반환값: (정상 완료 (값: 프로퍼티 키) 또는 throw 완료). arg를 프로퍼티 키로 사용할 수 있는 값으로 변환합니다. 호출되면 다음 단계를 수행한다.

  1. key를 ? ToPrimitive(arg, string)로 둡니다.
  2. key가 Symbol이면, 다음을 수행합니다.
    1. key를 반환합니다.
  3. ! ToString(key)을 반환합니다.

7.1.22 ToLength ( arg )

추상 연산 ToLength. 인수 arg (ECMAScript 언어 값). 반환값: (정상 완료 (값: 음이 아닌 정수인 Number) 또는 throw 완료). arg를 제한하고 절삭하여 배열과 유사한 객체의 길이로 사용하기에 적합한 음이 아닌 정수인 Number로 변환합니다. 호출되면 다음 단계를 수행한다.

  1. length를 ? ToIntegerOrInfinity(arg)로 둡니다.
  2. clampedLength를 length를 0과 253 - 1 사이로 제한한 결과로 둡니다.
  3. 𝔽(clampedLength)를 반환합니다.

7.1.23 CanonicalNumericIndexString ( arg )

추상 연산 CanonicalNumericIndexString. 인수 arg (String). 반환값: (Number 또는 undefined). arg가 "-0"이거나 어떤 Number 값 n에 대한 ToString(n)과 정확히 일치하면 각각에 대응하는 Number 값을 반환합니다. 그렇지 않으면 undefined를 반환합니다. 호출되면 다음 단계를 수행한다.

  1. arg가 "-0"이면, -0𝔽을 반환합니다.
  2. n을 ! ToNumber(arg)로 둡니다.
  3. ! ToString(n)이 arg이면, n을 반환합니다.
  4. undefined를 반환합니다.

정규 숫자 문자열은 CanonicalNumericIndexString 추상 연산이 undefined를 반환하지 않는 모든 String입니다.

7.1.24 ToIndex ( arg )

추상 연산 ToIndex. 인수 arg (ECMAScript 언어 값). 반환값: 음이 아닌 정수를 포함하는 정상 완료 또는 throw 완료. arg를 정수로 변환하고 해당 정수가 음이 아니며 정수 인덱스에 대응하면 그 정수를 반환합니다. 그렇지 않으면 예외를 던집니다. 호출되면 다음 단계를 수행한다.

  1. int를 ? ToIntegerOrInfinity(arg)로 둡니다.
  2. int가 0부터 253 - 1까지의 닫힌 구간에 없으면, RangeError 예외를 던집니다.
  3. int를 반환합니다.

7.1.25 ToAbsoluteIndex ( value, length )

추상 연산 ToAbsoluteIndex. 인수 value (ECMAScript 언어 값) 및 length (음이 아닌 정수). 반환값: (정상 완료 (값: (정수, +∞ 또는 -∞)) 또는 throw 완료). value를 정수, +∞ 또는 -∞로 변환하며, 음수 값은 length를 기준으로 상대적으로 해석합니다. 호출되면 다음 단계를 수행한다.

  1. int를 ? ToIntegerOrInfinity(value)로 둡니다.
  2. int가 유한하고 int < 0이면, int를 length + int로 설정합니다.
  3. int를 반환합니다.

7.1.26 ToClampedIndex ( value, length )

추상 연산 ToClampedIndex. 인수 value (ECMAScript 언어 값) 및 length (음이 아닌 정수). 반환값: (정상 완료 (값: 음이 아닌 정수) 또는 throw 완료). value를 정수로 변환하고(음수 값은 length를 기준으로 상대적으로 해석), 그 결과를 0부터 length까지의 닫힌 구간으로 제한합니다. 호출되면 다음 단계를 수행한다.

  1. index를 ? ToAbsoluteIndex(value, length)로 둡니다.
  2. index를 0과 length 사이로 제한한 결과를 반환합니다.

7.2 검사 및 비교 연산

7.2.1 RequireObjectCoercible ( arg )

추상 연산 RequireObjectCoercible. 인수 arg (ECMAScript 언어 값). 반환값: (정상 완료 (값: unused) 또는 throw 완료). arg가 ToObject를 사용하여 Object로 변환할 수 없는 값이면 오류를 던집니다. 호출되면 다음 단계를 수행한다.

  1. arg가 undefined 또는 null이면, TypeError 예외를 던집니다.
  2. unused를 반환합니다.

7.2.2 IsArray ( arg )

추상 연산 IsArray. 인수 arg (ECMAScript 언어 값). 반환값: (정상 완료 (값: Boolean) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. arg가 Object가 아니면, false를 반환합니다.
  2. arg가 Array 특수 객체이면, true를 반환합니다.
  3. arg가 Proxy 특수 객체이면, 다음을 수행합니다.
    1. ? ValidateNonRevokedProxy(arg)를 수행합니다.
    2. proxyTarget을 arg.[[ProxyTarget]]으로 둡니다.
    3. ? IsArray(proxyTarget)를 반환합니다.
  4. false를 반환합니다.

7.2.3 IsCallable ( arg )

추상 연산 IsCallable. 인수 arg (ECMAScript 언어 값). 반환값: Boolean. arg가 [[Call]] 내부 메서드를 갖는 호출 가능한 함수인지 결정합니다. 호출되면 다음 단계를 수행한다.

  1. arg가 Object가 아니면, false를 반환합니다.
  2. arg에 [[Call]] 내부 메서드가 있으면, true를 반환합니다.
  3. false를 반환합니다.

7.2.4 IsConstructor ( arg )

추상 연산 IsConstructor. 인수 arg (ECMAScript 언어 값). 반환값: Boolean. arg가 [[Construct]] 내부 메서드를 갖는 함수 객체인지 결정합니다. 호출되면 다음 단계를 수행한다.

  1. arg가 Object가 아니면, false를 반환합니다.
  2. arg에 [[Construct]] 내부 메서드가 있으면, true를 반환합니다.
  3. false를 반환합니다.

7.2.5 IsExtensible ( obj )

추상 연산 IsExtensible. 인수 obj (Object). 반환값: (정상 완료 (값: Boolean) 또는 throw 완료). obj에 추가 프로퍼티를 추가할 수 있는지 결정하는 데 사용됩니다. 호출되면 다음 단계를 수행한다.

  1. ? obj.[[IsExtensible]]()를 반환합니다.

7.2.6 IsRegExp ( arg )

추상 연산 IsRegExp. 인수 arg (ECMAScript 언어 값). 반환값: (정상 완료 (값: Boolean) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. arg가 Object가 아니면, false를 반환합니다.
  2. matcher를 ? Get(arg, %Symbol.match%)로 둡니다.
  3. matcher가 undefined가 아니면, ToBoolean(matcher)을 반환합니다.
  4. arg에 [[RegExpMatcher]] 내부 슬롯이 있으면, true를 반환합니다.
  5. false를 반환합니다.

7.2.7 Static Semantics: IsStringWellFormedUnicode ( string )

추상 연산 IsStringWellFormedUnicode. 인수 string (String). 반환값: Boolean. 6.1.4에 설명된 대로 string을 UTF-16로 인코딩된 코드 포인트 시퀀스로 해석하고, 이것이 올바른 형식의 UTF-16 시퀀스인지 결정합니다. 호출되면 다음 단계를 수행한다.

  1. length를 string의 길이로 둡니다.
  2. k를 0으로 둡니다.
  3. k < length인 동안 다음을 반복합니다.
    1. codePoint를 CodePointAt(string, k)으로 둡니다.
    2. codePoint.[[IsUnpairedSurrogate]]가 true이면, false를 반환합니다.
    3. k를 k + codePoint.[[CodeUnitCount]]로 설정합니다.
  4. true를 반환합니다.

7.2.8 SameType ( x, y )

추상 연산 SameType. 인수 x (ECMAScript 언어 값) 및 y (ECMAScript 언어 값). 반환값: Boolean. 두 인수가 같은 타입인지 결정합니다. 호출되면 다음 단계를 수행한다.

  1. x가 undefined이고 y가 undefined이면, true를 반환합니다.
  2. x가 null이고 y가 null이면, true를 반환합니다.
  3. x가 Boolean이고 y가 Boolean이면, true를 반환합니다.
  4. x가 Number이고 y가 Number이면, true를 반환합니다.
  5. x가 BigInt이고 y가 BigInt이면, true를 반환합니다.
  6. x가 Symbol이고 y가 Symbol이면, true를 반환합니다.
  7. x가 String이고 y가 String이면, true를 반환합니다.
  8. x가 Object이고 y가 Object이면, true를 반환합니다.
  9. false를 반환합니다.

7.2.9 SameValue ( x, y )

추상 연산 SameValue. 인수 x (ECMAScript 언어 값) 및 y (ECMAScript 언어 값). 반환값: Boolean. 두 인수가 같은 값인지 결정합니다. 호출되면 다음 단계를 수행한다.

  1. SameType(x, y)이 false이면, false를 반환합니다.
  2. x가 Number이면, 다음을 수행합니다.
    1. Number::sameValue(x, y)를 반환합니다.
  3. SameValueNonNumber(x, y)를 반환합니다.
참고

이 알고리즘은 모든 NaN 값을 동등하게 취급하고 +0𝔽과 -0𝔽을 구별한다는 점에서 IsStrictlyEqual 알고리즘과 다릅니다.

7.2.10 SameValueZero ( x, y )

추상 연산 SameValueZero. 인수 x (ECMAScript 언어 값) 및 y (ECMAScript 언어 값). 반환값: Boolean. 두 인수가 같은 값인지 결정합니다(+0𝔽과 -0𝔽의 차이는 무시합니다). 호출되면 다음 단계를 수행한다.

  1. SameType(x, y)이 false이면, false를 반환합니다.
  2. x가 Number이면, 다음을 수행합니다.
    1. Number::sameValueZero(x, y)를 반환합니다.
  3. SameValueNonNumber(x, y)를 반환합니다.
참고

SameValueZero는 +0𝔽과 -0𝔽을 동등하게 취급한다는 점에서만 SameValue와 다릅니다.

7.2.11 SameValueNonNumber ( x, y )

추상 연산 SameValueNonNumber. 인수 x (Number가 아닌 ECMAScript 언어 값) 및 y (Number가 아닌 ECMAScript 언어 값). 반환값: Boolean. 호출되면 다음 단계를 수행한다.

  1. 단언: SameType(x, y)은 true입니다.
  2. x가 undefined 또는 null이면, true를 반환합니다.
  3. x가 BigInt이면, 다음을 수행합니다.
    1. BigInt::equal(x, y)를 반환합니다.
  4. x가 String이면, 다음을 수행합니다.
    1. x와 y의 길이가 같고 동일한 위치에 동일한 코드 단위가 있으면, true를 반환합니다.
    2. false를 반환합니다.
  5. x가 Boolean이면, 다음을 수행합니다.
    1. x가 true이고 y가 true이면, true를 반환합니다.
    2. x가 false이고 y가 false이면, true를 반환합니다.
    3. false를 반환합니다.
  6. 참고: 그 밖의 모든 ECMAScript 언어 값은 동일성으로 비교됩니다.
  7. x가 y이면, true를 반환합니다.
  8. false를 반환합니다.
참고 1
설명을 위해 필요하지 않은 경우에도 일부 경우를 이 알고리즘 내에서 별도로 처리합니다.
참고 2
“x가 y이다”가 구체적으로 무엇을 의미하는지는 5.2.8에 자세히 설명되어 있습니다.

7.2.12 IsLessThan ( x, y, leftFirst )

추상 연산 IsLessThan. 인수 x (ECMAScript 언어 값), y (ECMAScript 언어 값) 및 leftFirst (Boolean). 반환값: Boolean 또는 undefined를 포함하는 정상 완료 또는 throw 완료. 비교 x < y의 의미론을 제공하며, true, false 또는 undefined(피연산자를 동일한 숫자 타입의 비교 가능한 값으로 강제 변환할 수 없음을 나타냅니다)를 반환합니다. leftFirst 플래그는 x와 y에 대해 관찰 가능한 부작용이 있을 수 있는 연산을 수행하는 순서를 제어하는 데 사용됩니다. ECMAScript가 표현식의 왼쪽에서 오른쪽 평가를 명시하기 때문에 필요합니다. leftFirst가 true이면 x 매개변수는 y 매개변수에 대응하는 표현식보다 왼쪽에 나타나는 표현식에 대응합니다. leftFirst가 false이면 반대이며, x보다 y에 대한 연산을 먼저 수행해야 합니다. 호출되면 다음 단계를 수행한다.

  1. leftFirst가 true이면, 다음을 수행합니다.
    1. px를 ? ToPrimitive(x, number)로 둡니다.
    2. py를 ? ToPrimitive(y, number)로 둡니다.
  2. 그렇지 않으면,
    1. 참고: 왼쪽에서 오른쪽 평가를 유지하기 위해 평가 순서를 반대로 해야 합니다.
    2. py를 ? ToPrimitive(y, number)로 둡니다.
    3. px를 ? ToPrimitive(x, number)로 둡니다.
  3. px가 String이고 py가 String이면, 다음을 수행합니다.
    1. lx를 px의 길이로 둡니다.
    2. ly를 py의 길이로 둡니다.
    3. 0 ≤ i < min(lx, ly)를 만족하는 각 정수 i에 대해 오름차순으로 다음을 수행합니다.
      1. cx를 px 내 인덱스 i에 있는 코드 단위의 숫자 값으로 둡니다.
      2. cy를 py 내 인덱스 i에 있는 코드 단위의 숫자 값으로 둡니다.
      3. cx < cy이면, true를 반환합니다.
      4. cx > cy이면, false를 반환합니다.
    4. lx < ly이면, true를 반환합니다.
    5. false를 반환합니다.
  4. px가 BigInt이고 py가 String이면, 다음을 수행합니다.
    1. ny를 StringToBigInt(py)로 둡니다.
    2. ny가 undefined이면, undefined를 반환합니다.
    3. BigInt::lessThan(px, ny)을 반환합니다.
  5. px가 String이고 py가 BigInt이면, 다음을 수행합니다.
    1. nx를 StringToBigInt(px)로 둡니다.
    2. nx가 undefined이면, undefined를 반환합니다.
    3. BigInt::lessThan(nx, py)을 반환합니다.
  6. 참고: px와 py는 원시값이므로 평가 순서는 중요하지 않습니다.
  7. nx를 ? ToNumeric(px)로 둡니다.
  8. ny를 ? ToNumeric(py)로 둡니다.
  9. SameType(nx, ny)이 true이면, 다음을 수행합니다.
    1. nx가 Number이면, Number::lessThan(nx, ny)을 반환합니다.
    2. 단언: nx는 BigInt입니다.
    3. BigInt::lessThan(nx, ny)을 반환합니다.
  10. 단언: nx가 BigInt이고 ny가 Number이거나, nx가 Number이고 ny가 BigInt입니다.
  11. nx가 NaN이거나 ny가 NaN이면, undefined를 반환합니다.
  12. nx가 -∞𝔽이거나 ny가 +∞𝔽이면, true를 반환합니다.
  13. nx가 +∞𝔽이거나 ny가 -∞𝔽이면, false를 반환합니다.
  14. ℝ(nx) < ℝ(ny)이면, true를 반환합니다.
  15. false를 반환합니다.
참고 1

3 단계는 덧셈 연산자 +를 처리하는 알고리즘(13.15.3)의 1.c 단계와 달리 논리 OR 연산 대신 논리 AND 연산을 사용합니다.

참고 2

String 비교에서는 UTF-16 코드 단위 값의 시퀀스에 대한 단순한 사전식 순서를 사용합니다. 유니코드 명세에 정의된 더 복잡하고 의미론 중심적인 문자 또는 문자열 동등성과 정렬 순서 정의를 사용하려는 시도는 하지 않습니다. 따라서 유니코드 표준에 따라 정규적으로 동등하지만 동일한 정규화 형식이 아닌 String 값은 서로 같지 않은 것으로 판정될 수 있습니다. 또한 서로게이트 쌍을 포함하는 String의 경우 코드 단위에 따른 사전식 순서는 코드 포인트에 따른 순서와 다르다는 점에 유의하시기 바랍니다.

7.2.13 IsLooselyEqual ( x, y )

추상 연산 IsLooselyEqual. 인수 x (ECMAScript 언어 값) 및 y (ECMAScript 언어 값). 반환값: Boolean을 포함하는 정상 완료 또는 throw 완료. == 연산자의 의미론을 제공합니다. 호출되면 다음 단계를 수행한다.

  1. SameType(x, y)가 true이면 다음을 수행합니다.
    1. IsStrictlyEqual(x, y)을 반환합니다.
  2. x가 null이고 y가 undefined이면 true를 반환합니다.
  3. x가 undefined이고 y가 null이면 true를 반환합니다.
  4. Normative Optional
    호스트가 웹 브라우저이거나 그 밖의 방식으로 [[IsHTMLDDA]] 내부 슬롯을 지원하면 다음을 수행합니다.
    1. x가 Object이고, x에 [[IsHTMLDDA]] 내부 슬롯이 있으며, y가 undefined 또는 null 중 하나이면 true를 반환합니다.
    2. x가 undefined 또는 null 중 하나이고, y가 Object이며, y에 [[IsHTMLDDA]] 내부 슬롯이 있으면 true를 반환합니다.
  5. x가 Number이고 y가 String이면 ! IsLooselyEqual(x, ! ToNumber(y))을 반환합니다.
  6. x가 String이고 y가 Number이면 ! IsLooselyEqual(! ToNumber(x), y)를 반환합니다.
  7. x가 BigInt이고 y가 String이면 다음을 수행합니다.
    1. n을 StringToBigInt(y)로 둡니다.
    2. n이 undefined이면 false를 반환합니다.
    3. ! IsLooselyEqual(x, n)을 반환합니다.
  8. x가 String이고 y가 BigInt이면 ! IsLooselyEqual(y, x)를 반환합니다.
  9. x가 Boolean이면 ! IsLooselyEqual(! ToNumber(x), y)를 반환합니다.
  10. y가 Boolean이면 ! IsLooselyEqual(x, ! ToNumber(y))을 반환합니다.
  11. x가 String, Number, BigInt 또는 Symbol 중 하나이고 y가 Object이면 ! IsLooselyEqual(x, ? ToPrimitive(y))을 반환합니다.
  12. x가 Object이고 y가 String, Number, BigInt 또는 Symbol 중 하나이면 ! IsLooselyEqual(? ToPrimitive(x), y)를 반환합니다.
  13. x가 BigInt이고 y가 유한 Number이거나, x가 유한 Number이고 y가 BigInt이면 다음을 수행합니다.
    1. ℝ(x) = ℝ(y)이면 true를 반환합니다.
    2. false를 반환합니다.
  14. false를 반환합니다.

7.2.14 IsStrictlyEqual ( x, y )

추상 연산 IsStrictlyEqual. 인수 x (ECMAScript 언어 값) 및 y (ECMAScript 언어 값). 반환값: Boolean. === 연산자의 의미론을 제공합니다. 호출되면 다음 단계를 수행한다.

  1. SameType(x, y)이 false이면, false를 반환합니다.
  2. x가 Number이면, 다음을 수행합니다.
    1. Number::equal(x, y)을 반환합니다.
  3. SameValueNonNumber(x, y)을 반환합니다.
참고

이 알고리즘은 부호가 있는 0과 NaN을 처리하는 방식에서 SameValue 알고리즘과 다릅니다.

7.3 객체에 대한 연산

7.3.1 MakeBasicObject ( internalSlotsList )

추상 연산 MakeBasicObject. 인수 internalSlotsList (내부 슬롯 이름의 List). 반환값: Object. 일반 객체와 특수 객체를 모두 포함하여 알고리즘으로 생성되는 모든 ECMAScript 객체의 출처입니다. 모든 객체 생성에 공통으로 사용하는 단계를 분리하고 객체 생성을 중앙화합니다. 호출되면 다음 단계를 수행한다.

  1. internalSlotsList를 internalSlotsList와 « [[PrivateElements]] »의 목록 연결로 설정합니다.
  2. obj를 internalSlotsList의 각 이름에 대한 내부 슬롯을 갖는 새로 생성된 객체로 둡니다.
  3. 참고: Object 내부 메서드와 내부 슬롯에 설명된 대로 달리 명시되지 않는 한 이러한 각 내부 슬롯의 초기값은 undefined입니다.
  4. obj.[[PrivateElements]]를 새로운 빈 List로 설정합니다.
  5. obj의 필수 내부 메서드를 10.1에 명시된 기본 일반 객체 정의로 설정합니다.
  6. 단언: 호출자가 obj의 [[GetPrototypeOf]] 및 [[SetPrototypeOf]] 필수 내부 메서드를 모두 재정의하지 않을 예정이면, internalSlotsList에는 [[Prototype]]이 포함됩니다.
  7. 단언: 호출자가 obj의 [[SetPrototypeOf]], [[IsExtensible]] 및 [[PreventExtensions]] 필수 내부 메서드를 모두 재정의하지 않을 예정이면, internalSlotsList에는 [[Extensible]]이 포함됩니다.
  8. internalSlotsList에 [[Extensible]]이 포함되어 있으면, obj.[[Extensible]]을 true로 설정합니다.
  9. obj를 반환합니다.
참고

이 명세에서 특수 객체는 ArrayCreate 및 BoundFunctionCreate와 같은 추상 연산에서 먼저 MakeBasicObject를 호출하여 기본적인 기반 객체를 얻은 다음, 해당 객체의 일부 또는 모든 내부 메서드를 재정의하여 생성합니다. 특수 객체 생성을 캡슐화하기 위해 객체의 필수 내부 메서드는 이러한 연산 외부에서는 절대로 수정하지 않습니다.

7.3.2 Get ( obj, propertyKey )

추상 연산 Get. 인수 obj (Object) 및 propertyKey (프로퍼티 키). 반환값: ECMAScript 언어 값을 포함하는 정상 완료 또는 throw 완료. 객체의 특정 프로퍼티 값을 가져오는 데 사용됩니다. 호출되면 다음 단계를 수행한다.

  1. ? obj.[[Get]](propertyKey, obj)를 반환합니다.

7.3.3 GetV ( value, propertyKey )

추상 연산 GetV. 인수 value (ECMAScript 언어 값) 및 propertyKey (프로퍼티 키). 반환값: ECMAScript 언어 값을 포함하는 정상 완료 또는 throw 완료. ECMAScript 언어 값의 특정 프로퍼티 값을 가져오는 데 사용됩니다. 값이 객체가 아닌 경우 해당 값 타입에 적합한 래퍼 객체를 사용하여 프로퍼티 조회를 수행합니다. 호출되면 다음 단계를 수행한다.

  1. obj를 ? ToObject(value)로 둡니다.
  2. ? obj.[[Get]](propertyKey, value)를 반환합니다.

7.3.4 Set ( obj, propertyKey, value, throw )

추상 연산 Set. 인수 obj (Object), propertyKey (프로퍼티 키), value (ECMAScript 언어 값) 및 throw (Boolean). 반환값: unused를 포함하는 정상 완료 또는 throw 완료. 객체의 특정 프로퍼티 값을 설정하는 데 사용됩니다. value는 프로퍼티의 새 값입니다. 호출되면 다음 단계를 수행한다.

  1. success를 ? obj.[[Set]](propertyKey, value, obj)로 둡니다.
  2. success가 false이고 throw가 true이면, TypeError 예외를 던집니다.
  3. unused를 반환합니다.

7.3.5 CreateDataProperty ( obj, propertyKey, value )

추상 연산 CreateDataProperty. 인수 obj (Object), propertyKey (프로퍼티 키) 및 value (ECMAScript 언어 값). 반환값: Boolean을 포함하는 정상 완료 또는 throw 완료. 객체에 새로운 자체 프로퍼티를 생성하는 데 사용됩니다. 호출되면 다음 단계를 수행한다.

  1. newDesc를 PropertyDescriptor { [[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }로 둡니다.
  2. ? obj.[[DefineOwnProperty]](propertyKey, newDesc)를 반환합니다.
참고

이 추상 연산은 ECMAScript 언어의 할당 연산자가 생성하는 프로퍼티에 사용되는 기본값과 동일하게 속성이 설정된 프로퍼티를 생성합니다. 일반적으로 해당 프로퍼티는 이미 존재하지 않습니다. 이미 존재하면서 구성 가능하지 않거나 obj가 확장 가능하지 않으면 [[DefineOwnProperty]]는 false를 반환합니다.

7.3.6 CreateDataPropertyOrThrow ( obj, propertyKey, value )

추상 연산 CreateDataPropertyOrThrow. 인수 obj (Object), propertyKey (프로퍼티 키) 및 value (ECMAScript 언어 값). 반환값: unused를 포함하는 정상 완료 또는 throw 완료. 객체에 새로운 자체 프로퍼티를 생성하는 데 사용됩니다. 요청한 프로퍼티 갱신을 수행할 수 없으면 TypeError 예외를 던집니다. 호출되면 다음 단계를 수행한다.

  1. success를 ? CreateDataProperty(obj, propertyKey, value)로 둡니다.
  2. success가 false이면, TypeError 예외를 던집니다.
  3. unused를 반환합니다.
참고

이 추상 연산은 ECMAScript 언어의 할당 연산자가 생성하는 프로퍼티에 사용되는 기본값과 동일하게 속성이 설정된 프로퍼티를 생성합니다. 일반적으로 해당 프로퍼티는 이미 존재하지 않습니다. 이미 존재하면서 구성 가능하지 않거나 obj가 확장 가능하지 않으면 [[DefineOwnProperty]]는 false를 반환하여 이 연산이 TypeError 예외를 던지게 합니다.

7.3.7 CreateNonEnumerableDataPropertyOrThrow ( obj, propertyKey, value )

추상 연산 CreateNonEnumerableDataPropertyOrThrow. 인수 obj (Object), propertyKey (프로퍼티 키) 및 value (ECMAScript 언어 값). 반환값: unused. 일반 객체에 열거할 수 없는 새로운 자체 프로퍼티를 생성하는 데 사용됩니다. 호출되면 다음 단계를 수행한다.

  1. 단언: obj는 구성 불가능한 프로퍼티가 없는 일반 확장 가능 객체입니다.
  2. newDesc를 PropertyDescriptor { [[Value]]: value, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }로 둡니다.
  3. ! DefinePropertyOrThrow(obj, propertyKey, newDesc)를 수행합니다.
  4. unused를 반환합니다.
참고

이 추상 연산은 열거 가능하지 않다는 점을 제외하면 ECMAScript 언어의 할당 연산자가 생성하는 프로퍼티에 사용되는 기본값과 동일하게 속성이 설정된 프로퍼티를 생성합니다. 일반적으로 해당 프로퍼티는 이미 존재하지 않습니다. 이미 존재하더라도 DefinePropertyOrThrow는 정상적으로 완료됨이 보장됩니다.

7.3.8 DefinePropertyOrThrow ( obj, propertyKey, propertyDesc )

추상 연산 DefinePropertyOrThrow. 인수 obj (Object), propertyKey (프로퍼티 키) 및 propertyDesc (프로퍼티 서술자). 반환값: unused를 포함하는 정상 완료 또는 throw 완료. 요청한 프로퍼티 갱신을 수행할 수 없는 경우 TypeError 예외를 던지는 방식으로 객체의 [[DefineOwnProperty]] 내부 메서드를 호출하는 데 사용됩니다. 호출되면 다음 단계를 수행한다.

  1. success를 ? obj.[[DefineOwnProperty]](propertyKey, propertyDesc)로 둡니다.
  2. success가 false이면, TypeError 예외를 던집니다.
  3. unused를 반환합니다.

7.3.9 DeletePropertyOrThrow ( obj, propertyKey )

추상 연산 DeletePropertyOrThrow. 인수 obj (Object) 및 propertyKey (프로퍼티 키). 반환값: unused를 포함하는 정상 완료 또는 throw 완료. 객체의 특정 자체 프로퍼티를 제거하는 데 사용됩니다. 프로퍼티가 구성 가능하지 않으면 예외를 던집니다. 호출되면 다음 단계를 수행한다.

  1. success를 ? obj.[[Delete]](propertyKey)로 둡니다.
  2. success가 false이면, TypeError 예외를 던집니다.
  3. unused를 반환합니다.

7.3.10 GetMethod ( value, propertyKey )

추상 연산 GetMethod. 인수 value (ECMAScript 언어 값) 및 propertyKey (프로퍼티 키). 반환값: 함수 객체 또는 undefined를 포함하는 정상 완료 또는 throw 완료. 프로퍼티의 값이 함수일 것으로 예상되는 경우 ECMAScript 언어 값의 특정 프로퍼티 값을 가져오는 데 사용됩니다. 호출되면 다음 단계를 수행한다.

  1. func를 ? GetV(value, propertyKey)로 둡니다.
  2. func가 undefined 또는 null이면, undefined를 반환합니다.
  3. IsCallable(func)이 false이면, TypeError 예외를 던집니다.
  4. func를 반환합니다.

7.3.11 HasProperty ( obj, propertyKey )

추상 연산 HasProperty. 인수 obj (Object) 및 propertyKey (프로퍼티 키). 반환값: Boolean을 포함하는 정상 완료 또는 throw 완료. 객체가 지정된 프로퍼티 키를 갖는 프로퍼티를 보유하는지 결정하는 데 사용됩니다. 프로퍼티는 자체 프로퍼티 또는 상속된 프로퍼티일 수 있습니다. 호출되면 다음 단계를 수행한다.

  1. ? obj.[[HasProperty]](propertyKey)를 반환합니다.

7.3.12 HasOwnProperty ( obj, propertyKey )

추상 연산 HasOwnProperty. 인수 obj (Object) 및 propertyKey (프로퍼티 키). 반환값: Boolean을 포함하는 정상 완료 또는 throw 완료. 객체가 지정된 프로퍼티 키를 갖는 자체 프로퍼티를 보유하는지 결정하는 데 사용됩니다. 호출되면 다음 단계를 수행한다.

  1. propertyDesc를 ? obj.[[GetOwnProperty]](propertyKey)로 둡니다.
  2. propertyDesc가 undefined이면, false를 반환합니다.
  3. true를 반환합니다.

7.3.13 Call ( func, thisValue [ , argList ] )

추상 연산 Call. 인수 func (ECMAScript 언어 값) 및 thisValue (ECMAScript 언어 값) 및 선택적 인수 argList (리스트 (요소: ECMAScript 언어 값)). 반환값: (정상 완료 (값: ECMAScript 언어 값) 또는 throw 완료). 함수 객체의 [[Call]] 내부 메서드를 호출하는 데 사용됩니다. func는 함수 객체이고, thisValue는 [[Call]]의 this 값인 ECMAScript 언어 값이며, argList는 내부 메서드의 대응하는 인수에 전달되는 값입니다. argList가 존재하지 않으면 새로운 빈 List를 값으로 사용합니다. 호출되면 다음 단계를 수행한다.

  1. argList가 존재하지 않으면, argList를 새로운 빈 List로 설정합니다.
  2. IsCallable(func)이 false이면, TypeError 예외를 던집니다.
  3. ? func.[[Call]](thisValue, argList)를 반환합니다.

7.3.14 Construct ( ctor [ , argList [ , newTarget ] ] )

추상 연산 Construct. 인수 ctor (생성자) 및 선택적 인수 argList (리스트 (요소: ECMAScript 언어 값)) 및 newTarget (생성자). 반환값: (정상 완료 (값: Object) 또는 throw 완료). 함수 객체의 [[Construct]] 내부 메서드를 호출하는 데 사용됩니다. argList와 newTarget은 내부 메서드의 대응하는 인수로 전달되는 값입니다. argList가 존재하지 않으면 새로운 빈 List를 값으로 사용합니다. newTarget이 존재하지 않으면 ctor를 값으로 사용합니다. 호출되면 다음 단계를 수행한다.

  1. newTarget이 존재하지 않으면, newTarget을 ctor로 설정합니다.
  2. argList가 존재하지 않으면, argList를 새로운 빈 List로 설정합니다.
  3. ? ctor.[[Construct]](argList, newTarget)를 반환합니다.
참고

newTarget이 존재하지 않으면 이 연산은 new F(...argumentsList)와 동등합니다.

7.3.15 SetIntegrityLevel ( obj, level )

추상 연산 SetIntegrityLevel. 인수 obj (Object) 및 level ((sealed 또는 frozen)). 반환값: (정상 완료 (값: Boolean) 또는 throw 완료). 객체의 자체 프로퍼티 집합을 고정하는 데 사용됩니다. 호출되면 다음 단계를 수행한다.

  1. status를 ? obj.[[PreventExtensions]]()로 둡니다.
  2. status가 false이면, false를 반환합니다.
  3. keys를 ? obj.[[OwnPropertyKeys]]()로 둡니다.
  4. level이 sealed이면, 다음을 수행합니다.
    1. keys의 각 요소 key에 대해 다음을 수행합니다.
      1. ? DefinePropertyOrThrow(obj, key, PropertyDescriptor { [[Configurable]]: false })를 수행합니다.
  5. 그렇지 않으면,
    1. 단언: level은 frozen입니다.
    2. keys의 각 요소 key에 대해 다음을 수행합니다.
      1. currentDesc를 ? obj.[[GetOwnProperty]](key)로 둡니다.
      2. currentDesc가 undefined가 아니면, 다음을 수행합니다.
        1. IsAccessorDescriptor(currentDesc)가 true이면, 다음을 수행합니다.
          1. propertyDesc를 PropertyDescriptor { [[Configurable]]: false }로 둡니다.
        2. 그렇지 않으면,
          1. propertyDesc를 PropertyDescriptor { [[Configurable]]: false, [[Writable]]: false }로 둡니다.
        3. ? DefinePropertyOrThrow(obj, key, propertyDesc)를 수행합니다.
  6. true를 반환합니다.

7.3.16 TestIntegrityLevel ( obj, level )

추상 연산 TestIntegrityLevel. 인수 obj (Object) 및 level ((sealed 또는 frozen)). 반환값: (정상 완료 (값: Boolean) 또는 throw 완료). 객체의 자체 프로퍼티 집합이 고정되어 있는지 결정하는 데 사용됩니다. 호출되면 다음 단계를 수행한다.

  1. extensible을 ? IsExtensible(obj)로 둡니다.
  2. extensible이 true이면, false를 반환합니다.
  3. 참고: 객체가 확장 가능하면 해당 객체의 프로퍼티는 검사하지 않습니다.
  4. keys를 ? obj.[[OwnPropertyKeys]]()로 둡니다.
  5. keys의 각 요소 key에 대해 다음을 수행합니다.
    1. currentDesc를 ? obj.[[GetOwnProperty]](key)로 둡니다.
    2. currentDesc가 undefined가 아니면, 다음을 수행합니다.
      1. currentDesc.[[Configurable]]이 true이면, false를 반환합니다.
      2. level이 frozen이고 IsDataDescriptor(currentDesc)가 true이면, 다음을 수행합니다.
        1. currentDesc.[[Writable]]이 true이면, false를 반환합니다.
  6. true를 반환합니다.

7.3.17 CreateArrayFromList ( elements )

추상 연산 CreateArrayFromList. 인수 elements (리스트 (요소: ECMAScript 언어 값)). 반환값: Array. elements가 제공하는 요소를 갖는 Array를 생성하는 데 사용됩니다. 호출되면 다음 단계를 수행한다.

  1. array를 ! ArrayCreate(0)으로 둡니다.
  2. n을 0으로 둡니다.
  3. elements의 각 요소 element에 대해 다음을 수행합니다.
    1. ! CreateDataPropertyOrThrow(array, ! ToString(𝔽(n)), element)를 수행합니다.
    2. n을 n + 1로 설정합니다.
  4. array를 반환합니다.

7.3.18 LengthOfArrayLike ( obj )

추상 연산 LengthOfArrayLike. 인수 obj (Object). 반환값: (정상 완료 (값: 음이 아닌 정수) 또는 throw 완료). 배열과 유사한 객체의 "length" 프로퍼티 값을 반환합니다. 호출되면 다음 단계를 수행한다.

  1. ℝ(? ToLength(? Get(obj, "length")))를 반환합니다.

배열과 유사한 객체는 이 연산이 정상 완료를 반환하는 모든 객체입니다.

참고 1
일반적으로 배열과 유사한 객체에는 정수 인덱스 이름을 갖는 프로퍼티도 일부 있을 수 있습니다. 그러나 이는 이 정의의 요구 사항은 아닙니다.
참고 2
Array와 String 객체는 배열과 유사한 객체의 예입니다.

7.3.19 CreateListFromArrayLike ( obj [ , validElementTypes ] )

추상 연산 CreateListFromArrayLike. 인수 obj (ECMAScript 언어 값) 및 선택적 인수 validElementTypes ((any 또는 property-key)). 반환값: ECMAScript 언어 값의 List를 포함하는 정상 완료 또는 예외 완료. obj의 인덱스 속성에서 요소를 가져오는 List 값을 생성하는 데 사용됩니다. validElementTypes는 요소로 허용되는 값의 유형을 나타냅니다. 호출되면 다음 단계를 수행한다.

  1. validElementTypes가 제공되지 않았으면 validElementTypes를 any로 설정합니다.
  2. obj가 Object가 아니면 TypeError 예외를 던집니다.
  3. length를 ? LengthOfArrayLike(obj)로 둡니다.
  4. list를 새로운 빈 List로 둡니다.
  5. index를 0으로 둡니다.
  6. index < length인 동안 다음 단계를 반복합니다,
    1. indexName을 ! ToString(𝔽(index))으로 둡니다.
    2. next를 ? Get(obj, indexName)로 둡니다.
    3. validElementTypes가 property-key이고 next가 속성 키가 아니면 TypeError 예외를 던집니다.
    4. next를 list에 추가합니다.
    5. index를 index + 1로 설정합니다.
  7. list를 반환합니다.

7.3.20 Invoke ( value, propertyKey [ , argList ] )

추상 연산 Invoke. 인수 value (ECMAScript 언어 값) 및 propertyKey (프로퍼티 키) 및 선택적 인수 argList (리스트 (요소: ECMAScript 언어 값)). 반환값: (정상 완료 (값: ECMAScript 언어 값) 또는 throw 완료). ECMAScript 언어 값의 메서드 프로퍼티를 호출하는 데 사용됩니다. value는 프로퍼티 조회 지점이면서 호출의 this 값이기도 합니다. argList는 메서드에 전달되는 인수 값의 목록입니다. argList가 존재하지 않으면 새로운 빈 List를 값으로 사용합니다. 호출되면 다음 단계를 수행한다.

  1. argList가 존재하지 않으면, argList를 새로운 빈 List로 설정합니다.
  2. func를 ? GetV(value, propertyKey)로 둡니다.
  3. ? Call(func, value, argList)를 반환합니다.

7.3.21 OrdinaryHasInstance ( ctor, instance )

추상 연산 OrdinaryHasInstance. 인수 ctor (ECMAScript 언어 값) 및 instance (ECMAScript 언어 값). 반환값: (정상 완료 (값: Boolean) 또는 throw 완료). instance가 ctor가 제공하는 인스턴스 객체 상속 경로에서 상속하는지를 결정하는 기본 알고리즘을 구현합니다. 호출되면 다음 단계를 수행한다.

  1. IsCallable(ctor)이 false이면, false를 반환합니다.
  2. ctor에 [[BoundTargetFunction]] 내부 슬롯이 있으면, 다음을 수행합니다.
    1. boundCtor를 ctor.[[BoundTargetFunction]]으로 둡니다.
    2. ? InstanceofOperator(instance, boundCtor)를 반환합니다.
  3. instance가 Object가 아니면, false를 반환합니다.
  4. proto를 ? Get(ctor, "prototype")로 둡니다.
  5. proto가 Object가 아니면, TypeError 예외를 던집니다.
  6. 다음을 반복합니다.
    1. instance를 ? instance.[[GetPrototypeOf]]()로 설정합니다.
    2. instance가 null이면, false를 반환합니다.
    3. SameValue(proto, instance)가 true이면, true를 반환합니다.

7.3.22 SpeciesConstructor ( obj, defaultCtor )

추상 연산 SpeciesConstructor. 인수 obj (Object) 및 defaultCtor (생성자). 반환값: (정상 완료 (값: 생성자) 또는 throw 완료). obj에서 파생되는 새로운 객체를 생성하는 데 사용해야 하는 생성자를 가져오는 데 사용됩니다. defaultCtor는 obj에서 시작하여 생성자 %Symbol.species% 프로퍼티를 찾을 수 없는 경우 사용할 생성자입니다. 호출되면 다음 단계를 수행한다.

  1. ctor를 ? Get(obj, "constructor")로 둡니다.
  2. ctor가 undefined이면, defaultCtor를 반환합니다.
  3. ctor가 Object가 아니면, TypeError 예외를 던집니다.
  4. species를 ? Get(ctor, %Symbol.species%)로 둡니다.
  5. species가 undefined 또는 null이면, defaultCtor를 반환합니다.
  6. IsConstructor(species)가 true이면, species를 반환합니다.
  7. TypeError 예외를 던집니다.

7.3.23 EnumerableOwnProperties ( obj, kind )

추상 연산 EnumerableOwnProperties. 인수 obj (Object) 및 kind ((key, value 또는 key+value)). 반환값: (정상 완료 (값: 리스트 (요소: ECMAScript 언어 값)) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. ownKeys를 ? obj.[[OwnPropertyKeys]]()로 둡니다.
  2. results를 새로운 빈 List로 둡니다.
  3. ownKeys의 각 요소 key에 대해 다음을 수행합니다.
    1. key가 String이면, 다음을 수행합니다.
      1. propertyDesc를 ? obj.[[GetOwnProperty]](key)로 둡니다.
      2. propertyDesc가 undefined가 아니고 propertyDesc.[[Enumerable]]이 true이면, 다음을 수행합니다.
        1. kind가 key이면, 다음을 수행합니다.
          1. key를 results에 추가합니다.
        2. 그렇지 않으면,
          1. value를 ? Get(obj, key)로 둡니다.
          2. kind가 value이면, 다음을 수행합니다.
            1. value를 results에 추가합니다.
          3. 그렇지 않으면,
            1. 단언: kind는 key+value입니다.
            2. entry를 CreateArrayFromList(« key, value »)로 둡니다.
            3. entry를 results에 추가합니다.
  4. results를 반환합니다.

7.3.24 GetFunctionRealm ( func )

추상 연산 GetFunctionRealm. 인수 func (함수 객체). 반환값: (정상 완료 (값: Realm 레코드) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. func에 [[Realm]] 내부 슬롯이 있으면, 다음을 수행합니다.
    1. func.[[Realm]]을 반환합니다.
  2. func가 바인딩된 함수 특수 객체이면, 다음을 수행합니다.
    1. boundTargetFunc를 func.[[BoundTargetFunction]]으로 둡니다.
    2. ? GetFunctionRealm(boundTargetFunc)을 반환합니다.
  3. func가 Proxy 특수 객체이면, 다음을 수행합니다.
    1. ? ValidateNonRevokedProxy(func)를 수행합니다.
    2. proxyTarget을 func.[[ProxyTarget]]으로 둡니다.
    3. 단언: proxyTarget은 함수 객체입니다.
    4. ? GetFunctionRealm(proxyTarget)을 반환합니다.
  4. 현재 Realm Record를 반환합니다.
참고

4 단계에는 func가 [[Realm]] 내부 슬롯을 갖지 않는 비표준 함수 특수 객체인 경우에만 도달합니다.

7.3.25 CopyDataProperties ( target, source, excludedItems )

추상 연산 CopyDataProperties. 인수 target (Object), source (ECMAScript 언어 값) 및 excludedItems (리스트 (요소: 프로퍼티 키)). 반환값: (정상 완료 (값: unused) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. source가 undefined 또는 null이면, unused를 반환합니다.
  2. from을 ! ToObject(source)로 둡니다.
  3. keys를 ? from.[[OwnPropertyKeys]]()로 둡니다.
  4. keys의 각 요소 nextKey에 대해 다음을 수행합니다.
    1. excluded를 false로 둡니다.
    2. excludedItems의 각 요소 element에 대해 다음을 수행합니다.
      1. SameValue(element, nextKey)가 true이면, 다음을 수행합니다.
        1. excluded를 true로 설정합니다.
    3. excluded가 false이면, 다음을 수행합니다.
      1. propertyDesc를 ? from.[[GetOwnProperty]](nextKey)로 둡니다.
      2. propertyDesc가 undefined가 아니고 propertyDesc.[[Enumerable]]이 true이면, 다음을 수행합니다.
        1. propertyValue를 ? Get(from, nextKey)로 둡니다.
        2. ! CreateDataPropertyOrThrow(target, nextKey, propertyValue)를 수행합니다.
  5. unused를 반환합니다.
참고

여기에 전달되는 대상은 항상 새로 생성된 객체이며, 오류가 던져진 경우 직접 접근할 수 없습니다.

7.3.26 PrivateElementFind ( obj, privateName )

추상 연산 PrivateElementFind. 인수 obj (Object) 및 privateName (비공개 이름). 반환값: (PrivateElement 또는 empty). 호출되면 다음 단계를 수행한다.

  1. obj.[[PrivateElements]]에 entry.[[Key]]가 privateName인 PrivateElement entry가 포함되어 있으면, 다음을 수행합니다.
    1. entry를 반환합니다.
  2. empty를 반환합니다.

7.3.27 PrivateFieldAdd ( obj, privateName, value )

추상 연산 PrivateFieldAdd. 인수 obj (Object), privateName (비공개 이름) 및 value (ECMAScript 언어 값). 반환값: (정상 완료 (값: unused) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. 호스트가 웹 브라우저이면, 다음을 수행합니다.
    1. ? HostEnsureCanAddPrivateElement(obj)를 수행합니다.
  2. entry를 PrivateElementFind(obj, privateName)로 둡니다.
  3. entry가 empty가 아니면, TypeError 예외를 던집니다.
  4. PrivateElement { [[Key]]: privateName, [[Kind]]: field, [[Value]]: value }를 obj.[[PrivateElements]]에 추가합니다.
  5. unused를 반환합니다.

7.3.28 PrivateMethodOrAccessorAdd ( obj, method )

추상 연산 PrivateMethodOrAccessorAdd. 인수 obj (Object) 및 method (PrivateElement). 반환값: (정상 완료 (값: unused) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. 단언: method.[[Kind]]는 method 또는 accessor입니다.
  2. 호스트가 웹 브라우저이면, 다음을 수행합니다.
    1. ? HostEnsureCanAddPrivateElement(obj)를 수행합니다.
  3. entry를 PrivateElementFind(obj, method.[[Key]])로 둡니다.
  4. entry가 empty가 아니면, TypeError 예외를 던집니다.
  5. method를 obj.[[PrivateElements]]에 추가합니다.
  6. unused를 반환합니다.
참고

비공개 메서드와 접근자의 값은 인스턴스 간에 공유됩니다. 이 연산은 메서드 또는 접근자의 새 복사본을 생성하지 않습니다.

7.3.29 HostEnsureCanAddPrivateElement ( obj )

호스트 정의 추상 연산 HostEnsureCanAddPrivateElement. 인수 obj (Object). 반환값: (정상 완료 (값: unused) 또는 throw 완료). 호스트 환경이 특정 호스트 정의 특수 객체에 비공개 요소를 추가하는 것을 방지할 수 있도록 합니다.

HostEnsureCanAddPrivateElement의 구현은 다음 요구 사항을 준수해야 합니다:

HostEnsureCanAddPrivateElement의 기본 구현은 NormalCompletion(unused)을 반환하는 것입니다.

이 추상 연산은 웹 브라우저인 ECMAScript 호스트에서만 호출됩니다.

7.3.30 PrivateGet ( obj, privateName )

추상 연산 PrivateGet. 인수 obj (Object) 및 privateName (비공개 이름). 반환값: (정상 완료 (값: ECMAScript 언어 값) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. entry를 PrivateElementFind(obj, privateName)로 둡니다.
  2. entry가 empty이면, TypeError 예외를 던집니다.
  3. entry.[[Kind]]가 field 또는 method이면, 다음을 수행합니다.
    1. entry.[[Value]]를 반환합니다.
  4. 단언: entry.[[Kind]]는 accessor입니다.
  5. entry.[[Getter]]가 undefined이면, TypeError 예외를 던집니다.
  6. getter를 entry.[[Getter]]로 둡니다.
  7. ? Call(getter, obj)를 반환합니다.

7.3.31 PrivateSet ( obj, privateName, value )

추상 연산 PrivateSet. 인수 obj (Object), privateName (비공개 이름) 및 value (ECMAScript 언어 값). 반환값: (정상 완료 (값: unused) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. entry를 PrivateElementFind(obj, privateName)로 둡니다.
  2. entry가 empty이면, TypeError 예외를 던집니다.
  3. entry.[[Kind]]가 method이면, TypeError 예외를 던집니다.
  4. entry.[[Kind]]가 field이면, 다음을 수행합니다.
    1. entry.[[Value]]를 value로 설정합니다.
  5. 그렇지 않으면,
    1. 단언: entry.[[Kind]]는 accessor입니다.
    2. entry.[[Setter]]가 undefined이면, TypeError 예외를 던집니다.
    3. setter를 entry.[[Setter]]로 둡니다.
    4. ? Call(setter, obj, « value »)를 수행합니다.
  6. unused를 반환합니다.

7.3.32 DefineField ( receiver, fieldRecord )

추상 연산 DefineField. 인수 receiver (Object) 및 fieldRecord (ClassFieldDefinition 레코드). 반환값: (정상 완료 (값: unused) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. fieldName을 fieldRecord.[[Name]]으로 둡니다.
  2. initializer를 fieldRecord.[[Initializer]]로 둡니다.
  3. initializer가 empty가 아니면, 다음을 수행합니다.
    1. initValue를 ? Call(initializer, receiver)로 둡니다.
  4. 그렇지 않으면,
    1. initValue를 undefined로 둡니다.
  5. fieldName이 Private Name이면, 다음을 수행합니다.
    1. ? PrivateFieldAdd(receiver, fieldName, initValue)를 수행합니다.
  6. 그렇지 않으면,
    1. 단언: fieldName은 프로퍼티 키입니다.
    2. ? CreateDataPropertyOrThrow(receiver, fieldName, initValue)를 수행합니다.
  7. unused를 반환합니다.

7.3.33 InitializeInstanceElements ( obj, ctor )

추상 연산 InitializeInstanceElements. 인수 obj (Object) 및 ctor ((ECMAScript 함수 객체 또는 내장 함수 객체)). 반환값: (정상 완료 (값: unused) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. methods를 ctor.[[PrivateMethods]]로 둡니다.
  2. methods의 각 PrivateElement method에 대해 다음을 수행합니다.
    1. ? PrivateMethodOrAccessorAdd(obj, method)를 수행합니다.
  3. fields를 ctor.[[Fields]]로 둡니다.
  4. fields의 각 요소 fieldRecord에 대해 다음을 수행합니다.
    1. ? DefineField(obj, fieldRecord)를 수행합니다.
  5. unused를 반환합니다.

7.3.34 AddValueToKeyedGroup ( groups, key, value )

추상 연산 AddValueToKeyedGroup. 인수 groups (리스트 (요소: 레코드 (필드: [[Key]] (ECMAScript 언어 값), [[Elements]] (리스트 (요소: ECMAScript 언어 값))))), key (ECMAScript 언어 값) 및 value (ECMAScript 언어 값). 반환값: unused. 호출되면 다음 단계를 수행한다.

  1. groups의 각 Record { [[Key]], [[Elements]] } group에 대해 다음을 수행합니다.
    1. SameValue(group.[[Key]], key)가 true이면, 다음을 수행합니다.
      1. 단언: groups의 정확히 하나의 요소만 이 기준을 만족합니다.
      2. value를 group.[[Elements]]에 추가합니다.
      3. unused를 반환합니다.
  2. group을 Record { [[Key]]: key, [[Elements]]: « value » }로 둡니다.
  3. group을 groups에 추가합니다.
  4. unused를 반환합니다.

7.3.35 GroupBy ( items, callback, keyCoercion )

추상 연산 GroupBy. 인수 items (ECMAScript 언어 값), callback (ECMAScript 언어 값) 및 keyCoercion ((property 또는 collection)). 반환값: (정상 완료 (값: 리스트 (요소: 레코드 (필드: [[Key]] (ECMAScript 언어 값), [[Elements]] (리스트 (요소: ECMAScript 언어 값))))) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. ? RequireObjectCoercible(items)를 수행합니다.
  2. IsCallable(callback)이 false이면, TypeError 예외를 던집니다.
  3. groups를 새로운 빈 List로 둡니다.
  4. iteratorRecord를 ? GetIterator(items, sync)로 둡니다.
  5. k를 0으로 둡니다.
  6. 다음을 반복합니다.
    1. k ≥ 253 - 1이면, 다음을 수행합니다.
      1. error를 ThrowCompletion(새로 생성된 TypeError 객체)으로 둡니다.
      2. ? IteratorClose(iteratorRecord, error)를 반환합니다.
    2. next를 ? IteratorStepValue(iteratorRecord)로 둡니다.
    3. next가 done이면, 다음을 수행합니다.
      1. groups를 반환합니다.
    4. value를 next로 둡니다.
    5. key를 Completion(Call(callback, undefined, « value, 𝔽(k) »))으로 둡니다.
    6. IfAbruptCloseIterator(key, iteratorRecord).
    7. keyCoercion이 property이면, 다음을 수행합니다.
      1. key를 Completion(ToPropertyKey(key))으로 설정합니다.
      2. IfAbruptCloseIterator(key, iteratorRecord).
    8. 그렇지 않으면,
      1. 단언: keyCoercion은 collection입니다.
      2. key를 CanonicalizeKeyedCollectionKey(key)로 설정합니다.
    9. AddValueToKeyedGroup(groups, key, value)를 수행합니다.
    10. k를 k + 1로 설정합니다.

7.3.36 GetOptionsObject ( options )

추상 연산 GetOptionsObject. 인수 options (ECMAScript 언어 값). 반환값: (정상 완료 (값: Object) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. options가 undefined이면, 다음을 수행합니다.
    1. OrdinaryObjectCreate(null)을 반환합니다.
  2. options가 Object이면, 다음을 수행합니다.
    1. options를 반환합니다.
  3. TypeError 예외를 던집니다.

7.3.37 SetterThatIgnoresPrototypeProperties ( thisValue, home, propertyKey, value )

추상 연산 SetterThatIgnoresPrototypeProperties. 인수 thisValue (ECMAScript 언어 값), home (Object), propertyKey (프로퍼티 키) 및 value (ECMAScript 언어 값). 반환값: (정상 완료 (값: unused) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. thisValue가 Object가 아니면, 다음을 수행합니다.
    1. TypeError 예외를 던집니다.
  2. SameValue(thisValue, home)가 true이면, 다음을 수행합니다.
    1. 참고: 여기에서 예외를 던지는 것은 엄격 모드 코드에서 home 객체의 쓰기 불가능한 데이터 프로퍼티에 할당하는 동작을 모방합니다.
    2. TypeError 예외를 던집니다.
  3. propertyDesc를 ? thisValue.[[GetOwnProperty]](propertyKey)로 둡니다.
  4. propertyDesc가 undefined이면, 다음을 수행합니다.
    1. ? CreateDataPropertyOrThrow(thisValue, propertyKey, value)를 수행합니다.
  5. 그렇지 않으면,
    1. ? Set(thisValue, propertyKey, value, true)를 수행합니다.
  6. unused를 반환합니다.

7.4 Iterator 객체에 대한 연산

공통 반복 인터페이스(27.1)를 참조하시기 바랍니다.

7.4.1 Iterator Record

Iterator Record는 이터레이터 또는 비동기 이터레이터와 next 메서드를 함께 캡슐화하는 데 사용하는 Record입니다.

Iterator Record에는 표 13에 나열된 필드가 있습니다.

표 13: Iterator Record 필드
필드 이름 값 의미
[[Iterator]] Object 이터레이터 인터페이스 또는 비동기 이터레이터 인터페이스를 준수하는 객체입니다.
[[NextMethod]] ECMAScript 언어 값 [[Iterator]] 객체의 next 메서드입니다.
[[Done]] Boolean 이터레이터가 완료되었거나 닫혔는지를 나타냅니다.

7.4.2 GetIteratorDirect ( obj )

추상 연산 GetIteratorDirect. 인수 obj (Object). 반환값: Iterator Record를 포함하는 정상 완료 또는 throw 완료. 호출되면 다음 단계를 수행한다.

  1. nextMethod를 ? Get(obj, "next")로 둡니다.
  2. iteratorRecord를 Iterator Record { [[Iterator]]: obj, [[NextMethod]]: nextMethod, [[Done]]: false }로 둡니다.
  3. iteratorRecord를 반환합니다.

7.4.3 GetIteratorFromMethod ( obj, method )

추상 연산 GetIteratorFromMethod. 인수 obj (ECMAScript 언어 값) 및 method (함수 객체). 반환값: Iterator Record를 포함하는 정상 완료 또는 throw 완료. 호출되면 다음 단계를 수행한다.

  1. iterator를 ? Call(method, obj)로 둡니다.
  2. iterator가 Object가 아니면, TypeError 예외를 던집니다.
  3. ? GetIteratorDirect(iterator)를 반환합니다.

7.4.4 GetIterator ( obj, kind )

추상 연산 GetIterator. 인수 obj (ECMAScript 언어 값) 및 kind (sync 또는 async). 반환값: Iterator Record를 포함하는 정상 완료 또는 throw 완료. 호출되면 다음 단계를 수행한다.

  1. kind가 async이면, 다음을 수행합니다.
    1. method를 ? GetMethod(obj, %Symbol.asyncIterator%)로 둡니다.
    2. method가 undefined이면, 다음을 수행합니다.
      1. syncMethod를 ? GetMethod(obj, %Symbol.iterator%)로 둡니다.
      2. syncMethod가 undefined이면, TypeError 예외를 던집니다.
      3. syncIteratorRecord를 ? GetIteratorFromMethod(obj, syncMethod)로 둡니다.
      4. CreateAsyncFromSyncIterator(syncIteratorRecord)를 반환합니다.
  2. 그렇지 않으면,
    1. method를 ? GetMethod(obj, %Symbol.iterator%)로 둡니다.
  3. method가 undefined이면, TypeError 예외를 던집니다.
  4. ? GetIteratorFromMethod(obj, method)를 반환합니다.

7.4.5 GetIteratorFlattenable ( obj, primitiveHandling )

추상 연산 GetIteratorFlattenable. 인수 obj (ECMAScript 언어 값) 및 primitiveHandling (iterate-string-primitives 또는 reject-primitives). 반환값: Iterator Record를 포함하는 정상 완료 또는 throw 완료. 호출되면 다음 단계를 수행한다.

  1. obj가 Object가 아니면, 다음을 수행합니다.
    1. primitiveHandling이 reject-primitives이면, TypeError 예외를 던집니다.
    2. 단언: primitiveHandling은 iterate-string-primitives입니다.
    3. obj가 String이 아니면, TypeError 예외를 던집니다.
  2. method를 ? GetMethod(obj, %Symbol.iterator%)로 둡니다.
  3. method가 undefined이면, 다음을 수행합니다.
    1. iterator를 obj로 둡니다.
  4. 그렇지 않으면,
    1. iterator를 ? Call(method, obj)로 둡니다.
  5. iterator가 Object가 아니면, TypeError 예외를 던집니다.
  6. ? GetIteratorDirect(iterator)를 반환합니다.

7.4.6 IteratorNext ( iteratorRecord [ , value ] )

추상 연산 IteratorNext. 인수 iteratorRecord (Iterator 레코드) 및 선택적 인수 value (ECMAScript 언어 값). 반환값: (정상 완료 (값: Object) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. value가 존재하지 않으면, 다음을 수행합니다.
    1. result를 Completion(Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]]))으로 둡니다.
  2. 그렇지 않으면,
    1. result를 Completion(Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]], « value »))으로 둡니다.
  3. result가 throw 완료이면, 다음을 수행합니다.
    1. iteratorRecord.[[Done]]을 true로 설정합니다.
    2. ? result를 반환합니다.
  4. result를 ! result로 설정합니다.
  5. result가 Object가 아니면, 다음을 수행합니다.
    1. iteratorRecord.[[Done]]을 true로 설정합니다.
    2. TypeError 예외를 던집니다.
  6. result를 반환합니다.

7.4.7 IteratorComplete ( iteratorResult )

추상 연산 IteratorComplete. 인수 iteratorResult (Object). 반환값: (정상 완료 (값: Boolean) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. ToBoolean(? Get(iteratorResult, "done"))을 반환합니다.

7.4.8 IteratorValue ( iteratorResult )

추상 연산 IteratorValue. 인수 iteratorResult (Object). 반환값: (정상 완료 (값: ECMAScript 언어 값) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. ? Get(iteratorResult, "value")를 반환합니다.

7.4.9 IteratorStep ( iteratorRecord )

추상 연산 IteratorStep. 인수 iteratorRecord (Iterator 레코드). 반환값: (정상 완료 (값: (Object 또는 done)) 또는 throw 완료). iteratorRecord.[[NextMethod]]을 호출하여 iteratorRecord.[[Iterator]]에서 다음 값을 요청하고, 이터레이터가 끝에 도달했음을 나타내는 done 또는 다음 값이 있으면 IteratorResult 객체를 반환합니다. 호출되면 다음 단계를 수행한다.

  1. result를 ? IteratorNext(iteratorRecord)로 둡니다.
  2. done을 Completion(IteratorComplete(result))으로 둡니다.
  3. done이 throw 완료이면, 다음을 수행합니다.
    1. iteratorRecord.[[Done]]을 true로 설정합니다.
    2. ? done을 반환합니다.
  4. done을 ! done으로 설정합니다.
  5. done이 true이면, 다음을 수행합니다.
    1. iteratorRecord.[[Done]]을 true로 설정합니다.
    2. done을 반환합니다.
  6. result를 반환합니다.

7.4.10 IteratorStepValue ( iteratorRecord )

추상 연산 IteratorStepValue. 인수 iteratorRecord (Iterator 레코드). 반환값: (정상 완료 (값: (ECMAScript 언어 값 또는 done)) 또는 throw 완료). iteratorRecord.[[NextMethod]]을 호출하여 iteratorRecord.[[Iterator]]에서 다음 값을 요청하고, 이터레이터가 끝에 도달했음을 나타내는 done 또는 다음 값이 있으면 IteratorResult 객체의 값을 반환합니다. 호출되면 다음 단계를 수행한다.

  1. result를 ? IteratorStep(iteratorRecord)로 둡니다.
  2. result가 done이면, 다음을 수행합니다.
    1. done을 반환합니다.
  3. value를 Completion(IteratorValue(result))으로 둡니다.
  4. value가 throw 완료이면, 다음을 수행합니다.
    1. iteratorRecord.[[Done]]을 true로 설정합니다.
  5. ? value를 반환합니다.

7.4.11 IteratorClose ( iteratorRecord, completion )

추상 연산 IteratorClose. 인수 iteratorRecord (Iterator 레코드) 및 completion (완료 레코드). 반환값: 완료 레코드. 이터레이터가 완료 상태에 도달했을 때 일반적으로 수행하는 동작을 수행해야 함을 해당 이터레이터에 알리는 데 사용됩니다. 호출되면 다음 단계를 수행한다.

  1. 단언: iteratorRecord.[[Iterator]]는 Object입니다.
  2. iterator를 iteratorRecord.[[Iterator]]로 둡니다.
  3. innerResult를 Completion(GetMethod(iterator, "return"))으로 둡니다.
  4. innerResult가 정상 완료이면, 다음을 수행합니다.
    1. return을 innerResult.[[Value]]로 둡니다.
    2. return이 undefined이면, ? completion을 반환합니다.
    3. innerResult를 Completion(Call(return, iterator))으로 설정합니다.
  5. completion이 throw 완료이면, ? completion을 반환합니다.
  6. innerResult가 throw 완료이면, ? innerResult를 반환합니다.
  7. innerResult.[[Value]]가 Object가 아니면, TypeError 예외를 던집니다.
  8. ? completion을 반환합니다.

7.4.12 IteratorCloseAll ( iterators, completion )

추상 연산 IteratorCloseAll. 인수 iterators (리스트 (요소: Iterator 레코드)) 및 completion (완료 레코드). 반환값: 완료 레코드. 호출되면 다음 단계를 수행한다.

  1. iterators의 각 요소 iterator에 대해 List 역순으로 다음을 수행합니다.
    1. completion을 Completion(IteratorClose(iterator, completion))으로 설정합니다.
  2. ? completion을 반환합니다.

7.4.13 IfAbruptCloseIterator ( value, iteratorRecord )

IfAbruptCloseIterator는 Iterator Record를 사용하는 알고리즘 단계 시퀀스의 축약 표현입니다. 다음 형식의 알고리즘 단계:

  1. IfAbruptCloseIterator(value, iteratorRecord).

는 다음과 같은 의미입니다:

  1. 단언: value는 Completion Record입니다.
  2. value가 비정상 완료이면, ? IteratorClose(iteratorRecord, value)를 반환합니다.
  3. value를 ! value로 설정합니다.

7.4.14 IfAbruptCloseIterators ( value, iteratorRecords )

IfAbruptCloseIterators는 Iterator Record의 목록을 사용하는 알고리즘 단계 시퀀스의 축약 표현입니다. 다음 형식의 알고리즘 단계:

  1. IfAbruptCloseIterators(value, iteratorRecords).

는 다음과 같은 의미입니다:

  1. 단언: value는 Completion Record입니다.
  2. value가 비정상 완료이면, ? IteratorCloseAll(iteratorRecords, value)을 반환합니다.
  3. value를 ! value로 설정합니다.

7.4.15 AsyncIteratorClose ( iteratorRecord, completion )

추상 연산 AsyncIteratorClose. 인수 iteratorRecord (Iterator 레코드) 및 completion (완료 레코드). 반환값: 완료 레코드. 비동기 이터레이터가 완료 상태에 도달했을 때 일반적으로 수행하는 동작을 수행해야 함을 해당 이터레이터에 알리는 데 사용됩니다. 호출되면 다음 단계를 수행한다.

  1. 단언: iteratorRecord.[[Iterator]]는 Object입니다.
  2. iterator를 iteratorRecord.[[Iterator]]로 둡니다.
  3. innerResult를 Completion(GetMethod(iterator, "return"))으로 둡니다.
  4. innerResult가 정상 완료이면, 다음을 수행합니다.
    1. return을 innerResult.[[Value]]로 둡니다.
    2. return이 undefined이면, ? completion을 반환합니다.
    3. innerResult를 Completion(Call(return, iterator))으로 설정합니다.
    4. innerResult가 정상 완료이면, innerResult를 Completion(Await(innerResult.[[Value]]))으로 설정합니다.
  5. completion이 throw 완료이면, ? completion을 반환합니다.
  6. innerResult가 throw 완료이면, ? innerResult를 반환합니다.
  7. innerResult.[[Value]]가 Object가 아니면, TypeError 예외를 던집니다.
  8. ? completion을 반환합니다.

7.4.16 IfAbruptCloseAsyncIterator ( value, iteratorRecord )

IfAbruptCloseAsyncIterator는 Iterator Record를 사용하는 알고리즘 단계 시퀀스의 축약 표현입니다. 다음 형식의 알고리즘 단계:

  1. IfAbruptCloseAsyncIterator(value, iteratorRecord).

는 다음과 같은 의미입니다:

  1. 단언: value는 Completion Record입니다.
  2. value가 비정상 완료이면, ? AsyncIteratorClose(iteratorRecord, value)를 반환합니다.
  3. value를 ! value로 설정합니다.

7.4.17 CreateIteratorResultObject ( value, done )

추상 연산 CreateIteratorResultObject. 인수 value (ECMAScript 언어 값) 및 done (Boolean). 반환값: an Object that conforms to the IteratorResult interface. IteratorResult 인터페이스를 준수하는 객체를 생성합니다. 호출되면 다음 단계를 수행한다.

  1. obj를 OrdinaryObjectCreate(%Object.prototype%)로 둡니다.
  2. ! CreateDataPropertyOrThrow(obj, "value", value)를 수행합니다.
  3. ! CreateDataPropertyOrThrow(obj, "done", done)을 수행합니다.
  4. obj를 반환합니다.

7.4.18 CreateListIteratorRecord ( list )

추상 연산 CreateListIteratorRecord. 인수 list (리스트 (요소: ECMAScript 언어 값)). 반환값: Iterator 레코드. [[NextMethod]]가 list의 연속된 요소를 반환하는 Iterator Record를 생성합니다. 호출되면 다음 단계를 수행한다.

  1. closure를 매개변수가 없고 list를 캡처하며 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. list의 각 요소 value에 대해 다음을 수행합니다.
      1. ? GeneratorYield(CreateIteratorResultObject(value, false))를 수행합니다.
    2. NormalCompletion(undefined)을 반환합니다.
  2. iterator를 CreateIteratorFromClosure(closure, empty, %Iterator.prototype%)로 둡니다.
  3. Iterator Record { [[Iterator]]: iterator, [[NextMethod]]: %GeneratorPrototype.next%, [[Done]]: false }를 반환합니다.
참고

목록 이터레이터 객체에는 ECMAScript 코드에서 직접 접근할 수 없습니다.

7.4.19 IteratorToList ( iteratorRecord )

추상 연산 IteratorToList. 인수 iteratorRecord (Iterator 레코드). 반환값: (정상 완료 (값: 리스트 (요소: ECMAScript 언어 값)) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. values를 새로운 빈 List로 둡니다.
  2. 다음을 반복합니다.
    1. next를 ? IteratorStepValue(iteratorRecord)로 둡니다.
    2. next가 done이면, 다음을 수행합니다.
      1. values를 반환합니다.
    3. next를 values에 추가합니다.

7.5 폐기 가능한 객체에 대한 연산

공통 리소스 관리 인터페이스(27.2.1)를 참조하시기 바랍니다.

7.5.1 DisposableResource Record

DisposableResource Record는 폐기 가능한 객체와 해당 객체를 폐기하는 데 사용하는 메서드를 함께 캡슐화하는 Record 값입니다. DisposableResource Record는 CreateDisposableResource 추상 연산에 의해 생성됩니다.

DisposableResource Record에는 표 14에 나열된 필드가 있습니다:

표 14: DisposableResource Record 필드
필드 이름 값 의미
[[ResourceValue]] Object 또는 undefined 폐기할 값입니다.
[[Kind]] sync-dispose 또는 async-dispose 리소스가 using 선언 또는 DisposableStack 객체(sync-dispose)에 의해 추가되었는지, 아니면 await using 선언 또는 AsyncDisposableStack 객체(async-dispose)에 의해 추가되었는지를 나타냅니다.
[[DisposeMethod]] 함수 객체 또는 undefined 리소스를 폐기할 때 [[ResourceValue]]를 this 값으로 하여 호출될 함수 객체입니다.

7.5.2 AddDisposableResource ( disposableResourceStack, value, kind [ , method ] )

추상 연산 AddDisposableResource. 인수 disposableResourceStack (리스트 (요소: DisposableResource 레코드)), value (ECMAScript 언어 값) 및 kind ((sync-dispose 또는 async-dispose)) 및 선택적 인수 method (함수 객체). 반환값: (정상 완료 (값: unused) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. method가 존재하면, 다음을 수행합니다.
    1. 단언: value는 undefined입니다.
    2. resource를 ? CreateDisposableResource(undefined, kind, method)로 둡니다.
  2. 그렇지 않으면,
    1. value가 null 또는 undefined이고 kind가 sync-dispose이면, unused를 반환합니다.
    2. 참고: value가 null 또는 undefined이고 kind가 async-dispose이면, 나중에 리소스를 폐기할 때에도 Await를 수행하도록 보장하기 위해 해당 리소스가 평가되었음을 기록합니다.
    3. resource를 ? CreateDisposableResource(value, kind)로 둡니다.
  3. resource를 disposableResourceStack에 추가합니다.
  4. unused를 반환합니다.

7.5.3 CreateDisposableResource ( value, kind [ , method ] )

추상 연산 CreateDisposableResource. 인수 value (ECMAScript 언어 값) 및 kind ((sync-dispose 또는 async-dispose)) 및 선택적 인수 method (함수 객체). 반환값: (정상 완료 (값: DisposableResource 레코드) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. method가 존재하지 않으면, 다음을 수행합니다.
    1. value가 null 또는 undefined이면, 다음을 수행합니다.
      1. value를 undefined로 설정합니다.
      2. method를 undefined로 설정합니다.
    2. 그렇지 않으면,
      1. method를 ? GetDisposeMethod(value, kind)로 설정합니다.
      2. method가 undefined이면, TypeError 예외를 던집니다.
  2. DisposableResource Record { [[ResourceValue]]: value, [[Kind]]: kind, [[DisposeMethod]]: method }를 반환합니다.

7.5.4 GetDisposeMethod ( value, kind )

추상 연산 GetDisposeMethod. 인수 value (ECMAScript 언어 값) 및 kind ((sync-dispose 또는 async-dispose)). 반환값: (정상 완료 (값: (함수 객체 또는 undefined)) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. value가 Object가 아니면, TypeError 예외를 던집니다.
  2. kind가 sync-dispose이면, ? GetMethod(value, %Symbol.dispose%)를 반환합니다.
  3. 단언: kind는 async-dispose입니다.
  4. asyncMethod를 ? GetMethod(value, %Symbol.asyncDispose%)로 둡니다.
  5. asyncMethod가 undefined가 아니면, asyncMethod를 반환합니다.
  6. syncMethod를 ? GetMethod(value, %Symbol.dispose%)로 둡니다.
  7. syncMethod가 undefined이면, undefined를 반환합니다.
  8. closure를 매개변수가 없고 syncMethod를 캡처하며 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. obj를 this 값으로 둡니다.
    2. promiseCapability를 ! NewPromiseCapability(%Promise%)로 둡니다.
    3. result를 Completion(Call(syncMethod, obj))으로 둡니다.
    4. IfAbruptRejectPromise(result, promiseCapability).
    5. ! Call(promiseCapability.[[Resolve]], undefined, « undefined »)를 수행합니다.
    6. promiseCapability.[[Promise]]를 반환합니다.
  9. 참고: 이 함수는 사용자 코드에서 관찰할 수 없습니다. 동기 %Symbol.dispose% 메서드가 반환한 Promise를 기다리지 않도록 하고, 동기 예외를 거부된 Promise로 변환하기 위해 사용됩니다.
  10. CreateBuiltinFunction(closure, 0, "", « »)을 반환합니다.

7.5.5 DisposeResources ( disposableResourceStack, completion )

추상 연산 DisposeResources. 인수 disposableResourceStack (리스트 (요소: DisposableResource 레코드)) 및 completion ((정상 완료 (값: (ECMAScript 언어 값 또는 empty)) 또는 중도 완료)). 반환값: (정상 완료 (값: (ECMAScript 언어 값 또는 empty)) 또는 중도 완료). 호출되면 다음 단계를 수행한다.

  1. needsAwait를 false로 둡니다.
  2. hasAwaited를 false로 둡니다.
  3. outputCompletion을 completion으로 둡니다.
  4. disposableResourceStack의 각 요소 resource에 대해 List 역순으로 다음을 수행합니다.
    1. value를 resource.[[ResourceValue]]로 둡니다.
    2. kind를 resource.[[Kind]]로 둡니다.
    3. method를 resource.[[DisposeMethod]]로 둡니다.
    4. kind가 sync-dispose이고, needsAwait가 true이며, hasAwaited가 false이면, 다음을 수행합니다.
      1. ! Await(undefined)를 수행합니다.
      2. needsAwait를 false로 설정합니다.
    5. method가 undefined가 아니면, 다음을 수행합니다.
      1. result를 Completion(Call(method, value))으로 둡니다.
      2. result가 정상 완료이고 kind가 async-dispose이면, 다음을 수행합니다.
        1. result를 Completion(Await(result.[[Value]]))으로 설정합니다.
        2. hasAwaited를 true로 설정합니다.
      3. result가 throw 완료이면, 다음을 수행합니다.
        1. outputCompletion이 throw 완료이면, 다음을 수행합니다.
          1. result를 result.[[Value]]로 설정합니다.
          2. suppressed를 outputCompletion.[[Value]]로 둡니다.
          3. error를 새로 생성된 SuppressedError 객체로 둡니다.
          4. CreateNonEnumerableDataPropertyOrThrow(error, "error", result)를 수행합니다.
          5. CreateNonEnumerableDataPropertyOrThrow(error, "suppressed", suppressed)를 수행합니다.
          6. outputCompletion을 ThrowCompletion(error)으로 설정합니다.
        2. 그렇지 않으면,
          1. outputCompletion을 result로 설정합니다.
    6. 그렇지 않으면,
      1. 단언: kind는 async-dispose입니다.
      2. needsAwait를 true로 설정합니다.
      3. 참고: 이는 await using 선언의 초기화 값이 null 또는 undefined였던 경우만 나타낼 수 있습니다.
  5. needsAwait가 true이고 hasAwaited가 false이면, 다음을 수행합니다.
    1. ! Await(undefined)를 수행합니다.
  6. 참고: 이 시점 이후 disposableResourceStack은 다시 사용되지 않습니다. 구현체에서는 가비지 컬렉션 등의 방법으로 disposableResourceStack의 내용을 버릴 수 있습니다.
  7. ? outputCompletion을 반환합니다.