6 ECMAScript 데이터 타입과 값

이 명세서의 알고리즘은 각각 타입이 연관된 값을 다룹니다. 가능한 값의 타입은 이 절에서 정의된 것들만 해당합니다. 타입은 ECMAScript 언어 타입과 명세 타입으로 분류됩니다.

6.1 ECMAScript 언어 타입

ECMAScript 언어 타입은 ECMAScript 프로그래머가 ECMAScript 언어를 통해 직접 다루는 값에 해당합니다. ECMAScript 언어 타입에는 Undefined, Null, Boolean, String, Symbol, Number, BigInt, Object가 있습니다. ECMAScript 언어 값은 ECMAScript 언어 타입에 의해 특징지어지는 값입니다.

6.1.1 Undefined 타입

Undefined 타입은 undefined라는 단 하나의 값만을 가집니다. 값이 할당되지 않은 변수는 undefined 값을 가집니다.

6.1.2 Null 타입

Null 타입은 null이라는 단 하나의 값만을 가집니다.

6.1.3 Boolean 타입

Boolean 타입truefalse라는 두 값을 가지는 논리적 개체를 나타냅니다.

6.1.4 String 타입

String 타입은 0개 이상의 16비트 부호 없는 정수값(“요소”)으로 이루어진 모든 순서 있는 시퀀스의 집합이며, 최대 길이는 253 - 1 요소까지입니다. String 타입은 일반적으로 ECMAScript 프로그램에서 텍스트 데이터를 표현하는 데 사용되며, 이 경우 String의 각 요소는 UTF-16 코드 유닛 값으로 간주됩니다. 각 요소는 시퀀스 내에서 위치를 가지며, 이 위치는 0 이상의 정수 인덱스로 지정됩니다. 첫 번째 요소(존재한다면)는 인덱스 0, 그 다음 요소는 인덱스 1 등입니다. String의 길이는 그 안에 포함된 요소(즉, 16비트 값)의 개수입니다. 빈 문자열은 길이가 0이며, 요소가 존재하지 않습니다.

String 내용을 해석하지 않는 ECMAScript 연산은 추가 의미를 적용하지 않습니다. String 값을 해석하는 연산은 각 요소를 단일 UTF-16 코드 유닛으로 취급합니다. 그러나 ECMAScript는 이 코드 유닛의 값이나 관계를 제한하지 않으므로, 추가적으로 String 내용을 UTF-16로 인코딩된 유니코드 코드 포인트 시퀀스로 해석하는 연산은 잘못된 하위 시퀀스를 고려해야 합니다. 이러한 연산은 다음 규칙에 따라 0xD800~0xDBFF(유니코드 표준에서 선행 서러게이트, 또는 high-surrogate 코드 유닛)와 0xDC00~0xDFFF(후행 서러게이트, 또는 low-surrogate 코드 유닛) 값을 특별 처리합니다:

String.prototype.normalize 함수(22.1.3.15)는 String 값을 명시적으로 정규화하는 데 사용할 수 있습니다. String.prototype.localeCompare(22.1.3.12)는 내부적으로 String 값을 정규화하지만, 다른 연산은 암묵적으로 문자열을 정규화하지 않습니다. 연산 결과가 언어 또는 로케일에 민감하지 않음이 별도로 명시되지 않는 한 적용됩니다.

Note

이 설계의 취지는 문자열 구현을 최대한 단순하고 고성능으로 유지하는 것이었습니다. ECMAScript 소스 텍스트가 Normalized Form C인 경우, 문자열 리터럴은 유니코드 이스케이프 시퀀스를 포함하지 않는 한 정규화가 보장됩니다.

이 명세서에서 "the string-concatenation of A, B, ..."라는 구문(각 인자가 String 값, 코드 유닛, 또는 코드 유닛 시퀀스임)은 인자 각각의 코드 유닛을 차례로 이어붙인 시퀀스로 구성된 String 값을 의미합니다.

"the substring of S from inclusiveStart to exclusiveEnd"(여기서 S는 String 값 또는 코드 유닛 시퀀스, inclusiveStartexclusiveEnd는 정수)라는 구문은 inclusiveStart 인덱스에서 시작하여 exclusiveEnd 바로 앞까지 연속된 코드 유닛으로 구성된 String 값을 의미합니다(inclusiveStart = exclusiveEnd이면 빈 문자열). "to" 접미사가 생략된 경우, S의 길이가 exclusiveEnd로 사용됩니다.

"ASCII word characters"라는 구문은 다음 String 값을 의미하며, 이는 유니코드 Basic Latin 블록 내 모든 문자와 숫자, U+005F(LOW LINE)만으로 구성됩니다:
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_".
역사적 이유로 여러 알고리즘에서 의미를 가집니다.

6.1.4.1 StringIndexOf ( string, searchValue, fromIndex )

The abstract operation StringIndexOf takes arguments string (a String), searchValue (a String), and fromIndex (a non-negative integer) and returns a non-negative integer 또는 not-found. It performs the following steps when called:

  1. string의 길이를 len으로 한다.
  2. searchValue가 빈 문자열이고 fromIndexlen이면 fromIndex를 반환한다.
  3. searchValue의 길이를 searchLen으로 한다.
  4. fromIndexilen - searchLen인 각 정수 i에 대해 오름차순으로,
    1. stringi에서 i + searchLen까지의 substringcandidate로 한다.
    2. candidatesearchValue와 같다면 i를 반환한다.
  5. not-found를 반환한다.
Note 1

searchValue가 빈 문자열이고 fromIndexstring의 길이면 이 알고리즘은 fromIndex를 반환합니다. 빈 문자열은 문자열 내 모든 위치(마지막 코드 유닛 뒤 포함)에서 발견된 것으로 간주됩니다.

Note 2

fromIndex + searchValue의 길이 > string의 길이이면 이 알고리즘은 항상 not-found를 반환합니다.

6.1.4.2 StringLastIndexOf ( string, searchValue, fromIndex )

The abstract operation StringLastIndexOf takes arguments string (a String), searchValue (a String), and fromIndex (a non-negative integer) and returns a non-negative integer 또는 not-found. It performs the following steps when called:

  1. string의 길이를 len으로 한다.
  2. searchValue의 길이를 searchLen으로 한다.
  3. Assert: fromIndex + searchLenlen.
  4. 0 ≤ ifromIndex인 각 정수 i에 대해 내림차순으로,
    1. stringi에서 i + searchLen까지의 substringcandidate로 한다.
    2. candidatesearchValue와 같다면 i를 반환한다.
  5. not-found를 반환한다.
Note

searchValue가 빈 문자열이면 이 알고리즘은 fromIndex를 반환합니다. 빈 문자열은 문자열 내 모든 위치(마지막 코드 유닛 뒤 포함)에서 발견된 것으로 간주됩니다.

6.1.5 Symbol 타입

Symbol 타입은 Object 프로퍼티의 키로 사용될 수 있는 모든 String이 아닌 값의 집합입니다(6.1.7 참고).

각 Symbol은 고유하며 변하지 않습니다.

각 Symbol에는 불변의 [[Description]] 내부 슬롯이 있으며, 그 값은 String 또는 undefined입니다.

6.1.5.1 잘 알려진 심볼들

잘 알려진 심볼은 이 명세서 알고리즘에서 명시적으로 참조되는 내장 Symbol 값입니다. 일반적으로 이 값들은 명세 알고리즘의 확장 지점 역할을 하는 프로퍼티의 키로 사용됩니다. 별도 명시가 없는 한, 잘 알려진 심볼 값은 모든 realm에서 공유됩니다(9.3 참고).

이 명세서에서는 잘 알려진 심볼을 intrinsic 표기법으로 표기하며, intrinsic은 Table 1에 나열된 값 중 하나입니다.

Note
이전 명세 판에서는 @@name 형식의 표기를 사용하였으며, 현재 판에서는 %Symbol.name%을 사용합니다. 특히 다음 이름들이 사용되었습니다: @@asyncIterator, @@hasInstance, @@isConcatSpreadable, @@iterator, @@match, @@matchAll, @@replace, @@search, @@species, @@split, @@toPrimitive, @@toStringTag, @@unscopables.
Table 1: 잘 알려진 심볼
명세 이름 [[Description]] 값 및 용도
%Symbol.asyncIterator% "Symbol.asyncIterator" 객체의 기본 비동기 이터레이터를 반환하는 메서드. for-await-of 구문의 의미론에 의해 호출됨.
%Symbol.hasInstance% "Symbol.hasInstance" 생성자 객체가 특정 객체를 자신의 인스턴스로 인식하는지 결정하는 메서드. instanceof 연산자 의미론에 의해 호출됨.
%Symbol.isConcatSpreadable% "Symbol.isConcatSpreadable" 값이 true면, 객체가 Array.prototype.concat에 의해 배열 요소로 평탄화되어야 함을 나타내는 Boolean 프로퍼티.
%Symbol.iterator% "Symbol.iterator" 객체의 기본 이터레이터를 반환하는 메서드. for-of 구문의 의미론에 의해 호출됨.
%Symbol.match% "Symbol.match" 정규 표현식을 문자열과 매칭하는 정규식 메서드. String.prototype.match 메서드에 의해 호출됨.
%Symbol.matchAll% "Symbol.matchAll" 정규 표현식을 문자열과 매칭하여 이터레이터로 반환하는 정규식 메서드. String.prototype.matchAll 메서드에 의해 호출됨.
%Symbol.replace% "Symbol.replace" 문자열의 매칭된 부분을 교체하는 정규식 메서드. String.prototype.replace 메서드에 의해 호출됨.
%Symbol.search% "Symbol.search" 정규 표현식과 매칭되는 문자열 내의 인덱스를 반환하는 정규식 메서드. String.prototype.search 메서드에 의해 호출됨.
%Symbol.species% "Symbol.species" 파생 객체를 생성하는 데 사용되는 생성자 함수값 프로퍼티.
%Symbol.split% "Symbol.split" 정규 표현식과 매칭되는 인덱스에서 문자열을 분할하는 정규식 메서드. String.prototype.split 메서드에 의해 호출됨.
%Symbol.toPrimitive% "Symbol.toPrimitive" 객체를 해당 원시값으로 변환하는 메서드. ToPrimitive 추상 연산에 의해 호출됨.
%Symbol.toStringTag% "Symbol.toStringTag" 객체의 기본 문자열 설명을 생성하는 데 사용되는 String 값 프로퍼티. Object.prototype.toString 내장 메서드에서 접근됨.
%Symbol.unscopables% "Symbol.unscopables" 자신의 프로퍼티명과 상속된 프로퍼티명이 해당 객체의 with 환경 바인딩에서 제외되는 객체 값 프로퍼티.

6.1.6 숫자 타입

ECMAScript에는 두 가지 내장 숫자 타입(Number와 BigInt)이 있습니다. 아래 추상 연산들은 이 숫자 타입에 대해 정의되어 있습니다. "결과(Result)" 열은 반환 타입과, 일부 연산 호출이 abrupt completion을 반환할 수 있는지 여부를 나타냅니다.

Table 2: 숫자 타입 연산
연산 예시 소스 평가 의미론에서 호출되는 위치 결과
Number::unaryMinus -x 단항 - 연산자(Unary - Operator) Number
BigInt::unaryMinus BigInt
Number::bitwiseNOT ~x 비트 NOT 연산자(Bitwise NOT Operator) ( ~ ) Number
BigInt::bitwiseNOT BigInt
Number::exponentiate x ** y 거듭제곱 연산자(Exponentiation Operator)Math.pow ( base, exponent ) Number
BigInt::exponentiate 정상 완료(BigInt) 또는 throw completion
Number::multiply x * y 곱셈 연산자(Multiplicative Operators) Number
BigInt::multiply BigInt
Number::divide x / y 곱셈 연산자(Multiplicative Operators) Number
BigInt::divide 정상 완료(BigInt) 또는 throw completion
Number::remainder x % y 곱셈 연산자(Multiplicative Operators) Number
BigInt::remainder 정상 완료(BigInt) 또는 throw completion
Number::add x ++
++ x
x + y
후위 증가 연산자(Postfix Increment Operator), 전위 증가 연산자(Prefix Increment Operator), 덧셈 연산자 ( + ) (The Addition Operator) Number
BigInt::add BigInt
Number::subtract x --
-- x
x - y
후위 감소 연산자(Postfix Decrement Operator), 전위 감소 연산자(Prefix Decrement Operator), 뺄셈 연산자 ( - ) (The Subtraction Operator) Number
BigInt::subtract BigInt
Number::leftShift x << y 왼쪽 시프트 연산자 ( << ) (The Left Shift Operator) Number
BigInt::leftShift BigInt
Number::signedRightShift x >> y 부호 있는 오른쪽 시프트 연산자 ( >> ) (The Signed Right Shift Operator) Number
BigInt::signedRightShift BigInt
Number::unsignedRightShift x >>> y 부호 없는 오른쪽 시프트 연산자 ( >>> ) (The Unsigned Right Shift Operator) Number
BigInt::unsignedRightShift throw completion
Number::lessThan x < y
x > y
x <= y
x >= y
관계 연산자(Relational Operators), IsLessThan ( x, y, LeftFirst ) Boolean 또는 undefined (비정렬 입력)
BigInt::lessThan Boolean
Number::equal x == y
x != y
x === y
x !== y
동등 연산자(Equality Operators), IsStrictlyEqual ( x, y ) Boolean
BigInt::equal
Number::sameValue Object.is(x, y) 객체 내부 메서드, SameValue ( x, y )를 통해, 정확한 값 동등성 검사 Boolean
Number::sameValueZero [x].includes(y) SameValueZero ( x, y )를 통해, 값 동등성 검사, Array, Map, Set 메서드에서 +0𝔽-0𝔽 차이 무시 Boolean
Number::bitwiseAND x & y 이진 비트 연산자(Binary Bitwise Operators) Number
BigInt::bitwiseAND BigInt
Number::bitwiseXOR x ^ y Number
BigInt::bitwiseXOR BigInt
Number::bitwiseOR x | y Number
BigInt::bitwiseOR BigInt
Number::toString String(x) 다양한 표현식 및 내장 함수, ToString ( argument )를 통해 String
BigInt::toString

숫자 타입들은 일반적으로 정밀도 손실이나 절단 없이 변환될 수 없으므로, ECMAScript 언어는 이러한 타입들 간의 암시적 변환을 제공하지 않습니다. 프로그래머는 다른 타입이 필요한 함수를 호출할 때 타입 간 변환을 위해 반드시 NumberBigInt 함수를 명시적으로 호출해야 합니다.

Note

ECMAScript의 최초 및 이후 판들은 일부 연산자에 대해 정밀도 손실이나 절단이 발생할 수 있는 암시적 숫자 변환을 제공해왔습니다. 이러한 기존 암시적 변환은 하위 호환성을 위해 유지되지만, BigInt에는 제공되지 않아 프로그래머의 오류 가능성을 최소화하고, 미래 판에서 일반화된 값 타입 옵션을 열어두기 위함입니다.

6.1.6.1 Number 타입

Number 타입은 정확히 18,437,736,874,454,810,627개(즉, 264 - 253 + 3)의 값을 가지며, 이는 IEEE 이진 부동소수점 산술 표준(IEEE 754-2019)의 binary64의 배정밀도 부동소수점 값을 나타냅니다. 단, IEEE 표준의 9,007,199,254,740,990개(즉, 253 - 2)의 NaN 값들은 ECMAScript에서 하나의 특별한 NaN 값으로 표현됩니다. (NaN 값은 프로그램 표현식 NaN에 의해 생성됩니다.) 일부 구현에서는 외부 코드가 다양한 NaN 값을 구분할 수 있지만, 그러한 동작은 구현 정의입니다. ECMAScript 코드에서는 모든 NaN 값이 서로 구분되지 않습니다.

Note

Number 값이 ArrayBuffer(25.1) 또는 SharedArrayBuffer(25.2)에 저장된 후 관찰될 수 있는 비트 패턴은 ECMAScript 구현이 내부적으로 사용하는 Number 값의 표현과 반드시 같지는 않습니다.

또 다른 두 개의 특별한 값, 양의 무한대음의 무한대가 있습니다. 간결하게 하기 위해, 이 값들은 설명상 각각 +∞𝔽-∞𝔽 기호로도 불립니다. (이 두 무한대 Number 값은 프로그램 표현식 +Infinity(또는 단순히 Infinity) 및 -Infinity에 의해 생성됩니다.)

나머지 18,437,736,874,454,810,624개(즉, 264 - 253)의 값들은 유한 숫자라고 불립니다. 이 중 절반은 양수이고, 절반은 음수입니다. 모든 유한 양의 Number 값에는 같은 크기를 가진 음수 값이 대응됩니다.

양의 0과 음의 0이 모두 존재함을 유의하세요. 설명상 이 값들은 각각 +0𝔽-0𝔽 기호로도 불립니다. (이 두 다른 0 Number 값은 프로그램 표현식 +0(또는 단순히 0) 및 -0에 의해 생성됩니다.)

18,437,736,874,454,810,622개(즉, 264 - 253 - 2)의 유한 0이 아닌 값들은 두 종류로 나뉩니다:

18,428,729,675,200,069,632개(즉, 264 - 254)는 정규화된 형태로, 다음과 같습니다

s × m × 2e

여기서 s는 1 또는 -1, m은 252(포함)에서 253(제외) 사이의 정수, e는 -1074에서 971(포함) 사이의 정수입니다.

나머지 9,007,199,254,740,990개(즉, 253 - 2) 값은 비정규화된 형태로, 다음과 같습니다

s × m × 2e

여기서 s는 1 또는 -1, m은 0(제외)에서 252(제외) 사이의 정수, e는 -1074입니다.

크기가 253 이하인 모든 양의 및 음의 정수가 Number 타입으로 표현 가능합니다. 정수 0은 Number 타입에서 +0𝔽-0𝔽 두 가지 표현을 가집니다.

유한 숫자는 0이 아니며 위에 나타난 두 가지 방식 중 한 가지로 표현될 때 정수 m이 홀수이면 홀수 시그니피컨드를 가집니다. 그렇지 않으면 짝수 시그니피컨드 입니다.

본 명세에서 “x의 Number 값”이라는 구절은 x가 정확한 실수 수량(π와 같은 무리수일 수도 있음)을 나타내는 경우, 다음 방식으로 선택된 Number 값을 의미합니다. Number 타입의 모든 유한 값 집합을 고려하고, -0𝔽를 제거하며, Number 타입으로 표현할 수 없는 두 값을 추가합니다: 21024(즉, +1 × 253 × 2971) 및 -21024(즉, -1 × 253 × 2971). 이 집합에서 x와 가장 가까운 값을 선택합니다. 두 값이 동일하게 가까우면 짝수 시그니피컨드를 가진 값을 선택합니다; 이때 두 추가 값 21024-21024은 짝수 시그니피컨드를 가진 것으로 간주합니다. 마지막으로, 선택된 값이 21024이면 +∞𝔽로, -21024이면 -∞𝔽로, +0𝔽이면 x < 0일 때만 -0𝔽로 바꿉니다; 그 밖의 값은 그대로 사용합니다. 결과가 x의 Number 값입니다. (이 절차는 IEEE 754-2019의 roundTiesToEven 모드와 정확히 일치합니다.)

+∞의 Number 값은 +∞𝔽, -∞의 Number 값은 -∞𝔽입니다.

일부 ECMAScript 연산자는 -231에서 231 - 1까지와 같이 특정 범위의 정수만 처리합니다. 이러한 연산자는 Number 타입의 임의 값을 받아들이지만, 먼저 해당 값을 예상 범위의 정수 값으로 변환합니다. 숫자 변환 연산에 대한 설명은 7.1에서 확인하세요.

6.1.6.1.1 Number::unaryMinus ( x )

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

  1. xNaN이면, NaN을 반환한다.
  2. x의 부호를 반전시킨 Number를 반환한다. 즉, 같은 크기이지만 부호가 반대인 Number를 계산한다.

6.1.6.1.2 Number::bitwiseNOT ( x )

The abstract operation Number::bitwiseNOT takes argument x (a Number) and returns an integral Number. It performs the following steps when called:

  1. oldValue를 ! ToInt32(x)로 한다.
  2. oldValue의 비트 보수를 반환한다. 결과의 수학적 값은 32비트 2의 보수 비트 문자열로 정확히 표현된다.

6.1.6.1.3 Number::exponentiate ( base, exponent )

The abstract operation Number::exponentiate takes arguments base (a Number) and exponent (a Number) and returns a Number. baseexponent 제곱을 한 결과를 구현에 따라 근사한 값을 반환한다. It performs the following steps when called:

  1. exponentNaN이면, NaN을 반환한다.
  2. exponent+0𝔽 또는 -0𝔽이면, 1𝔽을 반환한다.
  3. baseNaN이면, NaN을 반환한다.
  4. base+∞𝔽이면,
    1. exponent > +0𝔽이면 +∞𝔽 반환; 그렇지 않으면 +0𝔽 반환.
  5. base-∞𝔽이면,
    1. exponent > +0𝔽이면,
      1. exponent가 홀수 정수 Number이면 -∞𝔽 반환; 아니면 +∞𝔽 반환.
    2. 그렇지 않으면,
      1. exponent가 홀수 정수 Number이면 -0𝔽 반환; 아니면 +0𝔽 반환.
  6. base+0𝔽이면,
    1. exponent > +0𝔽이면 +0𝔽 반환; 아니면 +∞𝔽 반환.
  7. base-0𝔽이면,
    1. exponent > +0𝔽이면,
      1. exponent가 홀수 정수 Number이면 -0𝔽 반환; 아니면 +0𝔽 반환.
    2. 그렇지 않으면,
      1. exponent가 홀수 정수 Number이면 -∞𝔽 반환; 아니면 +∞𝔽 반환.
  8. 단언: base유한하며 +0𝔽 또는 -0𝔽가 아니다.
  9. exponent+∞𝔽이면,
    1. abs((base)) > 1이면 +∞𝔽 반환.
    2. abs((base)) = 1이면 NaN 반환.
    3. abs((base)) < 1이면 +0𝔽 반환.
  10. exponent-∞𝔽이면,
    1. abs((base)) > 1이면 +0𝔽 반환.
    2. abs((base)) = 1이면 NaN 반환.
    3. abs((base)) < 1이면 +∞𝔽 반환.
  11. 단언: exponent유한하며 +0𝔽 또는 -0𝔽가 아니다.
  12. base < -0𝔽이고 exponent가 정수 Number가 아니면 NaN 반환.
  13. (base)의 (exponent) 제곱을 구현에 따라 근사한 Number 값으로 반환.
Note

base1𝔽 또는 -1𝔽이고 exponent+∞𝔽 또는 -∞𝔽일 때, 혹은 base1𝔽이고 exponentNaN일 때, base ** exponent의 결과는 IEEE 754-2019와 다릅니다. ECMAScript 1판은 이 연산에 대해 NaN 결과를 명시했으나, 이후 IEEE 754 개정판은 1𝔽을 명시했습니다. 호환성을 위해 기존 ECMAScript 동작을 유지합니다.

6.1.6.1.4 Number::multiply ( x, y )

The abstract operation Number::multiply takes arguments x (a Number) and y (a Number) and returns a Number. IEEE 754-2019 배정밀도 이진 산술 규칙에 따라 곱셈을 수행하며, xy의 곱을 생성합니다. It performs the following steps when called:

  1. x 또는 yNaN이면 NaN 반환.
  2. x+∞𝔽 또는 -∞𝔽이면,
    1. y+0𝔽 또는 -0𝔽이면 NaN 반환.
    2. y > +0𝔽이면 x 반환.
    3. -x 반환.
  3. y+∞𝔽 또는 -∞𝔽이면,
    1. x+0𝔽 또는 -0𝔽이면 NaN 반환.
    2. x > +0𝔽이면 y 반환.
    3. -y 반환.
  4. x-0𝔽이면,
    1. y-0𝔽 또는 y < -0𝔽이면 +0𝔽 반환.
    2. 아니면 -0𝔽 반환.
  5. y-0𝔽이면,
    1. x < -0𝔽이면 +0𝔽 반환.
    2. 아니면 -0𝔽 반환.
  6. 𝔽((x) × (y)) 반환.
Note

유한 정밀 곱셈은 교환법칙은 성립하지만 항상 결합법칙이 성립하지는 않습니다.

6.1.6.1.5 Number::divide ( x, y )

The abstract operation Number::divide takes arguments x (a Number) and y (a Number) and returns a Number. IEEE 754-2019 배정밀도 이진 산술 규칙에 따라 나눗셈을 수행하며, x는 피제수, y는 제수로써 몫을 생성합니다. It performs the following steps when called:

  1. x 또는 yNaN이면 NaN 반환.
  2. x+∞𝔽 또는 -∞𝔽이면,
    1. y+∞𝔽 또는 -∞𝔽이면 NaN 반환.
    2. y+0𝔽 또는 y > +0𝔽이면 x 반환.
    3. -x 반환.
  3. y+∞𝔽이면,
    1. x+0𝔽 또는 x > +0𝔽이면 +0𝔽 반환; 아니면 -0𝔽 반환.
  4. y-∞𝔽이면,
    1. x+0𝔽 또는 x > +0𝔽이면 -0𝔽 반환; 아니면 +0𝔽 반환.
  5. x+0𝔽 또는 -0𝔽이면,
    1. y+0𝔽 또는 -0𝔽이면 NaN 반환.
    2. y > +0𝔽이면 x 반환.
    3. -x 반환.
  6. y+0𝔽이면,
    1. x > +0𝔽이면 +∞𝔽 반환; 아니면 -∞𝔽 반환.
  7. y-0𝔽이면,
    1. x > +0𝔽이면 -∞𝔽 반환; 아니면 +∞𝔽 반환.
  8. 𝔽((x) / (y)) 반환.

6.1.6.1.6 Number::remainder ( n, d )

The abstract operation Number::remainder takes arguments n (a Number) and d (a Number) and returns a Number. 피제수 n과 제수 d의 암시적 나눗셈에서 나머지를 반환합니다. It performs the following steps when called:

  1. n 또는 dNaN이면 NaN 반환.
  2. n+∞𝔽 또는 -∞𝔽이면 NaN 반환.
  3. d+∞𝔽 또는 -∞𝔽이면 n 반환.
  4. d+0𝔽 또는 -0𝔽이면 NaN 반환.
  5. n+0𝔽 또는 -0𝔽이면 n 반환.
  6. 단언: nd유한하며 0이 아니다.
  7. quotient(n) / (d)로 한다.
  8. qtruncate(quotient)로 한다.
  9. r(n) - ((d) × q)로 한다.
  10. r = 0이고 n < -0𝔽이면 -0𝔽 반환.
  11. 𝔽(r) 반환.
Note 1

C 및 C++에서 나머지 연산자는 정수 피연산자만 허용하지만, ECMAScript에서는 부동소수점 피연산자도 허용합니다.

Note 2
부동소수점 나머지 연산의 결과는 IEEE 754-2019의 “remainder” 연산과 다릅니다. IEEE 754-2019 “remainder” 연산은 반올림 나눗셈에서 나머지를 계산하며, 일반적인 정수 나머지 연산자와는 유사하지 않습니다. ECMAScript는 부동소수점 연산에서 %가 Java의 정수 나머지 연산자와 유사하게 동작하도록 정의합니다; 이는 C 라이브러리 함수 fmod와 비교할 수 있습니다.

6.1.6.1.7 Number::add ( x, y )

The abstract operation Number::add takes arguments x (a Number) and y (a Number) and returns a Number. IEEE 754-2019 배정밀도 이진 산술 규칙에 따라 덧셈을 수행하며, 두 인자의 합을 생성합니다. It performs the following steps when called:

  1. x 또는 yNaN이면 NaN 반환.
  2. x+∞𝔽이고 y-∞𝔽이면 NaN 반환.
  3. x-∞𝔽이고 y+∞𝔽이면 NaN 반환.
  4. x+∞𝔽 또는 -∞𝔽이면 x 반환.
  5. y+∞𝔽 또는 -∞𝔽이면 y 반환.
  6. 단언: xy는 모두 유한하다.
  7. x-0𝔽이고 y-0𝔽이면 -0𝔽 반환.
  8. 𝔽((x) + (y)) 반환.
Note

유한 정밀 덧셈은 교환법칙은 성립하지만 항상 결합법칙이 성립하지는 않습니다.

6.1.6.1.8 Number::subtract ( x, y )

The abstract operation Number::subtract takes arguments x (a Number) and y (a Number) and returns a Number. 뺄셈을 수행하며, x는 피감수, y는 감수로써 차를 생성합니다. It performs the following steps when called:

  1. Number::add(x, Number::unaryMinus(y))를 반환한다.
Note

항상 x - y의 결과는 x + (-y)의 결과와 같습니다.

6.1.6.1.9 Number::leftShift ( x, y )

The abstract operation Number::leftShift takes arguments x (a Number) and y (a Number) and returns an integral Number. It performs the following steps when called:

  1. lNum을 ! ToInt32(x)로 한다.
  2. rNum을 ! ToUint32(y)로 한다.
  3. shiftCount(rNum) mod 32로 한다.
  4. lNumshiftCount 비트만큼 왼쪽으로 시프트한 결과를 반환한다. 결과의 수학적 값은 32비트 2의 보수 비트 문자열로 정확히 표현된다.

6.1.6.1.10 Number::signedRightShift ( x, y )

The abstract operation Number::signedRightShift takes arguments x (a Number) and y (a Number) and returns an integral Number. It performs the following steps when called:

  1. lNum을 ! ToInt32(x)로 한다.
  2. rNum을 ! ToUint32(y)로 한다.
  3. shiftCount(rNum) mod 32로 한다.
  4. lNumshiftCount 비트만큼 부호 확장 우측 시프트한 결과를 반환한다. 최상위 비트가 전파된다. 결과의 수학적 값은 32비트 2의 보수 비트 문자열로 정확히 표현된다.

6.1.6.1.11 Number::unsignedRightShift ( x, y )

The abstract operation Number::unsignedRightShift takes arguments x (a Number) and y (a Number) and returns an integral Number. It performs the following steps when called:

  1. lNum을 ! ToUint32(x)로 한다.
  2. rNum을 ! ToUint32(y)로 한다.
  3. shiftCount(rNum) mod 32로 한다.
  4. lNumshiftCount 비트만큼 0으로 채우며 우측 시프트한 결과를 반환한다. 비워진 비트는 0으로 채워진다. 결과의 수학적 값은 32비트 부호 없는 비트 문자열로 정확히 표현된다.

6.1.6.1.12 Number::lessThan ( x, y )

The abstract operation Number::lessThan takes arguments x (a Number) and y (a Number) and returns a Boolean or undefined. It performs the following steps when called:

  1. xNaN이면 undefined 반환.
  2. yNaN이면 undefined 반환.
  3. xy와 같으면 false 반환.
  4. x+0𝔽이고 y-0𝔽이면 false 반환.
  5. x-0𝔽이고 y+0𝔽이면 false 반환.
  6. x+∞𝔽이면 false 반환.
  7. y+∞𝔽이면 true 반환.
  8. y-∞𝔽이면 false 반환.
  9. x-∞𝔽이면 true 반환.
  10. 단언: xy유한하다.
  11. (x) < (y)이면 true 반환; 아니면 false 반환.

6.1.6.1.13 Number::equal ( x, y )

The abstract operation Number::equal takes arguments x (a Number) and y (a Number) and returns a Boolean. It performs the following steps when called:

  1. xNaN이면 false 반환.
  2. yNaN이면 false 반환.
  3. xy와 같으면 true 반환.
  4. x+0𝔽이고 y-0𝔽이면 true 반환.
  5. x-0𝔽이고 y+0𝔽이면 true 반환.
  6. false 반환.

6.1.6.1.14 Number::sameValue ( x, y )

The abstract operation Number::sameValue takes arguments x (a Number) and y (a Number) and returns a Boolean. It performs the following steps when called:

  1. xy가 모두 NaN이면 true 반환.
  2. x+0𝔽이고 y-0𝔽이면 false 반환.
  3. x-0𝔽이고 y+0𝔽이면 false 반환.
  4. xy와 같으면 true 반환.
  5. false 반환.

6.1.6.1.15 Number::sameValueZero ( x, y )

The abstract operation Number::sameValueZero takes arguments x (a Number) and y (a Number) and returns a Boolean. It performs the following steps when called:

  1. xy가 모두 NaN이면 true 반환.
  2. x+0𝔽이고 y-0𝔽이면 true 반환.
  3. x-0𝔽이고 y+0𝔽이면 true 반환.
  4. xy와 같으면 true 반환.
  5. false 반환.

6.1.6.1.16 NumberBitwiseOp ( op, x, y )

The abstract operation NumberBitwiseOp takes arguments op (&, ^, 또는 |), x (a Number), and y (a Number) and returns an integral Number. It performs the following steps when called:

  1. lNum을 ! ToInt32(x)로 한다.
  2. rNum을 ! ToInt32(y)로 한다.
  3. lBits(lNum)을 표현하는 32비트 2의 보수 비트 문자열로 한다.
  4. rBits(rNum)을 표현하는 32비트 2의 보수 비트 문자열로 한다.
  5. op&이면,
    1. resultlBitsrBits에 대해 비트 AND 연산한 결과로 한다.
  6. 아니고 op^이면,
    1. resultlBitsrBits에 대해 비트 XOR 연산한 결과로 한다.
  7. 그렇지 않으면,
    1. 단언: op|이다.
    2. resultlBitsrBits에 대해 비트 OR 연산한 결과로 한다.
  8. result가 표현하는 32비트 2의 보수 비트 문자열의 정수에 대한 Number 값을 반환한다.

6.1.6.1.17 Number::bitwiseAND ( x, y )

The abstract operation Number::bitwiseAND takes arguments x (a Number) and y (a Number) and returns an integral Number. It performs the following steps when called:

  1. NumberBitwiseOp(&, x, y) 반환.

6.1.6.1.18 Number::bitwiseXOR ( x, y )

The abstract operation Number::bitwiseXOR takes arguments x (a Number) and y (a Number) and returns an integral Number. It performs the following steps when called:

  1. NumberBitwiseOp(^, x, y) 반환.

6.1.6.1.19 Number::bitwiseOR ( x, y )

The abstract operation Number::bitwiseOR takes arguments x (a Number) and y (a Number) and returns an integral Number. It performs the following steps when called:

  1. NumberBitwiseOp(|, x, y) 반환.

6.1.6.1.20 Number::toString ( x, radix )

The abstract operation Number::toString takes arguments x (a Number) and radix (an integer in the inclusive interval from 2 to 36) and returns a String. x를 진법 radix를 사용한 위치 기수 체계로 문자열로 표현합니다. 진법 r을 사용할 때 사용되는 숫자들은 "0123456789abcdefghijklmnopqrstuvwxyz"의 앞에서 r개 코드 유닛을 차례로 사용합니다. 크기가 1𝔽 이상인 숫자의 표현에는 결코 앞에 0이 포함되지 않습니다. It performs the following steps when called:

  1. xNaN이면 "NaN" 반환.
  2. x+0𝔽 또는 -0𝔽이면 "0" 반환.
  3. x < -0𝔽이면 "-"Number::toString(-x, radix)를 연결한 문자열 반환.
  4. x+∞𝔽이면 "Infinity" 반환.
  5. n, k, s를 다음 조건을 만족하는 정수로 한다: k ≥ 1, radixk - 1s < radixk, 𝔽(s × radixn - k)가 x이고, k가 가능한 한 작다. ksradix 표현에서 자릿수이고, sradix로 나누어떨어지지 않으며, 최소 자리수가 반드시 결정되는 것은 아니다.
  6. radix ≠ 10이거나 n이 -5에서 21 사이이면,
    1. nk이면,
      1. 다음을 연결한 문자열 반환:
        • sradix 표현에서 k개의 자릿수
        • n - k번 반복된 코드 유닛 0x0030(DIGIT ZERO)
    2. n > 0이면,
      1. 다음을 연결한 문자열 반환:
        • sradix 표현에서 가장 높은 n개의 자릿수
        • 코드 유닛 0x002E(FULL STOP)
        • 남은 k - n개의 자릿수
    3. 그렇지 않으면,
      1. 단언: n ≤ 0이다.
      2. 다음을 연결한 문자열 반환:
        • 코드 유닛 0x0030(DIGIT ZERO)
        • 코드 유닛 0x002E(FULL STOP)
        • -n번 반복된 코드 유닛 0x0030(DIGIT ZERO)
        • sradix 표현에서 k개의 자릿수
  7. 참고: 이 경우 입력은 과학적 E 표기법으로 표현됩니다(예: 1.2e+3).
  8. 단언: radix는 10이다.
  9. n < 0이면,
    1. exponentSign을 코드 유닛 0x002D(HYPHEN-MINUS)로 한다.
  10. 그렇지 않으면,
    1. exponentSign을 코드 유닛 0x002B(PLUS SIGN)로 한다.
  11. k = 1이면,
    1. 다음을 연결한 문자열 반환:
      • s의 한 자릿수 코드 유닛
      • 코드 유닛 0x0065(LATIN SMALL LETTER E)
      • exponentSign
      • abs(n - 1)의 10진수 표현 코드 유닛
  12. 다음을 연결한 문자열 반환:
    • s의 10진수 표현에서 가장 높은 자릿수 코드 유닛
    • 코드 유닛 0x002E(FULL STOP)
    • 남은 k - 1개의 10진수 표현 코드 유닛
    • 코드 유닛 0x0065(LATIN SMALL LETTER E)
    • exponentSign
    • abs(n - 1)의 10진수 표현 코드 유닛
Note 1

다음 관찰은 구현 지침으로 유용할 수 있으나, 본 표준의 규범적 요구 사항은 아닙니다:

  • x가 -0𝔽을 제외한 모든 Number 값이면 ToNumber(ToString(x))는 x이다.
  • s의 최소 자리수는 항상 명시된 요구 조건에 따라 고유하게 결정되는 것은 아니다(위 5 참조).
Note 2

더 정확한 변환을 제공하는 구현의 경우, 아래 대안 버전의 5 단계를 구현 지침으로 사용하는 것을 권장합니다:

  1. n, k, s를 다음 조건을 만족하는 정수로 한다: k ≥ 1, radixk - 1s < radixk, 𝔽(s × radixn - k)가 x이고, k가 가능한 한 작다. 여러 가능성이 있으면, (x)에 근접한 값을 가지는 s를 선택한다. 두 가지 가능성이 있으면 짝수 값을 선택한다. ksradix 표현에서 자릿수이며, sradix로 나누어떨어지지 않는다.
Note 3

ECMAScript 구현자는 David M. Gay가 작성한 부동소수점 숫자의 이진-10진 변환 관련 논문과 코드를 참고할 수 있습니다:

Gay, David M. Correctly Rounded Binary-Decimal and Decimal-Binary Conversions. Numerical Analysis, Manuscript 90-10. AT&T Bell Laboratories (Murray Hill, New Jersey). 1990년 11월 30일.
https://ampl.com/_archive/first-website/REFS/rounding.pdf. 관련 코드:
http://netlib.sandia.gov/fp/dtoa.c
http://netlib.sandia.gov/fp/g_fmt.c 그리고 여러 netlib 미러 사이트에서 확인 가능.

6.1.6.2 BigInt 타입

BigInt 타입은 정수 값을 나타냅니다. 값의 크기는 제한이 없으며 특정 비트 폭에 제한되지 않습니다. 별도 언급이 없는 한, 연산들은 일반적으로 정확한 수학적 결과를 반환하도록 설계되었습니다. 이항 연산에서 BigInt는 2의 보수 이진 문자열처럼 동작하며, 음수는 비트가 왼쪽으로 무한히 설정된 것으로 취급됩니다.

6.1.6.2.1 BigInt::unaryMinus ( x )

The abstract operation BigInt::unaryMinus takes argument x (a BigInt) and returns a BigInt. It performs the following steps when called:

  1. x = 0이면, 0를 반환한다.
  2. -x를 반환한다.

6.1.6.2.2 BigInt::bitwiseNOT ( x )

The abstract operation BigInt::bitwiseNOT takes argument x (a BigInt) and returns a BigInt. x의 1의 보수를 반환합니다. It performs the following steps when called:

  1. -x - 1를 반환한다.

6.1.6.2.3 BigInt::exponentiate ( base, exponent )

The abstract operation BigInt::exponentiate takes arguments base (a BigInt) and exponent (a BigInt) and returns either a normal completion containing a BigInt or a throw completion. It performs the following steps when called:

  1. exponent < 0이면, RangeError 예외를 throw한다.
  2. base = 0이고 exponent = 0이면, 1를 반환한다.
  3. baseexponent 제곱을 반환한다.

6.1.6.2.4 BigInt::multiply ( x, y )

The abstract operation BigInt::multiply takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:

  1. x × y를 반환한다.
Note
결과가 입력보다 훨씬 큰 비트 폭을 갖더라도, 정확한 수학적 결과가 반환됩니다.

6.1.6.2.5 BigInt::divide ( x, y )

The abstract operation BigInt::divide takes arguments x (a BigInt) and y (a BigInt) and returns either a normal completion containing a BigInt or a throw completion. It performs the following steps when called:

  1. y = 0이면, RangeError 예외를 throw한다.
  2. quotient(x) / (y)로 한다.
  3. (truncate(quotient))를 반환한다.

6.1.6.2.6 BigInt::remainder ( n, d )

The abstract operation BigInt::remainder takes arguments n (a BigInt) and d (a BigInt) and returns either a normal completion containing a BigInt or a throw completion. It performs the following steps when called:

  1. d = 0이면, RangeError 예외를 throw한다.
  2. n = 0이면, 0를 반환한다.
  3. quotient(n) / (d)로 한다.
  4. q(truncate(quotient))로 한다.
  5. n - (d × q)를 반환한다.
Note
결과의 부호는 피제수의 부호와 같습니다.

6.1.6.2.7 BigInt::add ( x, y )

The abstract operation BigInt::add takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:

  1. x + y를 반환한다.

6.1.6.2.8 BigInt::subtract ( x, y )

The abstract operation BigInt::subtract takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:

  1. x - y를 반환한다.

6.1.6.2.9 BigInt::leftShift ( x, y )

The abstract operation BigInt::leftShift takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:

  1. y < 0이면,
    1. (floor((x) / 2-(y)))를 반환한다.
  2. x × 2y를 반환한다.
Note
이 의미는 BigInt를 무한 길이 2의 보수 이진 숫자열로 취급하여 비트 시프트와 동등해야 합니다.

6.1.6.2.10 BigInt::signedRightShift ( x, y )

The abstract operation BigInt::signedRightShift takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:

  1. BigInt::leftShift(x, -y)를 반환한다.

6.1.6.2.11 BigInt::unsignedRightShift ( x, y )

The abstract operation BigInt::unsignedRightShift takes arguments x (a BigInt) and y (a BigInt) and returns a throw completion. It performs the following steps when called:

  1. TypeError 예외를 throw한다.

6.1.6.2.12 BigInt::lessThan ( x, y )

The abstract operation BigInt::lessThan takes arguments x (a BigInt) and y (a BigInt) and returns a Boolean. It performs the following steps when called:

  1. (x) < (y)이면 true 반환; 아니면 false 반환.

6.1.6.2.13 BigInt::equal ( x, y )

The abstract operation BigInt::equal takes arguments x (a BigInt) and y (a BigInt) and returns a Boolean. It performs the following steps when called:

  1. (x) = (y)이면 true 반환; 아니면 false 반환.

6.1.6.2.14 BinaryAnd ( x, y )

The abstract operation BinaryAnd takes arguments x (0 or 1) and y (0 or 1) and returns 0 or 1. It performs the following steps when called:

  1. x = 1이고 y = 1이면 1을 반환한다.
  2. 아니면 0을 반환한다.

6.1.6.2.15 BinaryOr ( x, y )

The abstract operation BinaryOr takes arguments x (0 or 1) and y (0 or 1) and returns 0 or 1. It performs the following steps when called:

  1. x = 1이거나 y = 1이면 1을 반환한다.
  2. 아니면 0을 반환한다.

6.1.6.2.16 BinaryXor ( x, y )

The abstract operation BinaryXor takes arguments x (0 or 1) and y (0 or 1) and returns 0 or 1. It performs the following steps when called:

  1. x = 1이고 y = 0이면 1을 반환한다.
  2. 아니면 x = 0이고 y = 1이면 1을 반환한다.
  3. 아니면 0을 반환한다.

6.1.6.2.17 BigIntBitwiseOp ( op, x, y )

The abstract operation BigIntBitwiseOp takes arguments op (&, ^, or |), x (a BigInt), and y (a BigInt) and returns a BigInt. It performs the following steps when called:

  1. x(x)로 설정한다.
  2. y(y)로 설정한다.
  3. result를 0으로 설정한다.
  4. shift를 0으로 설정한다.
  5. (x = 0 또는 x = -1)이고 (y = 0 또는 y = -1)일 때까지 반복한다.
    1. xDigitx mod 2로 한다.
    2. yDigity mod 2로 한다.
    3. op&이면,
      1. resultresult + 2shift × BinaryAnd(xDigit, yDigit)로 설정한다.
    4. 아니고 op|이면,
      1. resultresult + 2shift × BinaryOr(xDigit, yDigit)로 설정한다.
    5. 그렇지 않으면,
      1. 단언: op^이다.
      2. resultresult + 2shift × BinaryXor(xDigit, yDigit)로 설정한다.
    6. shiftshift + 1로 설정한다.
    7. x를 (x - xDigit) / 2로 설정한다.
    8. y를 (y - yDigit) / 2로 설정한다.
  6. op&이면,
    1. tmpBinaryAnd(x mod 2, y mod 2)로 한다.
  7. 아니고 op|이면,
    1. tmpBinaryOr(x mod 2, y mod 2)로 한다.
  8. 그렇지 않으면,
    1. 단언: op^이다.
    2. tmpBinaryXor(x mod 2, y mod 2)로 한다.
  9. tmp ≠ 0이면,
    1. resultresult - 2shift로 설정한다.
    2. 참고: 이는 부호 확장입니다.
  10. result에 대한 BigInt 값을 반환한다.

6.1.6.2.18 BigInt::bitwiseAND ( x, y )

The abstract operation BigInt::bitwiseAND takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:

  1. BigIntBitwiseOp(&, x, y)를 반환한다.

6.1.6.2.19 BigInt::bitwiseXOR ( x, y )

The abstract operation BigInt::bitwiseXOR takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:

  1. BigIntBitwiseOp(^, x, y)를 반환한다.

6.1.6.2.20 BigInt::bitwiseOR ( x, y )

The abstract operation BigInt::bitwiseOR takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:

  1. BigIntBitwiseOp(|, x, y)를 반환한다.

6.1.6.2.21 BigInt::toString ( x, radix )

The abstract operation BigInt::toString takes arguments x (a BigInt) and radix (an integer in the inclusive interval from 2 to 36) and returns a String. x를 진법 radix를 사용한 위치 기수 체계로 문자열로 표현합니다. 진법 r을 사용할 때 사용되는 숫자들은 "0123456789abcdefghijklmnopqrstuvwxyz"의 앞에서 r개 코드 유닛을 차례로 사용합니다. 0을 제외한 BigInt의 표현에는 결코 앞에 0이 포함되지 않습니다. It performs the following steps when called:

  1. x < 0이면 "-"BigInt::toString(-x, radix)를 연결한 문자열을 반환한다.
  2. xradix로 표현한 문자열 값을 반환한다.

6.1.7 Object 타입

Object 타입의 각 인스턴스(간단히 “객체”라고도 함)는 프로퍼티들의 집합을 나타냅니다. 각 프로퍼티는 데이터 프로퍼티 또는 접근자 프로퍼티입니다:

  • 데이터 프로퍼티는 키 값과 ECMAScript 언어 값, 그리고 불리언 속성 집합을 연관시킵니다.
  • 접근자 프로퍼티는 키 값과 하나 또는 두 개의 접근자 함수, 그리고 불리언 속성 집합을 연관시킵니다. 접근자 함수는 해당 프로퍼티에 연관된 ECMAScript 언어 값을 저장하거나 가져오는 데 사용됩니다.

객체의 프로퍼티는 프로퍼티 키를 사용하여 고유하게 식별됩니다. 프로퍼티 키는 문자열 또는 심볼입니다. 모든 문자열과 심볼(빈 문자열 포함)은 프로퍼티 키로 유효합니다. 프로퍼티 이름은 문자열인 프로퍼티 키입니다.

정수 인덱스CanonicalNumericIndexString(n)이 +0𝔽에서 𝔽(253 - 1)까지(포함)의 정수 Number를 반환하는 프로퍼티 이름 n입니다. 배열 인덱스CanonicalNumericIndexString(n)이 +0𝔽에서 𝔽(232 - 2)까지(포함)의 정수 Number를 반환하는 정수 인덱스 n입니다.

Note

모든 음수가 아닌 안전한 정수는 해당하는 정수 인덱스를 가집니다. 32비트 부호 없는 정수 중 232 - 1을 제외한 모든 값은 해당하는 배열 인덱스를 가집니다. "-0"정수 인덱스배열 인덱스도 아닙니다.

프로퍼티 키는 프로퍼티와 그 값을 접근하는 데 사용됩니다. 프로퍼티 접근 방식에는 값을 가져오는 get과 값을 할당하는 set 두 가지가 있습니다. get과 set 접근으로 접근 가능한 프로퍼티에는 객체의 직접적인 일부인 자체 프로퍼티와 프로퍼티 상속 관계를 통해 다른 연관 객체로부터 제공받는 상속 프로퍼티가 포함됩니다. 상속 프로퍼티는 연관 객체의 자체 프로퍼티 또는 상속 프로퍼티일 수 있습니다. 각 객체의 자체 프로퍼티는 해당 객체의 다른 자체 프로퍼티의 키 값과 구별되는 키 값을 가져야 합니다.

모든 객체는 논리적으로 프로퍼티의 집합이지만, 프로퍼티 접근과 조작의 의미론이 다른 여러 형태의 객체가 존재합니다. 여러 형태의 객체 정의는 6.1.7.2를 참고하세요.

또한 일부 객체는 호출 가능하며, 이러한 객체를 함수 또는 함수 객체라고 하며 아래에서 추가로 설명합니다. ECMAScript의 모든 함수는 Object 타입의 멤버입니다.

6.1.7.1 프로퍼티 속성

속성은 Table 3에 설명된 Object 프로퍼티의 상태를 정의하고 설명하는 데 사용됩니다. 명시적으로 지정되지 않는 한, 각 속성의 초기값은 기본값입니다.

Table 3: Object 프로퍼티의 속성
속성 이름 해당되는 프로퍼티 종류 값 도메인 기본값 설명
[[Value]] 데이터 프로퍼티 ECMAScript 언어 값 undefined get 접근으로 프로퍼티에서 가져오는 값입니다.
[[Writable]] 데이터 프로퍼티 불리언 false false인 경우, ECMAScript 코드가 [[Set]]을 사용하여 [[Value]] 속성을 변경하려고 해도 성공하지 않습니다.
[[Get]] 접근자 프로퍼티 Object 또는 undefined undefined 값이 Object인 경우, 반드시 함수 객체여야 합니다. get 접근 시마다 해당 함수의 [[Call]] 내부 메소드(Table 5)가 빈 인자 리스트로 호출되어 프로퍼티 값을 가져옵니다.
[[Set]] 접근자 프로퍼티 Object 또는 undefined undefined 값이 Object인 경우, 반드시 함수 객체여야 합니다. set 접근 시마다 해당 함수의 [[Call]] 내부 메소드(Table 5)가 할당 값을 유일한 인자로 포함하는 인자 리스트로 호출됩니다. 프로퍼티의 [[Set]] 내부 메소드 효과는, 반드시 그런 것은 아니지만, 이후 [[Get]] 내부 메소드 호출에서 반환되는 값에 영향을 줄 수 있습니다.
[[Enumerable]] 데이터 프로퍼티 또는 접근자 프로퍼티 불리언 false true인 경우, for-in 열거(see 14.7.5)에 의해 프로퍼티가 열거됩니다. 그렇지 않으면 비열거 프로퍼티라고 합니다.
[[Configurable]] 데이터 프로퍼티 또는 접근자 프로퍼티 불리언 false false인 경우, 프로퍼티 삭제, 데이터 프로퍼티에서 접근자 프로퍼티로의 변경 또는 그 반대, 속성 변경(기존 [[Value]] 교체 또는 [[Writable]]false로 설정하는 경우 제외)은 모두 실패합니다.

6.1.7.2 Object 내부 메소드와 내부 슬롯

ECMAScript에서 객체의 실제 의미론은 내부 메소드라 불리는 알고리즘을 통해 지정됩니다. ECMAScript 엔진의 각 객체는 런타임 행동을 정의하는 내부 메소드 집합과 연결되어 있습니다. 이러한 내부 메소드는 ECMAScript 언어의 일부가 아닙니다. 이 명세에서는 순전히 설명 목적으로 정의됩니다. 하지만 ECMAScript 구현 내의 각 객체는 해당 객체에 연결된 내부 메소드로 지정된 대로 동작해야 합니다. 이를 구현하는 정확한 방법은 구현에 따라 결정됩니다.

내부 메소드 이름은 다형적입니다. 즉, 서로 다른 객체 값이 동일한 내부 메소드 이름이 호출될 때 서로 다른 알고리즘을 실행할 수 있습니다. 내부 메소드가 호출되는 실제 객체는 호출의 “대상”입니다. 런타임에 알고리즘 구현이 객체가 지원하지 않는 내부 메소드를 사용하려 하면 TypeError 예외가 발생합니다.

내부 슬롯은 객체, 심볼, 또는 Private Name에 연결된 내부 상태로, 여러 ECMAScript 명세 알고리즘에서 사용됩니다. 내부 슬롯은 객체 프로퍼티가 아니며 상속되지 않습니다. 내부 슬롯 명세에 따라 해당 상태는 ECMAScript 언어의 모든 타입 값이나 특정 ECMAScript 명세 타입 값일 수 있습니다. 명시적으로 달리 지정되지 않는 한, 내부 슬롯은 객체, 심볼, 또는 Private Name 생성 과정에서 할당되며 동적으로 추가할 수 없습니다. 별도 지정이 없는 한, 내부 슬롯의 초기값은 undefined입니다. 이 명세의 여러 알고리즘은 내부 슬롯을 가진 값을 생성합니다. 하지만 ECMAScript 언어는 내부 슬롯을 직접 조작할 방법을 제공하지 않습니다.

모든 객체는 [[PrivateElements]]라는 내부 슬롯을 가지며, 이는 PrivateElements의 리스트입니다. 이 리스트는 객체의 private 필드, 메소드, 접근자의 값을 나타냅니다. 초기에는 빈 리스트입니다.

내부 메소드와 내부 슬롯은 이 명세에서 [[ ]]로 둘러싼 이름으로 식별됩니다.

Table 4는 ECMAScript 코드로 생성하거나 조작하는 모든 객체에 적용되는 필수 내부 메소드를 요약합니다. 모든 객체는 모든 필수 내부 메소드에 대한 알고리즘을 가져야 합니다. 하지만 모든 객체가 반드시 동일한 알고리즘을 사용하는 것은 아닙니다.

일반 객체는 다음 기준을 모두 만족하는 객체입니다:

  • Table 4에 나열된 내부 메소드에 대해 10.1에 정의된 메소드를 사용합니다.
  • 객체에 [[Call]] 내부 메소드가 있으면, 10.2.1 또는 10.3.1에 정의된 것 중 하나를 사용합니다.
  • 객체에 [[Construct]] 내부 메소드가 있으면, 10.2.2 또는 10.3.2에 정의된 것 중 하나를 사용합니다.

이국 객체일반 객체가 아닌 객체입니다.

이 명세는 내부 메소드에 따라 여러 종류의 이국 객체를 인식합니다. 특정 종류의 이국 객체(Array 이국 객체, 바운드 함수 이국 객체 등)와 행동적으로 동등하지만 해당 종류에 대해 명세된 내부 메소드 집합이 동일하지 않은 객체는 해당 종류의 이국 객체로 인식되지 않습니다.

Table 4 및 유사한 표의 “서명(Signature)” 열은 각 내부 메소드의 호출 패턴을 설명합니다. 호출 패턴에는 항상 괄호로 둘러싼 설명적 매개변수 이름 목록이 포함됩니다. 매개변수 이름이 ECMAScript 타입 이름과 같다면 해당 타입의 값이어야 함을 의미합니다. 내부 메소드가 명시적으로 값을 반환하면, 매개변수 목록 뒤에 “→”와 반환 타입 이름이 따라옵니다. 서명에서 사용된 타입 이름은 6에서 정의된 타입에, 아래 추가 이름이 보강된 것입니다. “any”는 값이 ECMAScript 언어 타입 중 아무거나 될 수 있음을 의미합니다.

내부 메소드는 매개변수 외에도 항상 해당 메소드 호출의 대상 객체에 접근할 수 있습니다.

내부 메소드는 암시적으로 Completion Record를 반환하며, 반환 타입에 표시된 값을 감싼 정상 완료 또는 throw 완료입니다.

Table 4: 필수 내부 메소드
내부 메소드 서명(Signature) 설명
[[GetPrototypeOf]] ( ) Object | Null 이 객체의 상속 프로퍼티를 제공하는 객체를 결정합니다. null 값이면 상속 프로퍼티가 없음을 의미합니다.
[[SetPrototypeOf]] (Object | Null) Boolean 이 객체를 상속 프로퍼티를 제공하는 다른 객체와 연결합니다. null을 전달하면 상속 프로퍼티가 없음을 의미합니다. 연산이 성공적으로 완료되면 true, 실패하면 false를 반환합니다.
[[IsExtensible]] ( ) Boolean 이 객체에 추가 프로퍼티를 추가할 수 있는지 결정합니다.
[[PreventExtensions]] ( ) Boolean 객체에 새 프로퍼티를 추가할 수 있는지 제어합니다. 연산이 성공하면 true, 실패하면 false를 반환합니다.
[[GetOwnProperty]] (propertyKey) Undefined | Property Descriptor 이 객체의 키가 propertyKey인 자체 프로퍼티에 대한 프로퍼티 설명자를 반환하거나, 해당 프로퍼티가 없으면 undefined를 반환합니다.
[[DefineOwnProperty]] (propertyKey, PropertyDescriptor) Boolean 키가 propertyKey인 자체 프로퍼티를 생성하거나 상태를 PropertyDescriptor로 변경합니다. 프로퍼티가 성공적으로 생성/업데이트되면 true, 생성/업데이트할 수 없으면 false를 반환합니다.
[[HasProperty]] (propertyKey) Boolean 이 객체에 propertyKey인 자체 또는 상속 프로퍼티가 이미 있는지 불리언 값으로 반환합니다.
[[Get]] (propertyKey, Receiver) any 이 객체에서 키가 propertyKey인 프로퍼티의 값을 반환합니다. 프로퍼티 값을 가져오려면 ECMAScript 코드 실행이 필요할 수 있으며, 그 경우 Receiver가 코드 평가 시 this 값으로 사용됩니다.
[[Set]] (propertyKey, value, Receiver) Boolean 키가 propertyKey인 프로퍼티 값을 value로 설정합니다. ECMAScript 코드 실행이 필요하면, Receiverthis 값으로 사용됩니다. 값이 설정되면 true, 설정할 수 없으면 false를 반환합니다.
[[Delete]] (propertyKey) Boolean 키가 propertyKey인 자체 프로퍼티를 객체에서 제거합니다. 프로퍼티가 삭제되지 않고 여전히 존재하면 false, 삭제되었거나 존재하지 않으면 true를 반환합니다.
[[OwnPropertyKeys]] ( ) 프로퍼티 키 리스트 객체에 대한 모든 자체 프로퍼티 키를 요소로 하는 리스트를 반환합니다.

Table 5는 함수로 호출 가능한 객체가 지원하는 추가 필수 내부 메소드를 요약합니다. 함수 객체[[Call]] 내부 메소드를 지원하는 객체입니다. 생성자[[Construct]] 내부 메소드를 지원하는 객체입니다. [[Construct]]를 지원하는 모든 객체는 [[Call]]도 지원해야 하며, 즉 생성자는 항상 함수 객체입니다. 따라서 생성자생성자 함수 또는 생성자 함수 객체라고도 부를 수 있습니다.

Table 5: 함수 객체의 추가 필수 내부 메소드
내부 메소드 서명(Signature) 설명
[[Call]] (any, any의 리스트) any 이 객체와 연관된 코드를 실행합니다. 함수 호출 표현식으로 호출됩니다. 내부 메소드의 인자는 this 값과 함수 호출 표현식에서 전달된 인자를 요소로 하는 리스트입니다. 이 내부 메소드를 구현한 객체는 호출 가능합니다.
[[Construct]] (any의 리스트, Object) Object 객체를 생성합니다. new 연산자나 super 호출로 호출됩니다. 내부 메소드의 첫 번째 인자는 생성자 호출 또는 super 호출의 인자 리스트이고, 두 번째 인자는 new 연산자가 최초로 적용된 객체입니다. 이 내부 메소드를 구현한 객체는 생성자입니다. 함수 객체가 반드시 생성자인 것은 아니며, 생성자가 아닌 함수 객체[[Construct]] 내부 메소드가 없습니다.

일반 객체 및 표준 이국 객체의 필수 내부 메소드 의미론은 10에서 지정됩니다. 구현에서 이국 객체의 내부 메소드 사용이 지원되지 않는 경우, 해당 사용 시 TypeError 예외를 throw해야 합니다.

6.1.7.3 필수 내부 메소드의 불변성

ECMAScript 엔진의 객체 내부 메소드는 아래에 명시된 불변성 목록을 준수해야 합니다. 일반 ECMAScript 객체와 이 명세의 모든 표준 이국 객체는 이 불변성을 유지합니다. ECMAScript Proxy 객체는 [[ProxyHandler]] 객체의 트랩 결과에 대한 런타임 검사를 통해 이 불변성을 유지합니다.

구현에서 제공하는 이국 객체도 해당 객체에 대해 이 불변성을 유지해야 합니다. 이 불변성을 위반하면 ECMAScript 코드의 예측 불가능한 동작이나 보안 문제를 일으킬 수 있습니다. 그러나 이 불변성 위반으로 구현의 메모리 안전성이 훼손되어서는 안 됩니다.

이 불변성을 필수 내부 메소드의 기능을 대체하는 대체 인터페이스를 제공하는 등 어떤 방식으로든 우회하도록 허용해서는 안 됩니다.

정의:

  • 내부 메소드의 대상(target)은 내부 메소드가 호출되는 객체입니다.
  • 대상이 [[IsExtensible]] 내부 메소드에서 false를 반환하거나 [[PreventExtensions]] 내부 메소드에서 true를 반환한 것으로 관찰되면, 비확장 대상입니다.
  • 존재하지 않는(non-existent) 프로퍼티는 비확장 대상에 자체 프로퍼티로 존재하지 않는 프로퍼티입니다.
  • SameValue에 대한 모든 참조는 SameValue 알고리즘 정의를 따릅니다.

반환값:

모든 내부 메소드가 반환하는 값은 다음 중 하나인 Completion Record여야 합니다:

  • [[Type]] = normal, [[Target]] = empty, 그리고 [[Value]]가 해당 내부 메소드의 “정상 반환 타입”에 표시된 값
  • [[Type]] = throw, [[Target]] = empty, 그리고 [[Value]]ECMAScript 언어 값
Note 1

내부 메소드는 continue, break, return 완료를 반환하면 안 됩니다.

[[GetPrototypeOf]] ( )

  • 정상 반환 타입은 Object 또는 Null입니다.
  • 대상이 비확장 상태이고 [[GetPrototypeOf]]가 값 V를 반환하면, 이후 [[GetPrototypeOf]] 호출은 항상 VSameValue여야 합니다.
Note 2

객체의 프로토타입 체인은 유한 길이를 가져야 합니다(즉, 어떤 객체에서 시작해서 [[GetPrototypeOf]] 내부 메소드를 재귀적으로 적용하면 결국 null에 도달해야 함). 하지만 프로토타입 체인에 일반 객체 정의를 사용하지 않는 이국 객체가 포함되면, 이 요구사항은 객체 수준 불변성으로 강제할 수 없습니다. 이런 순환 프로토타입 체인은 객체 프로퍼티 접근 시 무한 루프를 유발할 수 있습니다.

[[SetPrototypeOf]] ( V )

  • 정상 반환 타입은 Boolean입니다.
  • 대상이 비확장 상태면, [[SetPrototypeOf]]V가 대상의 [[GetPrototypeOf]]로 관찰된 값과 SameValue가 아니면 반드시 false를 반환해야 합니다.

[[IsExtensible]] ( )

  • 정상 반환 타입은 Boolean입니다.
  • [[IsExtensible]]false를 반환하면, 이후 해당 대상에서 [[IsExtensible]]은 반드시 false를 반환해야 합니다.

[[PreventExtensions]] ( )

  • 정상 반환 타입은 Boolean입니다.
  • [[PreventExtensions]]true를 반환하면, 이후 해당 대상에서 [[IsExtensible]]은 반드시 false를 반환해야 하며, 이제 대상은 비확장 상태로 간주됩니다.

[[GetOwnProperty]] ( P )

  • 정상 반환 타입은 Property Descriptor 또는 Undefined입니다.
  • 반환값이 프로퍼티 설명자이면, 반드시 완전히 채워진 설명자여야 합니다.
  • P가 비구성, 비쓰기 자체 데이터 프로퍼티로 기술된 경우, 이후 [[GetOwnProperty]] ( P ) 호출은 반드시 P[[Value]]SameValue[[Value]] 속성을 가진 설명자를 반환해야 합니다.
  • P[[Writable]], [[Value]] 외의 속성이 시간에 따라 변경될 수 있거나 프로퍼티가 삭제될 수 있으면, P[[Configurable]] 속성은 반드시 true여야 합니다.
  • [[Writable]] 속성이 false에서 true로 변할 수 있다면, [[Configurable]] 속성은 반드시 true여야 합니다.
  • 대상이 비확장 상태이고 P가 존재하지 않는 프로퍼티면, 이후 해당 대상에서 [[GetOwnProperty]] (P)는 반드시 P를 존재하지 않는 것으로 기술해야 합니다(즉, [[GetOwnProperty]] (P)는 undefined를 반환해야 함).
Note 3

세 번째 불변성의 결과로, 데이터 프로퍼티로 기술된 프로퍼티가 시간에 따라 다른 값을 반환할 수 있으면, 다른 메소드에서 값을 변경하는 메커니즘이 노출되지 않아도 [[Writable]][[Configurable]] 중 하나 또는 둘 다 반드시 true여야 합니다.

[[DefineOwnProperty]] ( P, Desc )

  • 정상 반환 타입은 Boolean입니다.
  • [[DefineOwnProperty]]P가 이전에 대상의 비구성 자체 프로퍼티로 관찰된 경우, 다음 중 하나가 아니면 반드시 false를 반환해야 합니다:
    1. P가 쓰기 가능한 데이터 프로퍼티이다. 비구성 쓰기 가능 데이터 프로퍼티는 비구성 비쓰기 데이터 프로퍼티로 변경될 수 있다.
    2. Desc의 모든 속성이 P의 속성과 SameValue이다.
  • [[DefineOwnProperty]] (P, Desc)는 대상이 비확장 상태이고 P가 존재하지 않는 자체 프로퍼티이면 반드시 false를 반환해야 합니다. 즉, 비확장 대상 객체는 새 프로퍼티로 확장될 수 없습니다.

[[HasProperty]] ( P )

  • 정상 반환 타입은 Boolean입니다.
  • P가 이전에 대상의 비구성 자체 데이터 또는 접근자 프로퍼티로 관찰된 경우, [[HasProperty]]는 반드시 true를 반환해야 합니다.

[[Get]] ( P, Receiver )

  • 정상 반환 타입은 ECMAScript 언어의 어떤 타입이든 가능합니다.
  • P가 대상의 비구성, 비쓰기 자체 데이터 프로퍼티로 관찰된 값 V이면, [[Get]]은 반드시 VSameValue를 반환해야 합니다.
  • P가 대상의 비구성 자체 접근자 프로퍼티로 관찰되고 [[Get]] 속성이 undefined이면, [[Get]] 연산은 반드시 undefined를 반환해야 합니다.

[[Set]] ( P, V, Receiver )

  • 정상 반환 타입은 Boolean입니다.
  • P가 대상의 비구성, 비쓰기 자체 데이터 프로퍼티로 관찰된 경우, [[Set]]VP[[Value]] 속성과 SameValue가 아니면 반드시 false를 반환해야 합니다.
  • P가 대상의 비구성 자체 접근자 프로퍼티로 관찰되고 [[Set]] 속성이 undefined이면, [[Set]] 연산은 반드시 false를 반환해야 합니다.

[[Delete]] ( P )

  • 정상 반환 타입은 Boolean입니다.
  • P가 대상의 비구성 자체 데이터 또는 접근자 프로퍼티로 관찰된 경우, [[Delete]]는 반드시 false를 반환해야 합니다.

[[OwnPropertyKeys]] ( )

  • 정상 반환 타입은 리스트입니다.
  • 반환된 리스트에는 중복 항목이 포함되면 안 됩니다.
  • 반환된 리스트의 각 요소는 프로퍼티 키여야 합니다.
  • 반환된 리스트에는 이전에 관찰된 모든 비구성 자체 프로퍼티의 키가 반드시 포함되어야 합니다.
  • 대상이 비확장 상태면, 반환된 리스트에는 [[GetOwnProperty]]로 관찰 가능한 대상의 모든 자체 프로퍼티 키만 포함되어야 합니다.

[[Call]] ( )

  • 정상 반환 타입은 ECMAScript 언어의 어떤 타입이든 가능합니다.

[[Construct]] ( )

  • 정상 반환 타입은 Object입니다.
  • 대상은 반드시 [[Call]] 내부 메소드도 가져야 합니다.

6.1.7.4 잘 알려진 내장 객체

잘 알려진 내장 객체는 이 명세의 알고리즘에서 명시적으로 참조되는 내장 객체이며, 일반적으로 realm별로 별도의 정체성을 가집니다. 별도 지정이 없는 한, 각 내장 객체는 실제로 realm별로 하나씩 유사한 객체 집합에 해당합니다.

이 명세 내에서 %name%과 같은 참조는 현재 realm과 연결된 해당 이름의 내장 객체를 의미합니다. %name.a.b%와 같은 참조는, 어떤 ECMAScript 코드가 평가되기 전에 내장 객체 %name%의 "a" 프로퍼티 값의 "b" 프로퍼티 값에 접근한 것과 같습니다. 현재 realm 및 그 내장 객체 결정 방법은 9.4에 설명되어 있습니다. 잘 알려진 내장 객체 목록은 Table 6에 나와 있습니다.

Table 6: 잘 알려진 내장 객체
내장 객체 이름 글로벌 이름 ECMAScript 언어 연관
%AggregateError% AggregateError AggregateError 생성자 (20.5.7.1)
%Array% Array Array 생성자 (23.1.1)
%ArrayBuffer% ArrayBuffer ArrayBuffer 생성자 (25.1.4)
%ArrayIteratorPrototype% Array Iterator 객체의 프로토타입 (23.1.5)
%AsyncFromSyncIteratorPrototype% Async-from-Sync Iterator 객체의 프로토타입 (27.1.6)
%AsyncFunction% async 함수 객체생성자 (27.7.1)
%AsyncGeneratorFunction% async generator 함수 객체생성자 (27.4.1)
%AsyncGeneratorPrototype% async generator 객체의 프로토타입 (27.6)
%AsyncIteratorPrototype% 모든 표준 내장 async iterator 객체가 간접적으로 상속하는 객체
%Atomics% Atomics Atomics 객체 (25.4)
%BigInt% BigInt BigInt 생성자 (21.2.1)
%BigInt64Array% BigInt64Array BigInt64Array 생성자 (23.2)
%BigUint64Array% BigUint64Array BigUint64Array 생성자 (23.2)
%Boolean% Boolean Boolean 생성자 (20.3.1)
%DataView% DataView DataView 생성자 (25.3.2)
%Date% Date Date 생성자 (21.4.2)
%decodeURI% decodeURI decodeURI 함수 (19.2.6.1)
%decodeURIComponent% decodeURIComponent decodeURIComponent 함수 (19.2.6.2)
%encodeURI% encodeURI encodeURI 함수 (19.2.6.3)
%encodeURIComponent% encodeURIComponent encodeURIComponent 함수 (19.2.6.4)
%Error% Error Error 생성자 (20.5.1)
%eval% eval eval 함수 (19.2.1)
%EvalError% EvalError EvalError 생성자 (20.5.5.1)
%FinalizationRegistry% FinalizationRegistry FinalizationRegistry 생성자 (26.2.1)
%Float16Array% Float16Array Float16Array 생성자 (23.2)
%Float32Array% Float32Array Float32Array 생성자 (23.2)
%Float64Array% Float64Array Float64Array 생성자 (23.2)
%ForInIteratorPrototype% For-In Iterator 객체의 프로토타입 (14.7.5.10)
%Function% Function Function 생성자 (20.2.1)
%GeneratorFunction% generator 함수 객체생성자 (27.3.1)
%GeneratorPrototype% generator 객체의 프로토타입 (27.5)
%Int8Array% Int8Array Int8Array 생성자 (23.2)
%Int16Array% Int16Array Int16Array 생성자 (23.2)
%Int32Array% Int32Array Int32Array 생성자 (23.2)
%isFinite% isFinite isFinite 함수 (19.2.2)
%isNaN% isNaN isNaN 함수 (19.2.3)
%Iterator% Iterator Iterator 생성자 (27.1.3.1)
%IteratorHelperPrototype% Iterator Helper 객체의 프로토타입 (27.1.2.1)
%JSON% JSON JSON 객체 (25.5)
%Map% Map Map 생성자 (24.1.1)
%MapIteratorPrototype% Map Iterator 객체의 프로토타입 (24.1.5)
%Math% Math Math 객체 (21.3)
%Number% Number Number 생성자 (21.1.1)
%Object% Object Object 생성자 (20.1.1)
%parseFloat% parseFloat parseFloat 함수 (19.2.4)
%parseInt% parseInt parseInt 함수 (19.2.5)
%Promise% Promise Promise 생성자 (27.2.3)
%Proxy% Proxy Proxy 생성자 (28.2.1)
%RangeError% RangeError RangeError 생성자 (20.5.5.2)
%ReferenceError% ReferenceError ReferenceError 생성자 (20.5.5.3)
%Reflect% Reflect Reflect 객체 (28.1)
%RegExp% RegExp RegExp 생성자 (22.2.4)
%RegExpStringIteratorPrototype% RegExp String Iterator 객체의 프로토타입 (22.2.9)
%Set% Set Set 생성자 (24.2.2)
%SetIteratorPrototype% Set Iterator 객체의 프로토타입 (24.2.6)
%SharedArrayBuffer% SharedArrayBuffer SharedArrayBuffer 생성자 (25.2.3)
%String% String String 생성자 (22.1.1)
%StringIteratorPrototype% String Iterator 객체의 프로토타입 (22.1.5)
%Symbol% Symbol Symbol 생성자 (20.4.1)
%SyntaxError% SyntaxError SyntaxError 생성자 (20.5.5.4)
%ThrowTypeError% 무조건 새로운 %TypeError% 인스턴스를 throw하는 함수 객체
%TypedArray% 모든 typed Array 생성자의 슈퍼 클래스 (23.2.1)
%TypeError% TypeError TypeError 생성자 (20.5.5.5)
%Uint8Array% Uint8Array Uint8Array 생성자 (23.2)
%Uint8ClampedArray% Uint8ClampedArray Uint8ClampedArray 생성자 (23.2)
%Uint16Array% Uint16Array Uint16Array 생성자 (23.2)
%Uint32Array% Uint32Array Uint32Array 생성자 (23.2)
%URIError% URIError URIError 생성자 (20.5.5.6)
%WeakMap% WeakMap WeakMap 생성자 (24.3.1)
%WeakRef% WeakRef WeakRef 생성자 (26.1.1)
%WeakSet% WeakSet WeakSet 생성자 (24.4.1)
%WrapForValidIteratorPrototype% Iterator.from에서 반환된 래핑된 iterator 객체의 프로토타입 (27.1.3.2.1.1)
Note

Table 100에 추가 항목이 있습니다.

6.2 ECMAScript 명세 타입

명세 타입은 ECMAScript 언어 구조와 ECMAScript 언어 타입의 의미론을 설명하기 위해 알고리즘 내에서 사용되는 메타 값에 해당합니다. 명세 타입에는 Reference Record, List, Completion Record, Property Descriptor, Environment Record, Abstract Closure, Data Block이 포함됩니다. 명세 타입 값은 ECMAScript 구현 내의 특정 엔티티에 반드시 대응하지는 않는 명세 산출물입니다. 명세 타입 값은 ECMAScript 표현식 평가의 중간 결과를 설명하는 데 사용할 수 있지만, 이러한 값은 객체의 프로퍼티나 ECMAScript 언어 변수의 값으로 저장될 수 없습니다.

6.2.1 Enum 명세 타입

Enum은 명세 내부에서만 사용되며 ECMAScript 코드에서는 직접적으로 관찰할 수 없는 값입니다. Enum은 sans-serif 서체로 표시됩니다. 예를 들어, Completion Record[[Type]] 필드는 normal, return, throw와 같은 값을 가집니다. Enum은 이름 이외의 특징을 가지지 않습니다. Enum의 이름은 다른 Enum과 구별하기 위함이며, 그 사용이나 의미를 암시하지 않습니다.

6.2.2 List와 Record 명세 타입

List 타입은 new 표현식, 함수 호출, 그 외 값의 단순 순서 리스트가 필요한 알고리즘에서 인자 리스트 평가를 설명하는 데 사용됩니다(13.3.8 참조). List 타입의 값은 각 개별 값을 담고 있는 리스트 요소들의 순서 있는 시퀀스입니다. 이 시퀀스는 길이에 제한이 없습니다. 리스트의 요소는 0부터 시작하는 인덱스로 임의 접근할 수 있습니다. 표기상의 편의를 위해 배열과 유사한 문법으로 List 요소에 접근할 수 있습니다. 예를 들어, arguments[2]는 List arguments의 3번째 요소를 의미합니다.

알고리즘이 List의 요소를 반복할 때 순서를 지정하지 않으면 List 요소의 순서대로 사용됩니다.

이 명세에서는 리터럴 문법을 사용해 새로운 List 값을 표현할 수 있습니다. 예를 들어, « 1, 2 »는 두 개의 요소를 특정 값으로 초기화한 List 값을 정의합니다. 새로운 빈 List는 « »로 표현할 수 있습니다.

이 명세에서 “the list-concatenation of A, B, ...”(각 인자가 비어 있을 수도 있는 List)라는 표현은 각 인자(순서대로)의 요소를 이어붙인(순서대로) 새로운 List 값을 의미합니다.

List가 String 요소로 구성된 경우 “sorted according to lexicographic code unit order”란, IsLessThan 추상 연산에서 설명한 대로, 짧은 문자열 길이까지 각 코드 유닛의 숫자값으로 정렬하며, 모든 코드 유닛이 같으면 짧은 문자열이 긴 문자열보다 먼저 오도록 정렬한다는 뜻입니다.

Record 타입은 이 명세의 알고리즘 내에서 데이터 집합을 설명하는 데 사용됩니다. Record 타입 값은 하나 이상의 이름 있는 필드로 구성됩니다. 각 필드의 값은 ECMAScript 언어 값 또는 명세 값입니다. 필드 이름은 항상 [[ ]]로 둘러싸입니다(예: [[Value]]).

이 명세에서는 객체 리터럴과 유사한 문법으로 Record 값을 표현할 수 있습니다. 예를 들어, { [[Field1]]: 42, [[Field2]]: false, [[Field3]]: empty }는 세 개의 필드가 각각 특정 값으로 초기화된 Record 값을 정의합니다. 필드 이름의 순서는 중요하지 않습니다. 명시적으로 나열되지 않은 필드는 없는 것으로 간주합니다.

명세 텍스트와 알고리즘에서 점 표기법으로 Record 값의 특정 필드를 참조할 수 있습니다. 예를 들어, 위의 예시 Record R에 대해 R.[[Field2]]는 “R의 [[Field2]] 필드”를 의미합니다.

자주 사용되는 Record 필드 조합에 대해 스키마 이름을 붙일 수 있으며, 그 이름을 리터럴 Record 값에 접두어로 사용해 특정 집합의 집계임을 명시할 수 있습니다. 예: PropertyDescriptor { [[Value]]: 42, [[Writable]]: false, [[Configurable]]: true }.

6.2.3 Set과 Relation 명세 타입

Set 타입은 메모리 모델에서 사용될 무순서 요소 집합을 설명하는 데 사용됩니다. ECMAScript 컬렉션 타입 Set과는 다릅니다. 혼동을 피하기 위해, 명세에서는 ECMAScript 컬렉션 인스턴스를 “Set 객체”라고 일관되게 부릅니다. Set 타입 값은 중복 없는 간단한 요소 집합입니다. 요소는 추가·제거할 수 있으며, Set끼리 합집합·교집합·차집합 연산이 가능합니다.

Relation 타입은 Set에 대한 제약을 설명하는 데 사용됩니다. Relation 타입 값은 값 도메인에서 가져온 순서쌍의 Set입니다. 예를 들어, 이벤트에 대한 Relation은 이벤트들의 순서쌍 집합입니다. Relation R과 값 도메인 내 두 값 a, b에 대해 a R b는 (a, b)가 R의 원소임을 뜻합니다. Relation이 어떤 조건에 대해 최소 Relation임은 그 조건을 만족하는 가장 작은 Relation임을 의미합니다.

엄격 부분 순서(strict partial order)는 다음을 만족하는 Relation 값 R입니다.

  • 모든 R의 도메인 내 a, b, c에 대해:

    • a R a는 성립하지 않으며,
    • a R bb R c이면, a R c이다.
Note 1

위 두 속성은 각각 반사 불가성(irreflexivity)과 추이성(transitivity)이라 부릅니다.

엄격 전순서(strict total order)는 다음을 만족하는 Relation 값 R입니다.

  • 모든 R의 도메인 내 a, b, c에 대해:

    • ab이거나, a R b이거나, b R a이다.
    • a R a는 성립하지 않는다.
    • a R b 그리고 b R c이면, a R c이다.
Note 2

위 세 속성은 각각 전체성(totality), 반사 불가성(irreflexivity), 추이성(transitivity)이라 부릅니다.

6.2.4 Completion Record 명세 타입

Completion Record 명세 타입은 실행 중 값의 전달과 제어 흐름(비지역적 제어 이동을 수행하는 문장인 break, continue, return, throw의 동작 등)을 설명하는 데 사용됩니다.

Completion Record는 Table 7에 정의된 필드를 가집니다.

Table 7: Completion Record 필드
필드 이름 의미
[[Type]] normal, break, continue, return, throw 발생한 completion의 타입
[[Value]] Completion Record가 아닌 임의 값 생성된 값
[[Target]] 문자열 또는 empty 지시된 제어 이동의 대상 레이블

다음과 같은 용어들이 Completion Record를 참조할 때 종종 사용됩니다.

  • normal completion[[Type]] 값이 normal인 Completion Record를 의미합니다.
  • break completion[[Type]] 값이 break인 Completion Record를 의미합니다.
  • continue completion[[Type]] 값이 continue인 Completion Record를 의미합니다.
  • return completion[[Type]] 값이 return인 Completion Record를 의미합니다.
  • throw completion[[Type]] 값이 throw인 Completion Record를 의미합니다.
  • abrupt completion[[Type]] 값이 normal이 아닌 Completion Record를 의미합니다.
  • normal completion containing[[Value]] 필드에 해당 타입의 값이 포함된 normal completion을 의미합니다.

이 명세에서 정의된 호출 가능한 객체는 항상 normal completion이나 throw completion만 반환합니다. 그 외 Completion Record를 반환하는 것은 편집 오류로 간주합니다.

구현 정의 호출 가능 객체도 normal completion 또는 throw completion만 반환해야 합니다.

6.2.4.1 NormalCompletion ( value )

The abstract operation NormalCompletion takes argument value (Completion Record가 아닌 임의 값) and returns normal completion. It performs the following steps when called:

  1. Completion Record { [[Type]]: normal, [[Value]]: value, [[Target]]: empty }를 반환한다.

6.2.4.2 ThrowCompletion ( value )

The abstract operation ThrowCompletion takes argument value (ECMAScript 언어 값) and returns throw completion. It performs the following steps when called:

  1. Completion Record { [[Type]]: throw, [[Value]]: value, [[Target]]: empty }를 반환한다.

6.2.4.3 ReturnCompletion ( value )

The abstract operation ReturnCompletion takes argument value (ECMAScript 언어 값) and returns return completion. It performs the following steps when called:

  1. Completion Record { [[Type]]: return, [[Value]]: value, [[Target]]: empty }를 반환한다.

6.2.4.4 UpdateEmpty ( completionRecord, value )

The abstract operation UpdateEmpty takes arguments completionRecord (Completion Record) and value (Completion Record가 아닌 임의 값) and returns Completion Record. It performs the following steps when called:

  1. 단언: completionRecordreturn completion 또는 throw completion이면, completionRecord.[[Value]]empty가 아니다.
  2. completionRecord.[[Value]]empty가 아니면, ? completionRecord를 반환한다.
  3. Completion Record { [[Type]]: completionRecord.[[Type]], [[Value]]: value, [[Target]]: completionRecord.[[Target]] }를 반환한다.

6.2.5 Reference Record 명세 타입

Reference Record 타입은 delete, typeof, 대입 연산자, super 키워드 및 기타 언어 기능의 동작을 설명하는 데 사용됩니다. 예를 들어, 대입의 왼쪽 피연산자는 Reference Record를 생성해야 합니다.

Reference Record는 해석된 이름 또는(아직 해석되지 않았을 수도 있는) 프로퍼티 바인딩이며, 필드는 Table 8에 정의되어 있습니다.

Table 8: Reference Record 필드
필드 이름 의미
[[Base]] ECMAScript 언어 값, Environment Record, unresolvable 바인딩을 담고 있는 값 또는 Environment Record. [[Base]]unresolvable이면 바인딩을 해석할 수 없음을 의미합니다.
[[ReferencedName]] ECMAScript 언어 값 또는 Private Name 바인딩의 이름. [[Base]] 값이 Environment Record면 항상 문자열입니다. 그렇지 않으면, ToPropertyKey가 수행되기 전까지 문자열이나 심볼이 아닌 ECMAScript 언어 값일 수 있습니다.
[[Strict]] 불리언 Reference Record가 strict 모드 코드에서 생성되었으면 true, 아니면 false입니다.
[[ThisValue]] ECMAScript 언어 값 또는 empty empty가 아니면, Reference Recordsuper 키워드로 표현된 프로퍼티 바인딩을 나타냅니다. 이를 Super Reference Record라 하며, [[Base]] 값은 Environment Record가 될 수 없습니다. 이 경우 [[ThisValue]] 필드는 Reference Record가 생성된 시점의 this 값을 담습니다.

Reference Record를 다루기 위해 명세에서 다음과 같은 추상 연산을 사용합니다:

6.2.5.1 IsPropertyReference ( V )

The abstract operation IsPropertyReference takes argument V (Reference Record) and returns Boolean. It performs the following steps when called:

  1. V.[[Base]]unresolvable이면 false 반환.
  2. V.[[Base]]Environment Record이면 false 반환; 아니면 true 반환.

6.2.5.2 IsUnresolvableReference ( V )

The abstract operation IsUnresolvableReference takes argument V (Reference Record) and returns Boolean. It performs the following steps when called:

  1. V.[[Base]]unresolvable이면 true 반환; 아니면 false 반환.

6.2.5.3 IsSuperReference ( V )

The abstract operation IsSuperReference takes argument V (Reference Record) and returns Boolean. It performs the following steps when called:

  1. V.[[ThisValue]]empty가 아니면 true 반환; 아니면 false 반환.

6.2.5.4 IsPrivateReference ( V )

The abstract operation IsPrivateReference takes argument V (Reference Record) and returns Boolean. It performs the following steps when called:

  1. V.[[ReferencedName]]Private Name이면 true 반환; 아니면 false 반환.

6.2.5.5 GetValue ( V )

The abstract operation GetValue takes argument V (Reference Record 또는 ECMAScript 언어 값) and returns ECMAScript 언어 값을 담는 normal completion 또는 abrupt completion. It performs the following steps when called:

  1. VReference Record가 아니면 V를 반환한다.
  2. IsUnresolvableReference(V)가 true이면 ReferenceError 예외를 throw한다.
  3. IsPropertyReference(V)가 true이면,
    1. baseObj를 ? ToObject(V.[[Base]])로 한다.
    2. IsPrivateReference(V)가 true이면,
      1. PrivateGet(baseObj, V.[[ReferencedName]])를 반환한다.
    3. V.[[ReferencedName]]프로퍼티 키가 아니면,
      1. V.[[ReferencedName]]을 ? ToPropertyKey(V.[[ReferencedName]])로 설정한다.
    4. baseObj.[[Get]](V.[[ReferencedName]], GetThisValue(V))를 반환한다.
  4. 아니면,
    1. baseV.[[Base]]로 한다.
    2. 단언: baseEnvironment Record이다.
    3. base.GetBindingValue(V.[[ReferencedName]], V.[[Strict]])를 반환한다(9.1 참조).
Note

3.a 단계에서 생성되는 객체는 위 추상 연산과 ordinary object [[Get]] 내부 메소드 외부에서는 접근할 수 없습니다. 구현에서는 실제 객체 생성을 생략할 수 있습니다.

6.2.5.6 PutValue ( V, W )

The abstract operation PutValue takes arguments V (Reference Record 또는 ECMAScript 언어 값) and W (ECMAScript 언어 값) and returns unused을 담는 normal completion 또는 abrupt completion. It performs the following steps when called:

  1. VReference Record가 아니면 ReferenceError 예외를 throw한다.
  2. IsUnresolvableReference(V)가 true이면,
    1. V.[[Strict]]true이면 ReferenceError 예외를 throw한다.
    2. globalObjGetGlobalObject()로 한다.
    3. Set(globalObj, V.[[ReferencedName]], W, false)를 수행한다.
    4. unused를 반환한다.
  3. IsPropertyReference(V)가 true이면,
    1. baseObj를 ? ToObject(V.[[Base]])로 한다.
    2. IsPrivateReference(V)가 true이면,
      1. PrivateSet(baseObj, V.[[ReferencedName]], W)를 반환한다.
    3. V.[[ReferencedName]]프로퍼티 키가 아니면,
      1. V.[[ReferencedName]]을 ? ToPropertyKey(V.[[ReferencedName]])로 설정한다.
    4. succeeded를 ? baseObj.[[Set]](V.[[ReferencedName]], W, GetThisValue(V))로 한다.
    5. succeededfalse이고 V.[[Strict]]true이면 TypeError 예외를 throw한다.
    6. unused를 반환한다.
  4. 아니면,
    1. baseV.[[Base]]로 한다.
    2. 단언: baseEnvironment Record이다.
    3. base.SetMutableBinding(V.[[ReferencedName]], W, V.[[Strict]])를 반환한다(9.1 참조).
Note

3.a 단계에서 생성되는 객체는 위 추상 연산과 ordinary object [[Set]] 내부 메소드 외부에서는 접근할 수 없습니다. 구현에서는 실제 객체 생성을 생략할 수 있습니다.

6.2.5.7 GetThisValue ( V )

The abstract operation GetThisValue takes argument V (Reference Record) and returns ECMAScript 언어 값. It performs the following steps when called:

  1. 단언: IsPropertyReference(V)는 true이다.
  2. IsSuperReference(V)가 true이면 V.[[ThisValue]] 반환; 아니면 V.[[Base]] 반환.

6.2.5.8 InitializeReferencedBinding ( V, W )

The abstract operation InitializeReferencedBinding takes arguments V (Reference Record) and W (ECMAScript 언어 값) and returns unused을 담는 normal completion 또는 abrupt completion. It performs the following steps when called:

  1. 단언: IsUnresolvableReference(V)는 false이다.
  2. baseV.[[Base]]로 한다.
  3. 단언: baseEnvironment Record이다.
  4. base.InitializeBinding(V.[[ReferencedName]], W)를 반환한다.

6.2.5.9 MakePrivateReference ( baseValue, privateIdentifier )

The abstract operation MakePrivateReference takes arguments baseValue (ECMAScript 언어 값) and privateIdentifier (문자열) and returns Reference Record. It performs the following steps when called:

  1. privateEnv를 실행 중인 실행 컨텍스트의 PrivateEnvironment로 한다.
  2. 단언: privateEnvnull이 아니다.
  3. privateNameResolvePrivateIdentifier(privateEnv, privateIdentifier)로 한다.
  4. Reference Record { [[Base]]: baseValue, [[ReferencedName]]: privateName, [[Strict]]: true, [[ThisValue]]: empty }를 반환한다.

6.2.6 Property Descriptor 명세 타입

Property Descriptor 타입은 Object 프로퍼티 속성의 조작과 구체화를 설명하는 데 사용됩니다. Property Descriptor는 0개 이상의 필드를 갖는 Record이며, 각 필드 이름은 속성 이름이고 값은 6.1.7.1에 지정된 속성 값입니다. 명세에서 Property Descriptor 레코드의 리터럴 설명을 태그하는 스키마 이름은 “PropertyDescriptor”입니다.

Property Descriptor 값은 특정 필드의 존재나 사용에 따라 데이터 Property Descriptor와 접근자 Property Descriptor로 더 분류할 수 있습니다. [[Value]] 또는 [[Writable]] 필드가 있으면 데이터 Property Descriptor, [[Get]] 또는 [[Set]] 필드가 있으면 접근자 Property Descriptor입니다. 모든 Property Descriptor에는 [[Enumerable]][[Configurable]] 필드가 있을 수 있습니다. 한 Property Descriptor 값은 데이터 Property Descriptor와 접근자 Property Descriptor를 동시에 가질 수 없지만, 둘 다 아닐 수도 있습니다(이 경우 generic Property Descriptor). 완전한 Property Descriptor는 접근자 또는 데이터 Property Descriptor이면서 Table 3의 해당 필드를 모두 가지고 있는 것입니다.

이 명세에서 Property Descriptor 값을 다루기 위해 다음 추상 연산을 사용합니다:

6.2.6.1 IsAccessorDescriptor ( Desc )

The abstract operation IsAccessorDescriptor takes argument Desc (Property Descriptor) and returns Boolean. It performs the following steps when called:

  1. Desc[[Get]] 필드가 있으면 true 반환.
  2. Desc[[Set]] 필드가 있으면 true 반환.
  3. false 반환.

6.2.6.2 IsDataDescriptor ( Desc )

The abstract operation IsDataDescriptor takes argument Desc (Property Descriptor) and returns Boolean. It performs the following steps when called:

  1. Desc[[Value]] 필드가 있으면 true 반환.
  2. Desc[[Writable]] 필드가 있으면 true 반환.
  3. false 반환.

6.2.6.3 IsGenericDescriptor ( Desc )

The abstract operation IsGenericDescriptor takes argument Desc (Property Descriptor) and returns Boolean. It performs the following steps when called:

  1. IsAccessorDescriptor(Desc)가 truefalse 반환.
  2. IsDataDescriptor(Desc)가 truefalse 반환.
  3. true 반환.

6.2.6.4 FromPropertyDescriptor ( Desc )

The abstract operation FromPropertyDescriptor takes argument Desc (Property Descriptor 또는 undefined) and returns Object 또는 undefined. It performs the following steps when called:

  1. Descundefinedundefined 반환.
  2. objOrdinaryObjectCreate(%Object.prototype%)로 한다.
  3. 단언: obj는 확장 가능한 ordinary object이며 자체 프로퍼티가 없다.
  4. Desc[[Value]] 필드가 있으면,
    1. CreateDataPropertyOrThrow(obj, "value", Desc.[[Value]])를 수행한다.
  5. Desc[[Writable]] 필드가 있으면,
    1. CreateDataPropertyOrThrow(obj, "writable", Desc.[[Writable]])를 수행한다.
  6. Desc[[Get]] 필드가 있으면,
    1. CreateDataPropertyOrThrow(obj, "get", Desc.[[Get]])를 수행한다.
  7. Desc[[Set]] 필드가 있으면,
    1. CreateDataPropertyOrThrow(obj, "set", Desc.[[Set]])를 수행한다.
  8. Desc[[Enumerable]] 필드가 있으면,
    1. CreateDataPropertyOrThrow(obj, "enumerable", Desc.[[Enumerable]])를 수행한다.
  9. Desc[[Configurable]] 필드가 있으면,
    1. CreateDataPropertyOrThrow(obj, "configurable", Desc.[[Configurable]])를 수행한다.
  10. obj를 반환한다.

6.2.6.5 ToPropertyDescriptor ( Obj )

The abstract operation ToPropertyDescriptor takes argument Obj (ECMAScript 언어 값) and returns Property Descriptor를 담는 normal completion 또는 throw completion. It performs the following steps when called:

  1. Obj가 Object가 아니면 TypeError 예외를 throw한다.
  2. desc를 초기에는 필드가 없는 새로운 Property Descriptor로 한다.
  3. hasEnumerable을 ? HasProperty(Obj, "enumerable")로 한다.
  4. hasEnumerabletrue면,
    1. enumerableToBoolean(? Get(Obj, "enumerable"))로 한다.
    2. desc.[[Enumerable]]enumerable을 할당한다.
  5. hasConfigurable을 ? HasProperty(Obj, "configurable")로 한다.
  6. hasConfigurabletrue면,
    1. configurableToBoolean(? Get(Obj, "configurable"))로 한다.
    2. desc.[[Configurable]]configurable을 할당한다.
  7. hasValue를 ? HasProperty(Obj, "value")로 한다.
  8. hasValuetrue면,
    1. value를 ? Get(Obj, "value")로 한다.
    2. desc.[[Value]]value를 할당한다.
  9. hasWritable을 ? HasProperty(Obj, "writable")로 한다.
  10. hasWritabletrue면,
    1. writableToBoolean(? Get(Obj, "writable"))로 한다.
    2. desc.[[Writable]]writable을 할당한다.
  11. hasGet을 ? HasProperty(Obj, "get")로 한다.
  12. hasGettrue면,
    1. getter를 ? Get(Obj, "get")로 한다.
    2. IsCallable(getter)가 false이고 getterundefined가 아니면 TypeError 예외를 throw한다.
    3. desc.[[Get]]getter를 할당한다.
  13. hasSet을 ? HasProperty(Obj, "set")로 한다.
  14. hasSettrue면,
    1. setter를 ? Get(Obj, "set")로 한다.
    2. IsCallable(setter)가 false이고 setterundefined가 아니면 TypeError 예외를 throw한다.
    3. desc.[[Set]]setter를 할당한다.
  15. desc[[Get]] 또는 [[Set]] 필드가 있으면,
    1. desc[[Value]] 또는 [[Writable]] 필드가 있으면 TypeError 예외를 throw한다.
  16. desc를 반환한다.

6.2.6.6 CompletePropertyDescriptor ( Desc )

The abstract operation CompletePropertyDescriptor takes argument Desc (Property Descriptor) and returns unused. It performs the following steps when called:

  1. likeRecord { [[Value]]: undefined, [[Writable]]: false, [[Get]]: undefined, [[Set]]: undefined, [[Enumerable]]: false, [[Configurable]]: false }로 한다.
  2. IsGenericDescriptor(Desc)가 true이거나 IsDataDescriptor(Desc)가 true이면,
    1. Desc[[Value]] 필드가 없으면 Desc.[[Value]]like.[[Value]]를 할당한다.
    2. Desc[[Writable]] 필드가 없으면 Desc.[[Writable]]like.[[Writable]]를 할당한다.
  3. 아니면,
    1. Desc[[Get]] 필드가 없으면 Desc.[[Get]]like.[[Get]]를 할당한다.
    2. Desc[[Set]] 필드가 없으면 Desc.[[Set]]like.[[Set]]를 할당한다.
  4. Desc[[Enumerable]] 필드가 없으면 Desc.[[Enumerable]]like.[[Enumerable]]를 할당한다.
  5. Desc[[Configurable]] 필드가 없으면 Desc.[[Configurable]]like.[[Configurable]]를 할당한다.
  6. unused를 반환한다.

6.2.7 Environment Record 명세 타입

Environment Record 타입은 중첩 함수와 블록에서 이름 해석 동작을 설명하는 데 사용됩니다. 이 타입과 관련 연산은 9.1에 정의되어 있습니다.

6.2.8 Abstract Closure 명세 타입

Abstract Closure 명세 타입은 알고리즘 단계와 값 집합을 함께 참조하는 데 사용됩니다. Abstract Closure는 메타 값이며 함수 호출 방식(closure(arg1, arg2))으로 호출됩니다. 추상 연산과 마찬가지로, 호출 시 Abstract Closure에 기술된 알고리즘 단계를 수행합니다.

Abstract Closure를 생성하는 알고리즘 단계에서는 "capture" 뒤에 별칭 목록으로 값을 캡처합니다. Abstract Closure가 생성될 때 각 별칭에 연관된 값을 캡처합니다. Abstract Closure가 호출될 때 수행할 알고리즘 단계에서는 캡처된 값을 캡처 당시 사용된 별칭으로 참조합니다.

Abstract Closure가 Completion Record를 반환하면, 반드시 normal completion 또는 throw completion이어야 합니다.

Abstract Closure는 다른 알고리즘의 일부로 인라인 생성됩니다. 예시는 다음과 같습니다.

  1. addend를 41로 한다.
  2. closure를 매개변수(x)를 가지며, addend를 캡처하고 호출 시 다음 단계를 수행하는 새로운 Abstract Closure로 한다:
    1. x + addend를 반환한다.
  3. valclosure(1)로 한다.
  4. 단언: val은 42이다.

6.2.9 Data Block

Data Block 명세 타입은 개별적이고 변경 가능한 바이트 크기(8비트)의 숫자값 시퀀스를 설명하는 데 사용됩니다. byte value는 0부터 255(포함) 사이의 정수입니다. Data Block 값은 고정된 바이트 수로 생성되며 각 바이트의 초기값은 0입니다.

이 명세에서는 배열과 유사한 문법으로 Data Block 값의 개별 바이트에 접근할 수 있습니다. 이 표기법은 Data Block 값을 0 기반 integer-indexed 바이트 시퀀스로 표현합니다. 예를 들어, db가 5바이트 Data Block 값이면 db[2]는 3번째 바이트에 접근할 수 있습니다.

메모리 내에서 여러 agent가 동시에 참조할 수 있는 data block은 Shared Data Block이라 부릅니다. Shared Data Block은 주소 자유(address-free)의 정체성을 갖습니다(Shared Data Block 값의 동등성 검사 목적). 이는 해당 블록이 어떤 프로세스의 가상 주소에 매핑되어 있든 상관없이, 그 블록이 나타내는 메모리 위치 집합에 따라 정체성이 결정됨을 뜻합니다. 두 data block은 그 위치 집합이 같을 때만 같고, 그렇지 않으면 다르며, 위치 집합의 교집합은 비어 있습니다. 마지막으로, Shared Data Block과 Data Block은 구별할 수 있습니다.

Shared Data Block의 의미론은 메모리 모델에서 Shared Data Block 이벤트를 사용해 정의됩니다. 아래 추상 연산들은 Shared Data Block 이벤트를 도입하며, 평가 의미론과 메모리 모델의 이벤트 의미론 사이의 인터페이스 역할을 합니다. 이벤트들은 후보 실행(candidate execution)을 구성하며, 메모리 모델은 후보 실행에 필터로 작동합니다. 전체 의미론은 메모리 모델을 참고하세요.

Shared Data Block 이벤트는 메모리 모델에서 정의된 Record로 모델링됩니다.

이 명세에서 Data Block 값을 다루기 위해 다음과 같은 추상 연산을 사용합니다:

6.2.9.1 CreateByteDataBlock ( size )

The abstract operation CreateByteDataBlock takes argument size (0 이상 정수) and returns Data Block을 담는 normal completion 또는 throw completion. It performs the following steps when called:

  1. size > 253 - 1이면 RangeError 예외를 throw한다.
  2. dbsize 바이트로 구성된 새로운 Data Block 값으로 한다. 생성이 불가능하면 RangeError 예외를 throw한다.
  3. db의 모든 바이트를 0으로 설정한다.
  4. db를 반환한다.

6.2.9.2 CreateSharedByteDataBlock ( size )

The abstract operation CreateSharedByteDataBlock takes argument size (0 이상 정수) and returns Shared Data Block을 담는 normal completion 또는 throw completion. It performs the following steps when called:

  1. dbsize 바이트로 구성된 새로운 Shared Data Block 값으로 한다. 생성이 불가능하면 RangeError 예외를 throw한다.
  2. execution을 주위 agentAgent Record[[CandidateExecution]] 필드로 한다.
  3. eventsRecordexecution.[[EventsRecords]][[AgentSignifier]]AgentSignifier()인 Agent Events Record로 한다.
  4. zero를 « 0 »으로 한다.
  5. db의 각 인덱스 i에 대해,
    1. WriteSharedMemory { [[Order]]: init, [[NoTear]]: true, [[Block]]: db, [[ByteIndex]]: i, [[ElementSize]]: 1, [[Payload]]: zero }를 eventsRecord.[[EventList]]에 추가한다.
  6. db를 반환한다.

6.2.9.3 CopyDataBlockBytes ( toBlock, toIndex, fromBlock, fromIndex, count )

The abstract operation CopyDataBlockBytes takes arguments toBlock (Data Block 또는 Shared Data Block), toIndex (0 이상 정수), fromBlock (Data Block 또는 Shared Data Block), fromIndex (0 이상 정수), and count (0 이상 정수) and returns unused. It performs the following steps when called:

  1. 단언: fromBlocktoBlock은 서로 다른 값이다.
  2. fromSizefromBlock의 바이트 수로 한다.
  3. 단언: fromIndex + countfromSize이다.
  4. toSizetoBlock의 바이트 수로 한다.
  5. 단언: toIndex + counttoSize이다.
  6. count > 0 동안 반복한다,
    1. fromBlockShared Data Block이면,
      1. execution을 주위 agentAgent Record[[CandidateExecution]] 필드로 한다.
      2. eventsRecordexecution.[[EventsRecords]][[AgentSignifier]]AgentSignifier()인 Agent Events Record로 한다.
      3. bytes를 nondeterministically 선택된 byte value 1개만 담은 List로 한다.
      4. 참고: 구현에서 bytes는 기저 하드웨어에서 비원자적 읽기 명령 결과입니다. 이 nondeterminism은 하드웨어의 약한 일관성에서 관찰 가능한 행동을 설명하기 위한 메모리 모델의 의미론적 처방입니다.
      5. readEventReadSharedMemory { [[Order]]: unordered, [[NoTear]]: true, [[Block]]: fromBlock, [[ByteIndex]]: fromIndex, [[ElementSize]]: 1 }로 한다.
      6. readEventeventsRecord.[[EventList]]에 추가한다.
      7. Chosen Value Record { [[Event]]: readEvent, [[ChosenValue]]: bytes }를 execution.[[ChosenValues]]에 추가한다.
      8. toBlockShared Data Block이면,
        1. WriteSharedMemory { [[Order]]: unordered, [[NoTear]]: true, [[Block]]: toBlock, [[ByteIndex]]: toIndex, [[ElementSize]]: 1, [[Payload]]: bytes }를 eventsRecord.[[EventList]]에 추가한다.
      9. 아니면,
        1. toBlock[toIndex]를 bytes[0]로 설정한다.
    2. 아니면,
      1. 단언: toBlockShared Data Block이 아니다.
      2. toBlock[toIndex]를 fromBlock[fromIndex]로 설정한다.
    3. toIndextoIndex + 1로 한다.
    4. fromIndexfromIndex + 1로 한다.
    5. countcount - 1로 한다.
  7. unused를 반환한다.

6.2.10 PrivateElement 명세 타입

PrivateElement 타입은 private 클래스 필드, 메소드, 접근자 명세에 사용되는 Record입니다. Property Descriptor는 private element에 사용되지 않지만, private 필드는 비구성·비열거·쓰기 가능한 데이터 프로퍼티와, private 메소드는 비구성·비열거·쓰기 불가능한 데이터 프로퍼티와, private 접근자는 비구성·비열거 접근자 프로퍼티와 유사하게 동작합니다.

PrivateElement 타입의 값은 Table 9에 정의된 필드를 갖는 Record 값입니다. 이러한 값을 PrivateElement라 합니다.

Table 9: PrivateElement 필드
필드 이름 [[Kind]] 필드 값이 있을 때 의미
[[Key]] 전체 Private Name 필드, 메소드, 접근자의 이름
[[Kind]] 전체 field, method, accessor element의 종류
[[Value]] field, method ECMAScript 언어 값 필드의 값
[[Get]] accessor 함수 객체 또는 undefined private 접근자의 getter
[[Set]] accessor 함수 객체 또는 undefined private 접근자의 setter

6.2.11 ClassFieldDefinition Record 명세 타입

ClassFieldDefinition 타입은 클래스 필드 명세에 사용되는 Record입니다.

ClassFieldDefinition 타입의 값은 Table 10에 정의된 필드를 갖는 Record 값입니다. 이러한 값을 ClassFieldDefinition Record라 합니다.

Table 10: ClassFieldDefinition Record 필드
필드 이름 의미
[[Name]] Private Name, 문자열, 심볼 필드의 이름
[[Initializer]] ECMAScript 함수 객체 또는 empty 필드의 초기화 함수(있으면)

6.2.12 Private Name

Private Name 명세 타입은 전역적으로 고유한 값(다른 Private Name과 구별됨, 설령 구별 불가해 보여도)을 설명하는 데 사용됩니다. 이 값은 private 클래스 요소(필드, 메소드, 접근자)의 키를 나타냅니다. 각 Private Name은 불변의 [[Description]] 내부 슬롯을 가지며, 이는 문자열입니다. Private Name은 ECMAScript 객체에 PrivateFieldAdd 또는 PrivateMethodOrAccessorAdd로 설치할 수 있으며, PrivateGetPrivateSet을 통해 읽거나 쓸 수 있습니다.

6.2.13 ClassStaticBlockDefinition Record 명세 타입

ClassStaticBlockDefinition Record는 클래스 static 초기화 블록의 실행 코드를 캡슐화하는 데 사용되는 Record 값입니다.

ClassStaticBlockDefinition Record는 Table 11에 나열된 필드를 가집니다.

Table 11: ClassStaticBlockDefinition Record 필드
필드 이름 의미
[[BodyFunction]] ECMAScript 함수 객체 클래스 static 초기화 시 호출되는 함수 객체