7 추상 연산

이 연산들은 ECMAScript 언어의 일부가 아니다. 이들은 오직 ECMAScript 언어의 의미론 명세를 돕기 위해 여기서 정의된다. 더 특수화된 다른 추상 연산들은 이 명세 전반에 걸쳐 정의된다.

7.1 타입 변환

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

BigInt 타입은 ECMAScript 언어에서 암묵적 변환을 가지지 않는다. 프로그래머는 다른 타입의 값을 변환하기 위해 BigInt를 명시적으로 호출해야 한다.

7.1.1 ToPrimitive ( input [ , preferredType ] )

The abstract operation ToPrimitive takes argument input (an ECMAScript language value) and optional argument preferredType (string or number) and returns either a normal completion containing an ECMAScript language value or a throw completion. 이것은 input 인수를 비-Object 타입으로 변환한다. 어떤 객체가 둘 이상의 원시 타입으로 변환될 수 있다면, 선택적 힌트 preferredType을 사용해 그 타입을 선호할 수 있다. It performs the following steps when called:

  1. input이 Object이면,
    1. exoticToPrim을 ? GetMethod(input, %Symbol.toPrimitive%)라고 하자.
    2. exoticToPrimundefined가 아니면,
      1. preferredType이 존재하지 않으면,
        1. hint"default"라고 하자.
      2. 그렇지 않고 preferredTypestring이면,
        1. hint"string"이라고 하자.
      3. 그렇지 않으면,
        1. Assert: preferredTypenumber이다.
        2. hint"number"라고 하자.
      4. result를 ? Call(exoticToPrim, input, « hint »)라고 하자.
      5. result가 Object가 아니면, result를 반환한다.
      6. TypeError 예외를 던진다.
    3. preferredType이 존재하지 않으면, preferredTypenumber로 설정한다.
    4. OrdinaryToPrimitive(input, preferredType)를 반환한다.
  2. input을 반환한다.
Note

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

7.1.1.1 OrdinaryToPrimitive ( obj, hint )

The abstract operation OrdinaryToPrimitive takes arguments obj (an Object) and hint (string or number) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. hintstring이면,
    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 ( argument )

The abstract operation ToBoolean takes argument argument (an ECMAScript language value) and returns a Boolean. 이것은 argumentBoolean 타입의 값으로 변환한다. It performs the following steps when called:

  1. argument가 Boolean이면, argument를 반환한다.
  2. argumentundefined, null, +0𝔽, -0𝔽, NaN, 0, 또는 빈 String 중 하나이면, false를 반환한다.
  3. Normative Optional
    호스트가 웹 브라우저이거나 [[IsHTMLDDA]] 내부 슬롯를 지원하는 경우,
    1. argument가 Object이고 [[IsHTMLDDA]] 내부 슬롯을 가지면, false를 반환한다.
  4. true를 반환한다.

7.1.3 ToNumeric ( value )

The abstract operation ToNumeric takes argument value (an ECMAScript language value) and returns either a normal completion containing either a Number or a BigInt, or a throw completion. 이것은 value를 Number 또는 BigInt로 변환해 반환한다. It performs the following steps when called:

  1. primValue를 ? ToPrimitive(value, number)라고 하자.
  2. primValue가 BigInt이면, primValue를 반환한다.
  3. ToNumber(primValue)를 반환한다.

7.1.4 ToNumber ( argument )

The abstract operation ToNumber takes argument argument (an ECMAScript language value) and returns either a normal completion containing a Number or a throw completion. 이것은 argumentNumber 타입의 값으로 변환한다. It performs the following steps when called:

  1. argument가 Number이면, argument를 반환한다.
  2. argument가 Symbol 또는 BigInt이면, TypeError 예외를 던진다.
  3. argumentundefined이면, NaN을 반환한다.
  4. argumentnull 또는 false이면, +0𝔽를 반환한다.
  5. argumenttrue이면, 1𝔽를 반환한다.
  6. argument가 String이면, StringToNumber(argument)를 반환한다.
  7. Assert: argument는 Object이다.
  8. primValue를 ? ToPrimitive(argument, number)라고 하자.
  9. Assert: primValue는 Object가 아니다.
  10. ToNumber(primValue)를 반환한다.

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) 에서 사용되는 정의를 가진다.

Note

StringNumericLiteral의 구문과 NumericLiteral의 구문 사이에는 몇 가지 차이가 있음을 주의해야 한다.

7.1.4.1.1 StringToNumber ( str )

The abstract operation StringToNumber takes argument str (a String) and returns a Number. It performs the following steps when called:

  1. literalParseText(str, StringNumericLiteral)라고 하자.
  2. literal이 오류들의 List이면, NaN을 반환한다.
  3. literalStringNumericValue를 반환한다.

7.1.4.1.2 Runtime Semantics: StringNumericValue

The syntax-directed operation StringNumericValue takes no arguments and returns a Number.

Note

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

It is defined piecewise over the following productions:

StringNumericLiteral ::: StrWhiteSpaceopt
  1. +0𝔽를 반환한다.
StringNumericLiteral ::: StrWhiteSpaceopt StrNumericLiteral StrWhiteSpaceopt
  1. StrNumericLiteralStringNumericValue를 반환한다.
StrNumericLiteral ::: NonDecimalIntegerLiteral
  1. 𝔽(MV of NonDecimalIntegerLiteral)를 반환한다.
StrDecimalLiteral ::: - StrUnsignedDecimalLiteral
  1. aStrUnsignedDecimalLiteralStringNumericValue라고 하자.
  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의 code point 수라고 하자.
  3. 그렇지 않으면,
    1. b를 0이라고 하자.
    2. n을 0이라고 하자.
  4. ExponentPart가 존재하면 eExponentPart의 MV라고 하고, 그렇지 않으면 e를 0이라고 하자.
  5. RoundMVResult((a + (b × 10-n)) × 10e)를 반환한다.
StrUnsignedDecimalLiteral ::: . DecimalDigits ExponentPartopt
  1. bDecimalDigits의 MV라고 하자.
  2. ExponentPart가 존재하면 eExponentPart의 MV라고 하고, 그렇지 않으면 e를 0이라고 하자.
  3. nDecimalDigits의 code point 수라고 하자.
  4. RoundMVResult(b × 10e - n)를 반환한다.
StrUnsignedDecimalLiteral ::: DecimalDigits ExponentPartopt
  1. aDecimalDigits의 MV라고 하자.
  2. ExponentPart가 존재하면 eExponentPart의 MV라고 하고, 그렇지 않으면 e를 0이라고 하자.
  3. RoundMVResult(a × 10e)를 반환한다.

7.1.4.1.3 RoundMVResult ( n )

The abstract operation RoundMVResult takes argument n (a mathematical value) and returns a Number. 이것은 n구현 정의 방식으로 Number로 변환한다. 이 추상 연산의 목적상, 어떤 자릿수는 그것이 0이 아니거나, 또는 그 왼쪽에 0이 아닌 자릿수가 있고 오른쪽에도 0이 아닌 자릿수가 있으면 유효하다. 또한 이 추상 연산의 목적상, 수학적 값의 한 표현이 “나타내는 수학적 값”은 수학적 값의 “십진 표현”의 역이다. It performs the following steps when called:

  1. n의 십진 표현이 20개 이하의 유효 숫자를 가지면, 𝔽(n)을 반환한다.
  2. option1n의 십진 표현에서 20번째 이후의 각 유효 숫자를 모두 0 숫자로 바꾼 결과가 나타내는 수학적 값이라고 하자.
  3. option2n의 십진 표현에서 20번째 이후의 각 유효 숫자를 모두 0 숫자로 바꾼 뒤, 20번째 위치의 숫자를 증가시킨 결과(필요하면 받아올림 포함)가 나타내는 수학적 값이라고 하자.
  4. chosenoption1 또는 option2구현 정의로 선택된 값이라고 하자.
  5. 𝔽(chosen)를 반환한다.

7.1.5 ToIntegerOrInfinity ( argument )

The abstract operation ToIntegerOrInfinity takes argument argument (an ECMAScript language value) and returns either a normal completion containing either an integer, +∞, or -∞, or a throw completion. 이것은 argument를 소수 부분이 절단된 Number 값을 나타내는 정수로 변환하거나, 그 Number 값이 무한이면 +∞ 또는 -∞로 변환한다. It performs the following steps when called:

  1. number를 ? ToNumber(argument)라고 하자.
  2. numberNaN, +0𝔽, 또는 -0𝔽 중 하나이면, 0을 반환한다.
  3. number+∞𝔽이면, +∞를 반환한다.
  4. number-∞𝔽이면, -∞를 반환한다.
  5. truncate((number))를 반환한다.
Note
𝔽(ToIntegerOrInfinity(x))는 어떤 x 값에 대해서도 결코 -0𝔽를 반환하지 않는다. 소수 부분의 절단은 x수학적 값으로 변환한 뒤 수행된다.

7.1.6 ToFixedSizeInteger ( int, signed, bitWidth )

The abstract operation ToFixedSizeInteger takes arguments int (an integer, +∞, or -∞), signed (unsigned or signed), and bitWidth (a positive integer) and returns an integer. 이는 int를 0부터 2bitWidth - 1까지의 포함 구간에 있는 2bitWidth개의 정수 중 하나로(unsigned인 경우), 또는 -2bitWidth - 1부터 2bitWidth - 1 - 1까지의 포함 구간에 있는 정수 중 하나로(signed인 경우) 매핑한다. It performs the following steps when called:

  1. int = +∞ 또는 int = -∞이면, 0을 반환한다.
  2. fixedIntint modulo 2bitWidth라 하자.
  3. NOTE: 다음 단계는 fixedInt의 2의 보수 표현을 변경하지 않는다.
  4. signedsigned이고 fixedInt ≥ 2bitWidth - 1이면, fixedIntfixedInt - 2bitWidth로 설정한다.
  5. fixedInt를 반환한다.
Note

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.7 ToInt32 ( argument )

The abstract operation ToInt32 takes argument argument (ECMAScript 언어 값) and returns 정수 Number를 포함하는 정상 완료 또는 throw 완료. 이는 argument𝔽(-231)부터 𝔽(231 - 1)까지의 포함 구간에 있는 232개의 정수 Number 값 중 하나로 변환하며, -0𝔽는 제외한다. It performs the following steps when called:

  1. int를 ? ToIntegerOrInfinity(argument)라 하자.
  2. 𝔽(ToFixedSizeInteger(int, signed, 32))를 반환한다.

7.1.8 ToUint32 ( argument )

The abstract operation ToUint32 takes argument argument (ECMAScript 언어 값) and returns 정수 Number를 포함하는 정상 완료 또는 throw 완료. 이는 argument+0𝔽부터 𝔽(232 - 1)까지의 포함 구간에 있는 232개의 정수 Number 값 중 하나로 변환한다. It performs the following steps when called:

  1. int를 ? ToIntegerOrInfinity(argument)라 하자.
  2. 𝔽(ToFixedSizeInteger(int, unsigned, 32))를 반환한다.

7.1.9 ToInt16 ( argument )

The abstract operation ToInt16 takes argument argument (ECMAScript 언어 값) and returns 정수 Number를 포함하는 정상 완료 또는 throw 완료. 이는 argument𝔽(-215)부터 𝔽(215 - 1)까지의 포함 구간에 있는 216개의 정수 Number 값 중 하나로 변환하며, -0𝔽는 제외한다. It performs the following steps when called:

  1. int를 ? ToIntegerOrInfinity(argument)라 하자.
  2. 𝔽(ToFixedSizeInteger(int, signed, 16))를 반환한다.

7.1.10 ToUint16 ( argument )

The abstract operation ToUint16 takes argument argument (ECMAScript 언어 값) and returns 정수 Number를 포함하는 정상 완료 또는 throw 완료. 이는 argument+0𝔽부터 𝔽(216 - 1)까지의 포함 구간에 있는 216개의 정수 Number 값 중 하나로 변환한다. It performs the following steps when called:

  1. int를 ? ToIntegerOrInfinity(argument)라 하자.
  2. 𝔽(ToFixedSizeInteger(int, unsigned, 16))를 반환한다.

7.1.11 ToInt8 ( argument )

The abstract operation ToInt8 takes argument argument (ECMAScript 언어 값) and returns 정수 Number를 포함하는 정상 완료 또는 throw 완료. 이는 argument-128𝔽부터 127𝔽까지의 포함 구간에 있는 28개의 정수 Number 값 중 하나로 변환하며, -0𝔽는 제외한다. It performs the following steps when called:

  1. int를 ? ToIntegerOrInfinity(argument)라 하자.
  2. 𝔽(ToFixedSizeInteger(int, signed, 8))를 반환한다.

7.1.12 ToUint8 ( argument )

The abstract operation ToUint8 takes argument argument (ECMAScript 언어 값) and returns 정수 Number를 포함하는 정상 완료 또는 throw 완료. 이는 argument+0𝔽부터 255𝔽까지의 포함 구간에 있는 28개의 정수 Number 값 중 하나로 변환한다. It performs the following steps when called:

  1. int를 ? ToIntegerOrInfinity(argument)라 하자.
  2. 𝔽(ToFixedSizeInteger(int, unsigned, 8))를 반환한다.

7.1.13 ToUint8Clamp ( argument )

The abstract operation ToUint8Clamp takes argument argument (ECMAScript 언어 값) and returns 정수 Number를 포함하는 정상 완료 또는 throw 완료. 이는 argument를 0부터 255까지의 포함 구간에 있는 28개의 정수 Number 값 중 하나로 클램프하고 반올림한다. It performs the following steps when called:

  1. number를 ? ToNumber(argument)라 하자.
  2. numberNaN이면, +0𝔽를 반환한다.
  3. mvnumber의 확장 수학 값이라 하자.
  4. clampedmv를 0과 255 사이로 클램프한 결과라 하자.
  5. ffloor(clamped)라 하자.
  6. clamped < f + 0.5이면, 𝔽(f)를 반환한다.
  7. clamped > f + 0.5이면, 𝔽(f + 1)를 반환한다.
  8. f가 짝수이면, 𝔽(f)를 반환한다.
  9. 𝔽(f + 1)를 반환한다.
Note

대부분의 다른 ECMAScript 정수 변환 연산과 달리, ToUint8Clamp는 비정수 값을 자르지 않고 반올림한다. 또한 “절반은 짝수로 반올림” 동률 처리 방식을 사용하는데, 이는 Math.round의 “절반 올림” 동률 처리 방식과 다르다.

7.1.14 ToBigInt ( argument )

The abstract operation ToBigInt takes argument argument (ECMAScript 언어 값) and returns BigInt를 포함하는 정상 완료 또는 throw 완료. 이는 argument를 BigInt 값으로 변환하거나, Number에서의 암시적 변환이 필요한 경우 던진다. It performs the following steps when called:

  1. prim을 ? ToPrimitive(argument, number)라 하자.
  2. Table 12에서 prim에 대응하는 값을 반환한다.
Table 12: BigInt 변환
인수 타입 결과
Undefined TypeError 예외를 던진다.
Null TypeError 예외를 던진다.
Boolean primtrue이면 1n을 반환하고, primfalse이면 0n을 반환한다.
BigInt prim을 반환한다.
Number TypeError 예외를 던진다.
String
  1. nStringToBigInt(prim)라 하자.
  2. nundefined이면, SyntaxError 예외를 던진다.
  3. n을 반환한다.
Symbol TypeError 예외를 던진다.

7.1.15 StringToBigInt ( str )

The abstract operation StringToBigInt takes argument str (String) and returns BigInt 또는 undefined. It performs the following steps when called:

  1. literalParseText(str, StringIntegerLiteral)라 하자.
  2. literal이 오류의 List이면, undefined를 반환한다.
  3. mvliteral의 MV라 하자.
  4. Assert: mv정수이다.
  5. (mv)를 반환한다.

7.1.15.1 StringIntegerLiteral 문법

StringToBigInt는 다음 문법을 사용한다.

구문

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

7.1.15.2 런타임 의미론: MV

7.1.16 ToBigInt64 ( argument )

The abstract operation ToBigInt64 takes argument argument (ECMAScript 언어 값) and returns BigInt를 포함하는 정상 완료 또는 throw 완료. 이는 argument(-263)부터 (263 - 1)까지의 포함 구간에 있는 264개의 BigInt 값 중 하나로 변환한다. It performs the following steps when called:

  1. int(? ToBigInt(argument))라 하자.
  2. (ToFixedSizeInteger(int, signed, 64))를 반환한다.

7.1.17 ToBigUint64 ( argument )

The abstract operation ToBigUint64 takes argument argument (ECMAScript 언어 값) and returns BigInt를 포함하는 정상 완료 또는 throw 완료. 이는 argument0부터 (264 - 1)까지의 포함 구간에 있는 264개의 BigInt 값 중 하나로 변환한다. It performs the following steps when called:

  1. int(? ToBigInt(argument))라 하자.
  2. (ToFixedSizeInteger(int, unsigned, 64))를 반환한다.

7.1.18 ToString ( argument )

The abstract operation ToString takes argument argument (ECMAScript 언어 값) and returns String을 포함하는 정상 완료 또는 throw 완료. 이는 argumentString 타입의 값으로 변환한다. It performs the following steps when called:

  1. argument가 String이면, argument를 반환한다.
  2. argument가 Symbol이면, TypeError 예외를 던진다.
  3. argumentundefined이면, "undefined"를 반환한다.
  4. argumentnull이면, "null"을 반환한다.
  5. argumenttrue이면, "true"를 반환한다.
  6. argumentfalse이면, "false"를 반환한다.
  7. argument가 Number이면, Number::toString(argument, 10)을 반환한다.
  8. argument가 BigInt이면, BigInt::toString(argument, 10)을 반환한다.
  9. Assert: argument는 Object이다.
  10. primValue를 ? ToPrimitive(argument, string)이라 하자.
  11. Assert: primValue는 Object가 아니다.
  12. ToString(primValue)를 반환한다.

7.1.19 ToObject ( argument )

The abstract operation ToObject takes argument argument (ECMAScript 언어 값) and returns Object를 포함하는 정상 완료 또는 throw 완료. 이는 argumentObject 타입의 값으로 변환한다. It performs the following steps when called:

  1. argumentundefined 또는 null이면, TypeError 예외를 던진다.
  2. argument가 Boolean이면, [[BooleanData]] 내부 슬롯이 argument로 설정된 새로운 Boolean 객체를 반환한다. Boolean 객체에 대한 설명은 20.3를 보라.
  3. argument가 Number이면, [[NumberData]] 내부 슬롯이 argument로 설정된 새로운 Number 객체를 반환한다. Number 객체에 대한 설명은 21.1를 보라.
  4. argument가 String이면, [[StringData]] 내부 슬롯이 argument로 설정된 새로운 String 객체를 반환한다. String 객체에 대한 설명은 22.1를 보라.
  5. argument가 Symbol이면, [[SymbolData]] 내부 슬롯이 argument로 설정된 새로운 Symbol 객체를 반환한다. Symbol 객체에 대한 설명은 20.4를 보라.
  6. argument가 BigInt이면, [[BigIntData]] 내부 슬롯이 argument로 설정된 새로운 BigInt 객체를 반환한다. BigInt 객체에 대한 설명은 21.2를 보라.
  7. Assert: argument는 Object이다.
  8. argument를 반환한다.

7.1.20 ToPropertyKey ( argument )

The abstract operation ToPropertyKey takes argument argument (ECMAScript 언어 값) and returns 속성 키를 포함하는 정상 완료 또는 throw 완료. 이는 argument를 속성 키로 사용할 수 있는 값으로 변환한다. It performs the following steps when called:

  1. key를 ? ToPrimitive(argument, string)이라 하자.
  2. key가 Symbol이면, 다음을 수행한다.
    1. key를 반환한다.
  3. ToString(key)를 반환한다.

7.1.21 ToLength ( argument )

The abstract operation ToLength takes argument argument (ECMAScript 언어 값) and returns 음이 아닌 정수 Number를 포함하는 정상 완료 또는 throw 완료. 이는 argument를 배열 유사 객체의 길이로 사용하기에 적합한 음이 아닌 정수 Number로 클램프하고 자른다. It performs the following steps when called:

  1. len을 ? ToIntegerOrInfinity(argument)라 하자.
  2. len ≤ 0이면, +0𝔽를 반환한다.
  3. 𝔽(min(len, 253 - 1))를 반환한다.

7.1.22 CanonicalNumericIndexString ( argument )

The abstract operation CanonicalNumericIndexString takes argument argument (String) and returns Number 또는 undefined. argument"-0"이거나 어떤 Number 값 n에 대해 ToString(n)과 정확히 일치하면, 해당 Number 값을 반환한다. 그렇지 않으면 undefined를 반환한다. It performs the following steps when called:

  1. argument"-0"이면, -0𝔽를 반환한다.
  2. n을 ! ToNumber(argument)라 하자.
  3. ToString(n)이 argument이면, n을 반환한다.
  4. undefined를 반환한다.

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

7.1.23 ToIndex ( value )

The abstract operation ToIndex takes argument value (an ECMAScript language value) and returns either a normal completion containing a non-negative integer or a throw completion. 이것은 value정수로 변환하고, 그 정수가 음이 아니며 integer index에 대응하면 그 정수를 반환한다. 그렇지 않으면 예외를 던진다. It performs the following steps when called:

  1. integer를 ? ToIntegerOrInfinity(value)라고 하자.
  2. integer가 0부터 253 - 1까지의 포함 구간 안에 있지 않으면, RangeError 예외를 던진다.
  3. integer를 반환한다.

7.2 테스트 및 비교 연산

7.2.1 RequireObjectCoercible ( argument )

The abstract operation RequireObjectCoercible takes argument argument (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. 이것은 argumentToObject를 사용해 Object로 변환될 수 없는 값이면 오류를 던진다. It performs the following steps when called:

  1. argumentundefined 또는 null이면, TypeError 예외를 던진다.
  2. unused를 반환한다.

7.2.2 IsArray ( argument )

The abstract operation IsArray takes argument argument (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. argument가 Object가 아니면, false를 반환한다.
  2. argument가 Array exotic object이면, true를 반환한다.
  3. argument가 Proxy exotic object이면,
    1. ValidateNonRevokedProxy(argument)를 수행한다.
    2. proxyTargetargument.[[ProxyTarget]]라고 하자.
    3. IsArray(proxyTarget)를 반환한다.
  4. false를 반환한다.

7.2.3 IsCallable ( argument )

The abstract operation IsCallable takes argument argument (an ECMAScript language value) and returns a Boolean. 이것은 argument[[Call]] 내부 메서드를 가진 호출 가능한 함수인지 결정한다. It performs the following steps when called:

  1. argument가 Object가 아니면, false를 반환한다.
  2. argument[[Call]] 내부 메서드를 가지면, true를 반환한다.
  3. false를 반환한다.

7.2.4 IsConstructor ( argument )

The abstract operation IsConstructor takes argument argument (an ECMAScript language value) and returns a Boolean. 이것은 argument[[Construct]] 내부 메서드를 가진 함수 객체인지 결정한다. It performs the following steps when called:

  1. argument가 Object가 아니면, false를 반환한다.
  2. argument[[Construct]] 내부 메서드를 가지면, true를 반환한다.
  3. false를 반환한다.

7.2.5 IsExtensible ( obj )

The abstract operation IsExtensible takes argument obj (an Object) and returns either a normal completion containing a Boolean or a throw completion. 이것은 obj에 추가 프로퍼티를 더할 수 있는지 결정하는 데 사용된다. It performs the following steps when called:

  1. obj.[[IsExtensible]]()를 반환한다.

7.2.6 IsRegExp ( argument )

The abstract operation IsRegExp takes argument argument (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. argument가 Object가 아니면, false를 반환한다.
  2. matcher를 ? Get(argument, %Symbol.match%)라고 하자.
  3. matcherundefined가 아니면, ToBoolean(matcher)를 반환한다.
  4. argument[[RegExpMatcher]] 내부 슬롯을 가지면, true를 반환한다.
  5. false를 반환한다.

7.2.7 Static Semantics: IsStringWellFormedUnicode ( string )

The abstract operation IsStringWellFormedUnicode takes argument string (a String) and returns a Boolean. 이것은 string6.1.4 에 설명된 대로 UTF-16으로 인코딩된 code point 시퀀스로 해석하고, 그것이 well formed UTF-16 시퀀스인지 결정한다. It performs the following steps when called:

  1. lenstring의 길이라고 하자.
  2. k를 0이라고 하자.
  3. k < len인 동안, 다음을 반복한다.
    1. cpCodePointAt(string, k)라고 하자.
    2. cp.[[IsUnpairedSurrogate]]true이면, false를 반환한다.
    3. kk + cp.[[CodeUnitCount]]로 설정한다.
  4. true를 반환한다.

7.2.8 SameType ( x, y )

The abstract operation SameType takes arguments x (an ECMAScript language value) and y (an ECMAScript language value) and returns a Boolean. 이것은 두 인수가 같은 타입인지 아닌지를 결정한다. It performs the following steps when called:

  1. xundefined이고 yundefined이면, true를 반환한다.
  2. xnull이고 ynull이면, 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 )

The abstract operation SameValue takes arguments x (an ECMAScript language value) and y (an ECMAScript language value) and returns a Boolean. 이것은 두 인수가 같은 값인지 아닌지를 결정한다. It performs the following steps when called:

  1. SameType(x, y)가 false이면, false를 반환한다.
  2. x가 Number이면,
    1. Number::sameValue(x, y)를 반환한다.
  3. SameValueNonNumber(x, y)를 반환한다.
Note

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

7.2.10 SameValueZero ( x, y )

The abstract operation SameValueZero takes arguments x (an ECMAScript language value) and y (an ECMAScript language value) and returns a Boolean. 이것은 두 인수가 같은 값인지 아닌지를 결정한다 (+0𝔽-0𝔽의 차이는 무시한다). It performs the following steps when called:

  1. SameType(x, y)가 false이면, false를 반환한다.
  2. x가 Number이면,
    1. Number::sameValueZero(x, y)를 반환한다.
  3. SameValueNonNumber(x, y)를 반환한다.
Note

SameValueZero는 +0𝔽-0𝔽를 동등하게 취급한다는 점에서만 SameValue와 다르다.

7.2.11 SameValueNonNumber ( x, y )

The abstract operation SameValueNonNumber takes arguments x (an ECMAScript language value, but not a Number) and y (an ECMAScript language value, but not a Number) and returns a Boolean. It performs the following steps when called:

  1. Assert: SameType(x, y)는 true이다.
  2. xundefined 또는 null이면, true를 반환한다.
  3. x가 BigInt이면,
    1. BigInt::equal(x, y)를 반환한다.
  4. x가 String이면,
    1. xy의 길이가 같고 같은 위치에 같은 code unit을 가지면, true를 반환한다.
    2. false를 반환한다.
  5. x가 Boolean이면,
    1. xtrue이고 ytrue이면, true를 반환한다.
    2. xfalse이고 yfalse이면, true를 반환한다.
    3. false를 반환한다.
  6. NOTE: 다른 모든 ECMAScript 언어 값은 identity로 비교된다.
  7. xy이면, true를 반환한다.
  8. false를 반환한다.
Note 1
설명 목적상, 필요하지 않더라도 일부 경우는 이 알고리즘 안에서 별도로 처리된다.
Note 2
"xy이다"가 의미하는 구체적인 사항은 5.2.8에 자세히 설명되어 있다.

7.2.12 IsLessThan ( x, y, leftFirst )

The abstract operation IsLessThan takes arguments x (an ECMAScript language value), y (an ECMAScript language value), and leftFirst (a Boolean) and returns either a normal completion containing either a Boolean or undefined, or a throw completion. x < y 비교에 대한 의미론을 제공하며, true, false 또는 undefined를 반환한다(undefined는 피연산자를 동일한 수치 타입의 비교 가능한 값으로 강제 변환할 수 없음을 나타낸다). leftFirst 플래그는 xy에 대해 잠재적으로 관찰 가능한 부수 효과가 있는 연산이 수행되는 순서를 제어하는 데 사용된다. ECMAScript는 표현식의 왼쪽에서 오른쪽으로의 평가를 명시하므로 이것이 필요하다. leftFirsttrue이면, x 매개변수는 y 매개변수에 대응하는 표현식의 왼쪽에 나타나는 표현식에 대응한다. leftFirstfalse이면 그 반대의 경우이며, 연산은 x보다 y에 대해 먼저 수행되어야 한다. It performs the following steps when called:

  1. leftFirsttrue이면,
    1. px를 ? ToPrimitive(x, number)라고 하자.
    2. py를 ? ToPrimitive(y, number)라고 하자.
  2. 그렇지 않으면,
    1. NOTE: 왼쪽에서 오른쪽 평가를 보존하기 위해 평가 순서를 뒤집어야 한다.
    2. py를 ? ToPrimitive(y, number)라고 하자.
    3. px를 ? ToPrimitive(x, number)라고 하자.
  3. px가 String이고 py가 String이면,
    1. lxpx의 길이라고 하자.
    2. lypy의 길이라고 하자.
    3. 0 ≤ i < min(lx, ly)를 만족하는 각 정수 i에 대해, 오름차순으로 다음을 수행한다.
      1. cxpx 안의 인덱스 i 위치 code unit의 숫자 값이라고 하자.
      2. cypy 안의 인덱스 i 위치 code unit의 숫자 값이라고 하자.
      3. cx < cy이면, true를 반환한다.
      4. cx > cy이면, false를 반환한다.
    4. lx < ly이면, true를 반환한다.
    5. false를 반환한다.
  4. px가 BigInt이고 py가 String이면,
    1. nyStringToBigInt(py)라고 하자.
    2. nyundefined이면, undefined를 반환한다.
    3. BigInt::lessThan(px, ny)를 반환한다.
  5. px가 String이고 py가 BigInt이면,
    1. nxStringToBigInt(px)라고 하자.
    2. nxundefined이면, undefined를 반환한다.
    3. BigInt::lessThan(nx, py)를 반환한다.
  6. NOTE: pxpy는 원시 값이므로, 평가 순서는 중요하지 않다.
  7. nx를 ? ToNumeric(px)라고 하자.
  8. ny를 ? ToNumeric(py)라고 하자.
  9. SameType(nx, ny)가 true이면,
    1. nx가 Number이면, Number::lessThan(nx, ny)를 반환한다.
    2. Assert: nx는 BigInt이다.
    3. BigInt::lessThan(nx, ny)를 반환한다.
  10. Assert: nx는 BigInt이고 ny는 Number이거나, nx는 Number이고 ny는 BigInt이다.
  11. nxNaN이거나 nyNaN이면, undefined를 반환한다.
  12. nx-∞𝔽이거나 ny+∞𝔽이면, true를 반환한다.
  13. nx+∞𝔽이거나 ny-∞𝔽이면, false를 반환한다.
  14. (nx) < (ny)이면, true를 반환한다.
  15. false를 반환한다.
Note 1

단계 3는, 덧셈 연산자 +를 처리하는 알고리즘 (13.15.3) 의 단계 1.c와 달리 논리합이 아니라 논리곱 연산을 사용한다는 점에서 다르다.

Note 2

String 비교는 UTF-16 code unit 값들의 시퀀스에 대한 단순한 사전식 순서를 사용한다. Unicode 명세에 정의된 문자 또는 문자열 동등성과 정렬 순서의 더 복잡하고 의미 지향적인 정의를 사용하려는 시도는 하지 않는다. 따라서 Unicode 표준에 따라 정준적으로 같지만 같은 정규화 형식이 아닌 String 값은 서로 같지 않은 것으로 테스트될 수 있다. 또한 surrogate pair를 포함한 String에 대해 code unit에 의한 사전식 순서가 code point에 의한 순서와 다르다는 점도 유의하라.

7.2.13 IsLooselyEqual ( x, y )

The abstract operation IsLooselyEqual takes arguments x (an ECMAScript language value) and y (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. 이것은 == 연산자의 의미론을 제공한다. It performs the following steps when called:

  1. SameType(x, y)가 true이면,
    1. IsStrictlyEqual(x, y)를 반환한다.
  2. xnull이고 yundefined이면, true를 반환한다.
  3. xundefined이고 ynull이면, true를 반환한다.
  4. Normative Optional
    호스트가 웹 브라우저이거나 [[IsHTMLDDA]] 내부 슬롯를 지원하는 경우,
    1. x가 Object이고, x[[IsHTMLDDA]] 내부 슬롯을 가지며, yundefined 또는 null이면, true를 반환한다.
    2. xundefined 또는 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. nStringToBigInt(y)라고 하자.
    2. nundefined이면, 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유한하지 않으면, false를 반환한다.
    2. (x) = (y)이면, true를 반환한다.
    3. false를 반환한다.
  14. false를 반환한다.

7.2.14 IsStrictlyEqual ( x, y )

The abstract operation IsStrictlyEqual takes arguments x (an ECMAScript language value) and y (an ECMAScript language value) and returns a Boolean. 이것은 === 연산자의 의미론을 제공한다. It performs the following steps when called:

  1. SameType(x, y)가 false이면, false를 반환한다.
  2. x가 Number이면,
    1. Number::equal(x, y)를 반환한다.
  3. SameValueNonNumber(x, y)를 반환한다.
Note

이 알고리즘은 signed zero와 NaN을 처리하는 방식에서 SameValue 알고리즘과 다르다.

7.3 객체에 대한 연산

7.3.1 MakeBasicObject ( internalSlotsList )

The abstract operation MakeBasicObject takes argument internalSlotsList (a List of internal slot names) and returns an Object. 이것은 ordinary objectexotic object를 포함하여 알고리즘적으로 생성되는 모든 ECMAScript 객체의 원천이다. 이것은 모든 객체 생성에 사용되는 공통 단계를 분리해내고, 객체 생성을 중앙화한다. It performs the following steps when called:

  1. internalSlotsListinternalSlotsList와 « [[PrivateElements]] »의 list-concatenation으로 설정한다.
  2. internalSlotsList 안의 각 이름에 대해 내부 슬롯을 하나씩 가진 새로 생성된 객체를 obj라고 하자.
  3. NOTE: Object 내부 메서드와 내부 슬롯에 설명된 대로, 달리 명시되지 않는 한 각 내부 슬롯의 초기 값은 undefined이다.
  4. obj.[[PrivateElements]]를 새로운 빈 List로 설정한다.
  5. obj의 essential internal methods를 10.1에 명세된 기본 ordinary object 정의로 설정한다.
  6. Assert: 호출자가 obj[[GetPrototypeOf]][[SetPrototypeOf]] essential internal methods를 둘 다 재정의하지 않을 것이라면, internalSlotsList[[Prototype]]을 포함한다.
  7. Assert: 호출자가 obj[[SetPrototypeOf]], [[IsExtensible]], [[PreventExtensions]] essential internal methods를 모두 재정의하지 않을 것이라면, internalSlotsList[[Extensible]]을 포함한다.
  8. internalSlotsList[[Extensible]]을 포함하면, obj.[[Extensible]]true로 설정한다.
  9. obj를 반환한다.
Note

이 명세에서 exotic objectArrayCreate, BoundFunctionCreate와 같은 추상 연산에서 먼저 MakeBasicObject를 호출하여 기초적인 기반 객체를 얻은 뒤, 그 객체의 내부 메서드 일부 또는 전부를 재정의함으로써 생성된다. exotic object 생성을 캡슐화하기 위해, 객체의 essential internal methods는 그러한 연산들 밖에서는 결코 수정되지 않는다.

7.3.2 Get ( obj, propertyKey )

The abstract operation Get takes arguments obj (an Object) and propertyKey (a property key) and returns either a normal completion containing an ECMAScript language value or a throw completion. 이것은 객체의 특정 프로퍼티 값을 검색하는 데 사용된다. It performs the following steps when called:

  1. obj.[[Get]](propertyKey, obj)를 반환한다.

7.3.3 GetV ( value, propertyKey )

The abstract operation GetV takes arguments value (an ECMAScript language value) and propertyKey (a property key) and returns either a normal completion containing an ECMAScript language value or a throw completion. 이것은 ECMAScript 언어 값의 특정 프로퍼티 값을 검색하는 데 사용된다. 값이 객체가 아니면, 프로퍼티 조회는 그 값의 타입에 적합한 래퍼 객체를 사용하여 수행된다. It performs the following steps when called:

  1. obj를 ? ToObject(value)라고 하자.
  2. obj.[[Get]](propertyKey, value)를 반환한다.

7.3.4 Set ( obj, propertyKey, value, throw )

The abstract operation Set takes arguments obj (an Object), propertyKey (a property key), value (an ECMAScript language value), and throw (a Boolean) and returns either a normal completion containing unused or a throw completion. 이것은 객체의 특정 프로퍼티 값을 설정하는 데 사용된다. value는 그 프로퍼티의 새 값이다. It performs the following steps when called:

  1. success를 ? obj.[[Set]](propertyKey, value, obj)라고 하자.
  2. successfalse이고 throwtrue이면, TypeError 예외를 던진다.
  3. unused를 반환한다.

7.3.5 CreateDataProperty ( obj, propertyKey, value )

The abstract operation CreateDataProperty takes arguments obj (an Object), propertyKey (a property key), and value (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. 이것은 객체의 새로운 own 프로퍼티를 생성하는 데 사용된다. It performs the following steps when called:

  1. newDesc를 PropertyDescriptor { [[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }라고 하자.
  2. obj.[[DefineOwnProperty]](propertyKey, newDesc)를 반환한다.
Note

추상 연산은 ECMAScript 언어 할당 연산자가 생성하는 프로퍼티에 사용되는 것과 동일한 기본 속성을 가진 프로퍼티를 생성한다. 일반적으로 그 프로퍼티는 아직 존재하지 않을 것이다. 만약 이미 존재하고 configurable이 아니거나 obj가 extensible하지 않다면, [[DefineOwnProperty]]false를 반환할 것이다.

7.3.6 CreateDataPropertyOrThrow ( obj, propertyKey, value )

The abstract operation CreateDataPropertyOrThrow takes arguments obj (an Object), propertyKey (a property key), and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. 이것은 객체의 새로운 own 프로퍼티를 생성하는 데 사용된다. 요청된 프로퍼티 갱신을 수행할 수 없으면 TypeError 예외를 던진다. It performs the following steps when called:

  1. success를 ? CreateDataProperty(obj, propertyKey, value)라고 하자.
  2. successfalse이면, TypeError 예외를 던진다.
  3. unused를 반환한다.
Note

추상 연산은 ECMAScript 언어 할당 연산자가 생성하는 프로퍼티에 사용되는 것과 동일한 기본 속성을 가진 프로퍼티를 생성한다. 일반적으로 그 프로퍼티는 아직 존재하지 않을 것이다. 만약 이미 존재하고 configurable이 아니거나 obj가 extensible하지 않다면, [[DefineOwnProperty]]false를 반환하여 이 연산이 TypeError 예외를 던지게 한다.

7.3.7 CreateNonEnumerableDataPropertyOrThrow ( obj, propertyKey, value )

The abstract operation CreateNonEnumerableDataPropertyOrThrow takes arguments obj (an Object), propertyKey (a property key), and value (an ECMAScript language value) and returns unused. 이것은 ordinary object의 새로운 non-enumerable own 프로퍼티를 생성하는 데 사용된다. It performs the following steps when called:

  1. Assert: obj는 ordinary하고 extensible하며 non-configurable 프로퍼티를 가지지 않는 객체이다.
  2. newDesc를 PropertyDescriptor { [[Value]]: value, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }라고 하자.
  3. DefinePropertyOrThrow(obj, propertyKey, newDesc)를 수행한다.
  4. unused를 반환한다.
Note

추상 연산은 ECMAScript 언어 할당 연산자가 생성하는 프로퍼티에 사용되는 것과 동일한 기본 속성을 가지되 enumerable하지 않은 프로퍼티를 생성한다. 일반적으로 그 프로퍼티는 아직 존재하지 않을 것이다. 만약 존재하더라도, DefinePropertyOrThrow는 정상적으로 완료됨이 보장된다.

7.3.8 DefinePropertyOrThrow ( obj, propertyKey, desc )

The abstract operation DefinePropertyOrThrow takes arguments obj (an Object), propertyKey (a property key), and desc (a Property Descriptor) and returns either a normal completion containing unused or a throw completion. 이것은 객체의 [[DefineOwnProperty]] 내부 메서드를, 요청된 프로퍼티 갱신을 수행할 수 없으면 TypeError 예외를 던지는 방식으로 호출하는 데 사용된다. It performs the following steps when called:

  1. success를 ? obj.[[DefineOwnProperty]](propertyKey, desc)라고 하자.
  2. successfalse이면, TypeError 예외를 던진다.
  3. unused를 반환한다.

7.3.9 DeletePropertyOrThrow ( obj, propertyKey )

The abstract operation DeletePropertyOrThrow takes arguments obj (an Object) and propertyKey (a property key) and returns either a normal completion containing unused or a throw completion. 이것은 객체의 특정 own 프로퍼티를 제거하는 데 사용된다. 프로퍼티가 configurable하지 않으면 예외를 던진다. It performs the following steps when called:

  1. success를 ? obj.[[Delete]](propertyKey)라고 하자.
  2. successfalse이면, TypeError 예외를 던진다.
  3. unused를 반환한다.

7.3.10 GetMethod ( value, propertyKey )

The abstract operation GetMethod takes arguments value (an ECMAScript language value) and propertyKey (a property key) and returns either a normal completion containing either a function object or undefined, or a throw completion. 이것은 ECMAScript 언어 값의 특정 프로퍼티 값을 얻는 데 사용되며, 그 프로퍼티 값은 함수일 것으로 기대된다. It performs the following steps when called:

  1. func를 ? GetV(value, propertyKey)라고 하자.
  2. funcundefined 또는 null이면, undefined를 반환한다.
  3. IsCallable(func)가 false이면, TypeError 예외를 던진다.
  4. func를 반환한다.

7.3.11 HasProperty ( obj, propertyKey )

The abstract operation HasProperty takes arguments obj (an Object) and propertyKey (a property key) and returns either a normal completion containing a Boolean or a throw completion. 이것은 객체가 지정된 property key를 가진 프로퍼티를 가지는지 결정하는 데 사용된다. 그 프로퍼티는 own일 수도 있고 상속된 것일 수도 있다. It performs the following steps when called:

  1. obj.[[HasProperty]](propertyKey)를 반환한다.

7.3.12 HasOwnProperty ( obj, propertyKey )

The abstract operation HasOwnProperty takes arguments obj (an Object) and propertyKey (a property key) and returns either a normal completion containing a Boolean or a throw completion. 이것은 객체가 지정된 property key를 가진 own 프로퍼티를 가지는지 결정하는 데 사용된다. It performs the following steps when called:

  1. desc를 ? obj.[[GetOwnProperty]](propertyKey)라고 하자.
  2. descundefined이면, false를 반환한다.
  3. true를 반환한다.

7.3.13 Call ( func, thisValue [ , argumentsList ] )

The abstract operation Call takes arguments func (an ECMAScript language value) and thisValue (an ECMAScript language value) and optional argument argumentsList (a List of ECMAScript language values) and returns either a normal completion containing an ECMAScript language value or a throw completion. 이것은 함수 객체의 [[Call]] 내부 메서드를 호출하는 데 사용된다. func는 함수 객체이고, thisValue[[Call]]this 값이 되는 ECMAScript 언어 값이며, argumentsList는 내부 메서드의 대응 인수에 전달되는 값이다. argumentsList가 존재하지 않으면, 새로운 빈 List가 그 값으로 사용된다. It performs the following steps when called:

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

7.3.14 Construct ( constructor [ , argumentsList [ , newTarget ] ] )

The abstract operation Construct takes argument constructor (a constructor) and optional arguments argumentsList (a List of ECMAScript language values) and newTarget (a constructor) and returns either a normal completion containing an Object or a throw completion. 이것은 함수 객체의 [[Construct]] 내부 메서드를 호출하는 데 사용된다. argumentsListnewTarget은 내부 메서드의 대응 인수로 전달될 값들이다. argumentsList가 존재하지 않으면, 새로운 빈 List가 그 값으로 사용된다. newTarget이 존재하지 않으면, constructor가 그 값으로 사용된다. It performs the following steps when called:

  1. newTarget이 존재하지 않으면, newTargetconstructor로 설정한다.
  2. argumentsList가 존재하지 않으면, argumentsList를 새로운 빈 List로 설정한다.
  3. constructor.[[Construct]](argumentsList, newTarget)를 반환한다.
Note

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

7.3.15 SetIntegrityLevel ( obj, level )

The abstract operation SetIntegrityLevel takes arguments obj (an Object) and level (sealed or frozen) and returns either a normal completion containing a Boolean or a throw completion. 이것은 객체의 own 프로퍼티 집합을 고정하는 데 사용된다. It performs the following steps when called:

  1. status를 ? obj.[[PreventExtensions]]()라고 하자.
  2. statusfalse이면, false를 반환한다.
  3. keys를 ? obj.[[OwnPropertyKeys]]()라고 하자.
  4. levelsealed이면,
    1. keys의 각 요소 key에 대해, 다음을 수행한다.
      1. DefinePropertyOrThrow(obj, key, PropertyDescriptor { [[Configurable]]: false })를 수행한다.
  5. 그렇지 않으면,
    1. Assert: levelfrozen이다.
    2. keys의 각 요소 key에 대해, 다음을 수행한다.
      1. currentDesc를 ? obj.[[GetOwnProperty]](key)라고 하자.
      2. currentDescundefined가 아니면,
        1. IsAccessorDescriptor(currentDesc)가 true이면,
          1. desc를 PropertyDescriptor { [[Configurable]]: false }라고 하자.
        2. 그렇지 않으면,
          1. desc를 PropertyDescriptor { [[Configurable]]: false, [[Writable]]: false }라고 하자.
        3. DefinePropertyOrThrow(obj, key, desc)를 수행한다.
  6. true를 반환한다.

7.3.16 TestIntegrityLevel ( obj, level )

The abstract operation TestIntegrityLevel takes arguments obj (an Object) and level (sealed or frozen) and returns either a normal completion containing a Boolean or a throw completion. 이것은 객체의 own 프로퍼티 집합이 고정되어 있는지 결정하는 데 사용된다. It performs the following steps when called:

  1. extensible을 ? IsExtensible(obj)라고 하자.
  2. extensibletrue이면, false를 반환한다.
  3. NOTE: 객체가 extensible이면, 그 어떤 프로퍼티도 검사되지 않는다.
  4. keys를 ? obj.[[OwnPropertyKeys]]()라고 하자.
  5. keys의 각 요소 key에 대해, 다음을 수행한다.
    1. currentDesc를 ? obj.[[GetOwnProperty]](key)라고 하자.
    2. currentDescundefined가 아니면,
      1. currentDesc.[[Configurable]]true이면, false를 반환한다.
      2. levelfrozen이고 IsDataDescriptor(currentDesc)가 true이면,
        1. currentDesc.[[Writable]]true이면, false를 반환한다.
  6. true를 반환한다.

7.3.17 CreateArrayFromList ( elements )

The abstract operation CreateArrayFromList takes argument elements (a List of ECMAScript language values) and returns an Array. 이것은 elements가 제공하는 요소들을 가진 Array를 생성하는 데 사용된다. It performs the following steps when called:

  1. array를 ! ArrayCreate(0)라고 하자.
  2. n을 0이라고 하자.
  3. elements의 각 요소 e에 대해, 다음을 수행한다.
    1. CreateDataPropertyOrThrow(array, ! ToString(𝔽(n)), e)를 수행한다.
    2. nn + 1로 설정한다.
  4. array를 반환한다.

7.3.18 LengthOfArrayLike ( obj )

The abstract operation LengthOfArrayLike takes argument obj (an Object) and returns either a normal completion containing a non-negative integer or a throw completion. 이것은 배열 유사 객체의 "length" 프로퍼티 값을 반환한다. It performs the following steps when called:

  1. (? ToLength(? Get(obj, "length")))를 반환한다.

이 연산이 정상 완료를 반환하는 모든 객체를 array-like object라고 한다.

Note 1
일반적으로 array-like object는 integer index 이름을 가진 일부 프로퍼티도 가질 것이다. 그러나 그것은 이 정의의 요구 사항은 아니다.
Note 2
Array와 String 객체는 array-like object의 예이다.

7.3.19 CreateListFromArrayLike ( obj [ , validElementTypes ] )

The abstract operation CreateListFromArrayLike takes argument obj (an ECMAScript language value) and optional argument validElementTypes (all or property-key) and returns either a normal completion containing a List of ECMAScript language values or a throw completion. 이것은 obj의 인덱스된 프로퍼티들이 제공하는 요소들로 구성된 List 값을 생성하는 데 사용된다. validElementTypes는 요소로 허용되는 값의 타입들을 나타낸다. It performs the following steps when called:

  1. validElementTypes가 존재하지 않으면, validElementTypesall로 설정한다.
  2. obj가 Object가 아니면, TypeError 예외를 던진다.
  3. len을 ? LengthOfArrayLike(obj)라고 하자.
  4. list를 새로운 빈 List라고 하자.
  5. index를 0이라고 하자.
  6. index < len인 동안, 다음을 반복한다.
    1. indexName을 ! ToString(𝔽(index))라고 하자.
    2. next를 ? Get(obj, indexName)이라고 하자.
    3. validElementTypesproperty-key이고 next가 property key가 아니면, TypeError 예외를 던진다.
    4. nextlist에 추가한다.
    5. indexindex + 1로 설정한다.
  7. list를 반환한다.

7.3.20 Invoke ( value, propertyKey [ , argumentsList ] )

The abstract operation Invoke takes arguments value (an ECMAScript language value) and propertyKey (a property key) and optional argument argumentsList (a List of ECMAScript language values) and returns either a normal completion containing an ECMAScript language value or a throw completion. 이것은 ECMAScript 언어 값의 메서드 프로퍼티를 호출하는 데 사용된다. value는 프로퍼티 조회 지점이자 호출의 this 값 역할을 모두 한다. argumentsList는 메서드에 전달되는 인수 값들의 목록이다. argumentsList가 존재하지 않으면, 새로운 빈 List가 그 값으로 사용된다. It performs the following steps when called:

  1. argumentsList가 존재하지 않으면, argumentsList를 새로운 빈 List로 설정한다.
  2. func를 ? GetV(value, propertyKey)라고 하자.
  3. Call(func, value, argumentsList)를 반환한다.

7.3.21 OrdinaryHasInstance ( constructor, instance )

The abstract operation OrdinaryHasInstance takes arguments constructor (an ECMAScript language value) and instance (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. 이것은 instanceconstructor가 제공하는 인스턴스 객체 상속 경로를 상속하는지를 결정하는 기본 알고리즘을 구현한다. It performs the following steps when called:

  1. IsCallable(constructor)가 false이면, false를 반환한다.
  2. constructor[[BoundTargetFunction]] 내부 슬롯을 가지면,
    1. boundConstructorconstructor.[[BoundTargetFunction]]라고 하자.
    2. InstanceofOperator(instance, boundConstructor)를 반환한다.
  3. instance가 Object가 아니면, false를 반환한다.
  4. proto를 ? Get(constructor, "prototype")이라고 하자.
  5. proto가 Object가 아니면, TypeError 예외를 던진다.
  6. 다음을 반복한다.
    1. instance를 ? instance.[[GetPrototypeOf]]()로 설정한다.
    2. instancenull이면, false를 반환한다.
    3. SameValue(proto, instance)가 true이면, true를 반환한다.

7.3.22 SpeciesConstructor ( obj, defaultConstructor )

The abstract operation SpeciesConstructor takes arguments obj (an Object) and defaultConstructor (a constructor) and returns either a normal completion containing a constructor or a throw completion. 이것은 obj에서 파생되는 새 객체를 생성하는 데 사용되어야 할 생성자를 검색하는 데 사용된다. defaultConstructorobj에서부터 시작해 생성자 %Symbol.species% 프로퍼티를 찾을 수 없을 때 사용할 생성자이다. It performs the following steps when called:

  1. constructor를 ? Get(obj, "constructor")라고 하자.
  2. constructorundefined이면, defaultConstructor를 반환한다.
  3. constructor가 Object가 아니면, TypeError 예외를 던진다.
  4. species를 ? Get(constructor, %Symbol.species%)라고 하자.
  5. speciesundefined 또는 null 중 하나이면, defaultConstructor를 반환한다.
  6. IsConstructor(species)가 true이면, species를 반환한다.
  7. TypeError 예외를 던진다.

7.3.23 EnumerableOwnProperties ( obj, kind )

The abstract operation EnumerableOwnProperties takes arguments obj (an Object) and kind (key, value, or key+value) and returns either a normal completion containing a List of ECMAScript language values or a throw completion. It performs the following steps when called:

  1. ownKeys를 ? obj.[[OwnPropertyKeys]]()라고 하자.
  2. results를 새로운 빈 List라고 하자.
  3. ownKeys의 각 요소 key에 대해, 다음을 수행한다.
    1. key가 String이면,
      1. desc를 ? obj.[[GetOwnProperty]](key)라고 하자.
      2. descundefined가 아니고 desc.[[Enumerable]]true이면,
        1. kindkey이면,
          1. keyresults에 추가한다.
        2. 그렇지 않으면,
          1. value를 ? Get(obj, key)라고 하자.
          2. kindvalue이면,
            1. valueresults에 추가한다.
          3. 그렇지 않으면,
            1. Assert: kindkey+value이다.
            2. entryCreateArrayFromListkey, value »)라고 하자.
            3. entryresults에 추가한다.
  4. results를 반환한다.

7.3.24 GetFunctionRealm ( func )

The abstract operation GetFunctionRealm takes argument func (a function object) and returns either a normal completion containing a Realm Record or a throw completion. It performs the following steps when called:

  1. func[[Realm]] 내부 슬롯을 가지면,
    1. func.[[Realm]]을 반환한다.
  2. func가 bound function exotic object이면,
    1. boundTargetFunctionfunc.[[BoundTargetFunction]]이라고 하자.
    2. GetFunctionRealm(boundTargetFunction)을 반환한다.
  3. func가 Proxy exotic object이면,
    1. ValidateNonRevokedProxy(func)를 수행한다.
    2. proxyTargetfunc.[[ProxyTarget]]이라고 하자.
    3. Assert: proxyTargetfunction object이다.
    4. GetFunctionRealm(proxyTarget)을 반환한다.
  4. 현재 Realm Record를 반환한다.
Note

단계 4func[[Realm]] 내부 슬롯을 가지지 않는 비표준 function exotic object인 경우에만 도달하게 된다.

7.3.25 CopyDataProperties ( target, source, excludedItems )

The abstract operation CopyDataProperties takes arguments target (an Object), source (an ECMAScript language value), and excludedItems (a List of property keys) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. sourceundefined 또는 null 중 하나이면, unused를 반환한다.
  2. from을 ! ToObject(source)라고 하자.
  3. keys를 ? from.[[OwnPropertyKeys]]()라고 하자.
  4. keys의 각 요소 nextKey에 대해, 다음을 수행한다.
    1. excludedfalse라고 하자.
    2. excludedItems의 각 요소 e에 대해, 다음을 수행한다.
      1. SameValue(e, nextKey)가 true이면,
        1. excludedtrue로 설정한다.
    3. excludedfalse이면,
      1. desc를 ? from.[[GetOwnProperty]](nextKey)라고 하자.
      2. descundefined가 아니고 desc.[[Enumerable]]true이면,
        1. propValue를 ? Get(from, nextKey)라고 하자.
        2. CreateDataPropertyOrThrow(target, nextKey, propValue)를 수행한다.
  5. unused를 반환한다.
Note

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

7.3.26 PrivateElementFind ( obj, privateName )

The abstract operation PrivateElementFind takes arguments obj (an Object) and privateName (a Private Name) and returns a PrivateElement or empty. It performs the following steps when called:

  1. obj.[[PrivateElements]]pe.[[Key]]privateNamePrivateElement pe를 포함하면,
    1. pe를 반환한다.
  2. empty를 반환한다.

7.3.27 PrivateFieldAdd ( obj, privateName, value )

The abstract operation PrivateFieldAdd takes arguments obj (an Object), privateName (a Private Name), and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. 호스트가 웹 브라우저이면,
    1. HostEnsureCanAddPrivateElement(obj)를 수행한다.
  2. entryPrivateElementFind(obj, privateName)라고 하자.
  3. entryempty가 아니면, TypeError 예외를 던진다.
  4. PrivateElement { [[Key]]: privateName, [[Kind]]: field, [[Value]]: value }를 obj.[[PrivateElements]]에 추가한다.
  5. unused를 반환한다.

7.3.28 PrivateMethodOrAccessorAdd ( obj, method )

The abstract operation PrivateMethodOrAccessorAdd takes arguments obj (an Object) and method (a PrivateElement) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. Assert: method.[[Kind]]method 또는 accessor 중 하나이다.
  2. 호스트가 웹 브라우저이면,
    1. HostEnsureCanAddPrivateElement(obj)를 수행한다.
  3. entryPrivateElementFind(obj, method.[[Key]])라고 하자.
  4. entryempty가 아니면, TypeError 예외를 던진다.
  5. methodobj.[[PrivateElements]]에 추가한다.
  6. unused를 반환한다.
Note

private method와 accessor의 값은 인스턴스 간에 공유된다. 이 연산은 method나 accessor의 새 복사본을 생성하지 않는다.

7.3.29 HostEnsureCanAddPrivateElement ( obj )

The host-defined abstract operation HostEnsureCanAddPrivateElement takes argument obj (an Object) and returns either a normal completion containing unused or a throw completion. 이것은 호스트 환경이 특정 호스트 정의 exotic object에 private element를 추가하는 것을 막을 수 있게 한다.

HostEnsureCanAddPrivateElement의 구현은 다음 요구 사항을 준수해야 한다.

HostEnsureCanAddPrivateElement의 기본 구현은 NormalCompletion(unused)를 반환하는 것이다.

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

7.3.30 PrivateGet ( obj, privateName )

The abstract operation PrivateGet takes arguments obj (an Object) and privateName (a Private Name) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. entryPrivateElementFind(obj, privateName)라고 하자.
  2. entryempty이면, TypeError 예외를 던진다.
  3. entry.[[Kind]]field 또는 method 중 하나이면,
    1. entry.[[Value]]를 반환한다.
  4. Assert: entry.[[Kind]]accessor이다.
  5. entry.[[Get]]undefined이면, TypeError 예외를 던진다.
  6. getterentry.[[Get]]이라고 하자.
  7. Call(getter, obj)를 반환한다.

7.3.31 PrivateSet ( obj, privateName, value )

The abstract operation PrivateSet takes arguments obj (an Object), privateName (a Private Name), and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. entryPrivateElementFind(obj, privateName)라고 하자.
  2. entryempty이면, TypeError 예외를 던진다.
  3. entry.[[Kind]]method이면, TypeError 예외를 던진다.
  4. entry.[[Kind]]field이면,
    1. entry.[[Value]]value로 설정한다.
  5. 그렇지 않으면,
    1. Assert: entry.[[Kind]]accessor이다.
    2. entry.[[Set]]undefined이면, TypeError 예외를 던진다.
    3. setterentry.[[Set]]이라고 하자.
    4. Call(setter, obj, « value »)를 수행한다.
  6. unused를 반환한다.

7.3.32 DefineField ( receiver, fieldRecord )

The abstract operation DefineField takes arguments receiver (an Object) and fieldRecord (a ClassFieldDefinition Record) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. fieldNamefieldRecord.[[Name]]이라고 하자.
  2. initializerfieldRecord.[[Initializer]]라고 하자.
  3. initializerempty가 아니면,
    1. initValue를 ? Call(initializer, receiver)라고 하자.
  4. 그렇지 않으면,
    1. initValueundefined라고 하자.
  5. fieldNamePrivate Name이면,
    1. PrivateFieldAdd(receiver, fieldName, initValue)를 수행한다.
  6. 그렇지 않으면,
    1. Assert: fieldName은 property key이다.
    2. CreateDataPropertyOrThrow(receiver, fieldName, initValue)를 수행한다.
  7. unused를 반환한다.

7.3.33 InitializeInstanceElements ( obj, constructor )

The abstract operation InitializeInstanceElements takes arguments obj (an Object) and constructor (an ECMAScript function object or a built-in function object) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. methodsconstructor.[[PrivateMethods]]라고 하자.
  2. methods의 각 PrivateElement method에 대해, 다음을 수행한다.
    1. PrivateMethodOrAccessorAdd(obj, method)를 수행한다.
  3. fieldsconstructor.[[Fields]]라고 하자.
  4. fields의 각 요소 fieldRecord에 대해, 다음을 수행한다.
    1. DefineField(obj, fieldRecord)를 수행한다.
  5. unused를 반환한다.

7.3.34 AddValueToKeyedGroup ( groups, key, value )

The abstract operation AddValueToKeyedGroup takes arguments groups (a List of Records with fields [[Key]] (an ECMAScript language value) and [[Elements]] (a List of ECMAScript language values)), key (an ECMAScript language value), and value (an ECMAScript language value) and returns unused. It performs the following steps when called:

  1. groups의 각 Record { [[Key]], [[Elements]] } group에 대해, 다음을 수행한다.
    1. SameValue(group.[[Key]], key)가 true이면,
      1. Assert: 정확히 하나의 groups 원소만 이 기준을 만족한다.
      2. valuegroup.[[Elements]]에 추가한다.
      3. unused를 반환한다.
  2. groupRecord { [[Key]]: key, [[Elements]]: « value » }라고 하자.
  3. groupgroups에 추가한다.
  4. unused를 반환한다.

7.3.35 GroupBy ( items, callback, keyCoercion )

The abstract operation GroupBy takes arguments items (an ECMAScript language value), callback (an ECMAScript language value), and keyCoercion (property or collection) and returns either a normal completion containing a List of Records with fields [[Key]] (an ECMAScript language value) and [[Elements]] (a List of ECMAScript language values), or a throw completion. It performs the following steps when called:

  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. errorThrowCompletion(새로 생성된 TypeError 객체)라고 하자.
      2. IteratorClose(iteratorRecord, error)를 반환한다.
    2. next를 ? IteratorStepValue(iteratorRecord)라고 하자.
    3. nextdone이면,
      1. groups를 반환한다.
    4. valuenext라고 하자.
    5. keyCompletion(Call(callback, undefined, « value, 𝔽(k) »))라고 하자.
    6. IfAbruptCloseIterator(key, iteratorRecord).
    7. keyCoercionproperty이면,
      1. keyCompletion(ToPropertyKey(key))로 설정한다.
      2. IfAbruptCloseIterator(key, iteratorRecord).
    8. 그렇지 않으면,
      1. Assert: keyCoercioncollection이다.
      2. keyCanonicalizeKeyedCollectionKey(key)로 설정한다.
    9. AddValueToKeyedGroup(groups, key, value)를 수행한다.
    10. kk + 1로 설정한다.

7.3.36 GetOptionsObject ( options )

The abstract operation GetOptionsObject takes argument options (an ECMAScript language value) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:

  1. optionsundefined이면,
    1. OrdinaryObjectCreate(null)를 반환한다.
  2. options가 Object이면,
    1. options를 반환한다.
  3. TypeError 예외를 던진다.

7.3.37 SetterThatIgnoresPrototypeProperties ( thisValue, home, propertyKey, value )

The abstract operation SetterThatIgnoresPrototypeProperties takes arguments thisValue (an ECMAScript language value), home (an Object), propertyKey (a property key), and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. thisValue가 Object가 아니면,
    1. TypeError 예외를 던진다.
  2. SameValue(thisValue, home)가 true이면,
    1. NOTE: 여기서 던지는 것은 strict mode 코드에서 home 객체의 non-writable 데이터 프로퍼티에 대한 할당을 흉내 낸다.
    2. TypeError 예외를 던진다.
  3. desc를 ? thisValue.[[GetOwnProperty]](propertyKey)라고 하자.
  4. descundefined이면,
    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 Recorditerator 또는 async iteratornext 메서드를 함께 캡슐화하는 데 사용되는 Record 값이다.

Iterator Record는 Table 13에 나열된 필드를 가진다.

Table 13: Iterator Record Fields
필드 이름 의미
[[Iterator]] Object iterator 인터페이스 또는 async iterator 인터페이스에 부합하는 객체.
[[NextMethod]] ECMAScript 언어 값 [[Iterator]] 객체의 next 메서드.
[[Done]] Boolean iterator가 완료되었거나 닫혔는지 여부.

7.4.2 GetIteratorDirect ( obj )

The abstract operation GetIteratorDirect takes argument obj (an Object) and returns either a normal completion containing an Iterator Record or a throw completion. It performs the following steps when called:

  1. nextMethod를 ? Get(obj, "next")라고 하자.
  2. iteratorRecordIterator Record { [[Iterator]]: obj, [[NextMethod]]: nextMethod, [[Done]]: false }라고 하자.
  3. iteratorRecord를 반환한다.

7.4.3 GetIteratorFromMethod ( obj, method )

The abstract operation GetIteratorFromMethod takes arguments obj (an ECMAScript language value) and method (a function object) and returns either a normal completion containing an Iterator Record or a throw completion. It performs the following steps when called:

  1. iterator를 ? Call(method, obj)라고 하자.
  2. iterator가 Object가 아니면, TypeError 예외를 던진다.
  3. GetIteratorDirect(iterator)를 반환한다.

7.4.4 GetIterator ( obj, kind )

The abstract operation GetIterator takes arguments obj (an ECMAScript language value) and kind (sync or async) and returns either a normal completion containing an Iterator Record or a throw completion. It performs the following steps when called:

  1. kindasync이면,
    1. method를 ? GetMethod(obj, %Symbol.asyncIterator%)라고 하자.
    2. methodundefined이면,
      1. syncMethod를 ? GetMethod(obj, %Symbol.iterator%)라고 하자.
      2. syncMethodundefined이면, TypeError 예외를 던진다.
      3. syncIteratorRecord를 ? GetIteratorFromMethod(obj, syncMethod)라고 하자.
      4. CreateAsyncFromSyncIterator(syncIteratorRecord)를 반환한다.
  2. 그렇지 않으면,
    1. method를 ? GetMethod(obj, %Symbol.iterator%)라고 하자.
  3. methodundefined이면, TypeError 예외를 던진다.
  4. GetIteratorFromMethod(obj, method)를 반환한다.

7.4.5 GetIteratorFlattenable ( obj, primitiveHandling )

The abstract operation GetIteratorFlattenable takes arguments obj (an ECMAScript language value) and primitiveHandling (iterate-string-primitives or reject-primitives) and returns either a normal completion containing an Iterator Record or a throw completion. It performs the following steps when called:

  1. obj가 Object가 아니면,
    1. primitiveHandlingreject-primitives이면, TypeError 예외를 던진다.
    2. Assert: primitiveHandlingiterate-string-primitives이다.
    3. obj가 String이 아니면, TypeError 예외를 던진다.
  2. method를 ? GetMethod(obj, %Symbol.iterator%)라고 하자.
  3. methodundefined이면,
    1. iteratorobj라고 하자.
  4. 그렇지 않으면,
    1. iterator를 ? Call(method, obj)라고 하자.
  5. iterator가 Object가 아니면, TypeError 예외를 던진다.
  6. GetIteratorDirect(iterator)를 반환한다.

7.4.6 IteratorNext ( iteratorRecord [ , value ] )

The abstract operation IteratorNext takes argument iteratorRecord (an Iterator Record) and optional argument value (an ECMAScript language value) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:

  1. value가 존재하지 않으면,
    1. resultCompletion(Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]]))라고 하자.
  2. 그렇지 않으면,
    1. resultCompletion(Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]], « value »))라고 하자.
  3. resultthrow completion이면,
    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 )

The abstract operation IteratorComplete takes argument iteratorResult (an Object) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. ToBoolean(? Get(iteratorResult, "done"))를 반환한다.

7.4.8 IteratorValue ( iteratorResult )

The abstract operation IteratorValue takes argument iteratorResult (an Object) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. Get(iteratorResult, "value")를 반환한다.

7.4.9 IteratorStep ( iteratorRecord )

The abstract operation IteratorStep takes argument iteratorRecord (an Iterator Record) and returns either a normal completion containing either an Object or done, or a throw completion. 이것은 iteratorRecord.[[Iterator]]로부터 다음 값을 요청하기 위해 iteratorRecord.[[NextMethod]]를 호출하고, iterator가 끝에 도달했음을 나타내는 done 또는 다음 값이 사용 가능하다면 IteratorResult 객체를 반환한다. It performs the following steps when called:

  1. result를 ? IteratorNext(iteratorRecord)라고 하자.
  2. doneCompletion(IteratorComplete(result))라고 하자.
  3. donethrow completion이면,
    1. iteratorRecord.[[Done]]true로 설정한다.
    2. done을 반환한다.
  4. done을 ! done으로 설정한다.
  5. donetrue이면,
    1. iteratorRecord.[[Done]]true로 설정한다.
    2. done을 반환한다.
  6. result를 반환한다.

7.4.10 IteratorStepValue ( iteratorRecord )

The abstract operation IteratorStepValue takes argument iteratorRecord (an Iterator Record) and returns either a normal completion containing either an ECMAScript language value or done, or a throw completion. 이것은 iteratorRecord.[[Iterator]]로부터 다음 값을 요청하기 위해 iteratorRecord.[[NextMethod]]를 호출하고, iterator가 끝에 도달했음을 나타내는 done 또는 다음 값이 사용 가능하다면 IteratorResult 객체의 값을 반환한다. It performs the following steps when called:

  1. result를 ? IteratorStep(iteratorRecord)라고 하자.
  2. resultdone이면,
    1. done을 반환한다.
  3. valueCompletion(IteratorValue(result))라고 하자.
  4. valuethrow completion이면,
    1. iteratorRecord.[[Done]]true로 설정한다.
  5. value를 반환한다.

7.4.11 IteratorClose ( iteratorRecord, completion )

The abstract operation IteratorClose takes arguments iteratorRecord (an Iterator Record) and completion (a Completion Record) and returns a Completion Record. 이것은 iterator에게, 완료 상태에 도달했을 때 통상 수행했을 동작을 수행해야 함을 알리는 데 사용된다. It performs the following steps when called:

  1. Assert: iteratorRecord.[[Iterator]]는 Object이다.
  2. iteratoriteratorRecord.[[Iterator]]라고 하자.
  3. innerResultCompletion(GetMethod(iterator, "return"))라고 하자.
  4. innerResultnormal completion이면,
    1. returninnerResult.[[Value]]라고 하자.
    2. returnundefined이면, ? completion을 반환한다.
    3. innerResultCompletion(Call(return, iterator))로 설정한다.
  5. completionthrow completion이면, ? completion을 반환한다.
  6. innerResultthrow completion이면, ? innerResult를 반환한다.
  7. innerResult.[[Value]]가 Object가 아니면, TypeError 예외를 던진다.
  8. completion을 반환한다.

7.4.12 IteratorCloseAll ( iters, completion )

The abstract operation IteratorCloseAll takes arguments iters (a List of Iterator Records) and completion (a Completion Record) and returns a Completion Record. It performs the following steps when called:

  1. iters의 각 요소 iter에 대해, List의 역순으로 다음을 수행한다.
    1. completionCompletion(IteratorClose(iter, completion))로 설정한다.
  2. completion을 반환한다.

7.4.13 IfAbruptCloseIterator ( value, iteratorRecord )

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

  1. IfAbruptCloseIterator(value, iteratorRecord).

은 다음과 같은 의미이다:

  1. Assert: valueCompletion Record이다.
  2. valueabrupt completion이면, ? IteratorClose(iteratorRecord, value)를 반환한다.
  3. value를 ! value로 설정한다.

7.4.14 AsyncIteratorClose ( iteratorRecord, completion )

The abstract operation AsyncIteratorClose takes arguments iteratorRecord (an Iterator Record) and completion (a Completion Record) and returns a Completion Record. 이것은 async iterator에게, 완료 상태에 도달했을 때 통상 수행했을 동작을 수행해야 함을 알리는 데 사용된다. It performs the following steps when called:

  1. Assert: iteratorRecord.[[Iterator]]는 Object이다.
  2. iteratoriteratorRecord.[[Iterator]]라고 하자.
  3. innerResultCompletion(GetMethod(iterator, "return"))라고 하자.
  4. innerResultnormal completion이면,
    1. returninnerResult.[[Value]]라고 하자.
    2. returnundefined이면, ? completion을 반환한다.
    3. innerResultCompletion(Call(return, iterator))로 설정한다.
    4. innerResultnormal completion이면, innerResultCompletion(Await(innerResult.[[Value]]))로 설정한다.
  5. completionthrow completion이면, ? completion을 반환한다.
  6. innerResultthrow completion이면, ? innerResult를 반환한다.
  7. innerResult.[[Value]]가 Object가 아니면, TypeError 예외를 던진다.
  8. completion을 반환한다.

7.4.15 IfAbruptCloseAsyncIterator ( value, iteratorRecord )

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

  1. IfAbruptCloseAsyncIterator(value, iteratorRecord).

은 다음과 같은 의미이다:

  1. Assert: valueCompletion Record이다.
  2. valueabrupt completion이면, ? AsyncIteratorClose(iteratorRecord, value)를 반환한다.
  3. value를 ! value로 설정한다.

7.4.16 CreateIteratorResultObject ( value, done )

The abstract operation CreateIteratorResultObject takes arguments value (an ECMAScript language value) and done (a Boolean) and returns an Object that conforms to the IteratorResult interface. 이것은 IteratorResult 인터페이스에 부합하는 객체를 생성한다. It performs the following steps when called:

  1. objOrdinaryObjectCreate(%Object.prototype%)라고 하자.
  2. CreateDataPropertyOrThrow(obj, "value", value)를 수행한다.
  3. CreateDataPropertyOrThrow(obj, "done", done)를 수행한다.
  4. obj를 반환한다.

7.4.17 CreateListIteratorRecord ( list )

The abstract operation CreateListIteratorRecord takes argument list (a List of ECMAScript language values) and returns an Iterator Record. 이것은 [[NextMethod]]list의 연속된 요소를 반환하는 Iterator Record를 생성한다. It performs the following steps when called:

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

이 list iterator 객체는 ECMAScript 코드에서 직접 접근할 수 없다.

7.4.18 IteratorToList ( iteratorRecord )

The abstract operation IteratorToList takes argument iteratorRecord (an Iterator Record) and returns either a normal completion containing a List of ECMAScript language values or a throw completion. It performs the following steps when called:

  1. values를 새로운 빈 List라고 하자.
  2. 다음을 반복한다.
    1. next를 ? IteratorStepValue(iteratorRecord)라고 하자.
    2. nextdone이면,
      1. values를 반환한다.
    3. nextvalues에 추가한다.