페이지 표시 설정

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 타입은 true와 false라고 하는 두 값을 갖는 논리적 개체를 나타냅니다.

6.1.4 String 타입

String 타입은 0개 이상의 16비트 부호 없는 정숫값(“요소”)으로 이루어진 모든 순서 있는 시퀀스의 집합이며, 최대 길이는 253 - 1개 요소입니다. String 타입은 일반적으로 실행 중인 ECMAScript 프로그램의 텍스트 데이터를 나타내는 데 사용되며, 이 경우 String의 각 요소는 UTF-16 코드 단위 값으로 취급됩니다. 각 요소는 시퀀스 내의 한 위치를 차지하는 것으로 간주됩니다. 이러한 위치는 음이 아닌 정수로 인덱싱됩니다. 첫 번째 요소가 있으면 인덱스 0에 있고, 다음 요소가 있으면 인덱스 1에 있으며, 이후에도 같은 방식으로 이어집니다. String의 길이는 그 안에 포함된 요소(즉, 16비트 값)의 개수입니다. 빈 String의 길이는 0이므로 요소를 포함하지 않습니다.

String 내용을 해석하지 않는 ECMAScript 연산은 추가적인 의미론을 적용하지 않습니다. String 값을 해석하는 연산은 각 요소를 하나의 UTF-16 코드 단위로 취급합니다. 그러나 ECMAScript는 이러한 코드 단위의 값이나 코드 단위 사이의 관계를 제한하지 않으므로, String 내용을 UTF-16으로 인코딩된 유니코드 코드 포인트 시퀀스로 추가 해석하는 연산은 올바르지 않은 부분 시퀀스를 고려해야 합니다. 이러한 연산은 숫자 값이 0xD800부터 0xDBFF까지의 닫힌 구간에 있는 모든 코드 단위(유니코드 표준에서 선행 서로게이트, 더 공식적으로는 상위 서로게이트 코드 단위로 정의됨)와 숫자 값이 0xDC00부터 0xDFFF까지의 닫힌 구간에 있는 모든 코드 단위(후행 서로게이트, 더 공식적으로는 하위 서로게이트 코드 단위로 정의됨)를 다음 규칙에 따라 특별하게 취급합니다:

String.prototype.normalize 함수(22.1.3.15 참조)를 사용하여 String 값을 명시적으로 정규화할 수 있습니다. String.prototype.localeCompare(22.1.3.12 참조)는 내부적으로 String 값을 정규화하지만, 다른 어떤 연산도 자신이 처리하는 String을 암묵적으로 정규화하지 않습니다. 달리 명시되지 않는 한 연산 결과는 언어 및/또는 로케일에 민감하지 않습니다.

참고

이 설계의 근거는 String의 구현을 가능한 한 단순하고 고성능으로 유지하기 위한 것입니다. ECMAScript 소스 텍스트가 정규화 형식 C인 경우, 문자열 리터럴에 유니코드 이스케이프 시퀀스가 포함되지 않는 한 문자열 리터럴도 정규화되어 있음이 보장됩니다.

이 명세에서 “A, B, ...의 문자열 연결”이라는 문구(각 인수는 String 값, 코드 단위 또는 코드 단위 시퀀스입니다)는 각 인수의 코드 단위를 인수 순서대로 연결한 코드 단위 시퀀스를 갖는 String 값을 나타냅니다.

“string의 inclusiveStart부터 exclusiveEnd까지의 부분 문자열”이라는 문구(string은 String 값 또는 코드 단위 시퀀스이고 inclusiveStart와 exclusiveEnd는 정수입니다)는 string에서 인덱스 inclusiveStart로 시작하여 인덱스 exclusiveEnd 바로 앞에서 끝나는 연속 코드 단위로 구성된 String 값을 나타냅니다(inclusiveStart = exclusiveEnd이면 빈 String입니다). “to” 접미사가 생략되면 string의 길이가 exclusiveEnd 값으로 사용됩니다.

“ASCII 단어 문자”라는 문구는 유니코드 기본 라틴 블록의 모든 문자와 숫자 및 U+005F (LOW LINE)만으로 구성된 다음 String 값을 나타냅니다:
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_".
역사적인 이유로 이는 여러 알고리즘에서 중요한 의미를 갖습니다.

6.1.4.1 StringIndexOf ( string, searchValue, fromIndex )

추상 연산 StringIndexOf. 인수 string (String), searchValue (String) 및 fromIndex (음이 아닌 정수). 반환값: 음이 아닌 정수 또는 not-found. 호출되면 다음 단계를 수행한다.

  1. length를 string의 길이로 둡니다.
  2. searchValue가 빈 String이고 fromIndex ≤ length이면, fromIndex를 반환합니다.
  3. searchLength를 searchValue의 길이로 둡니다.
  4. fromIndex ≤ i ≤ length - searchLength를 만족하는 각 정수 i에 대해 오름차순으로 다음을 수행합니다.
    1. candidate를 string의 i부터 i + searchLength까지의 부분 문자열로 둡니다.
    2. candidate가 searchValue이면, i를 반환합니다.
  5. not-found를 반환합니다.
참고 1

searchValue가 빈 String이고 fromIndex ≤ string의 길이이면, 이 알고리즘은 fromIndex를 반환합니다. 빈 String은 마지막 코드 단위 뒤를 포함하여 문자열 내의 모든 위치에서 사실상 발견됩니다.

참고 2

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

6.1.4.2 StringLastIndexOf ( string, searchValue, fromIndex )

추상 연산 StringLastIndexOf. 인수 string (String), searchValue (String) 및 fromIndex (음이 아닌 정수). 반환값: 음이 아닌 정수 또는 not-found. 호출되면 다음 단계를 수행한다.

  1. length를 string의 길이로 둡니다.
  2. searchLength를 searchValue의 길이로 둡니다.
  3. 단언: fromIndex + searchLength ≤ length입니다.
  4. 0 ≤ i ≤ fromIndex를 만족하는 각 정수 i에 대해 내림차순으로 다음을 수행합니다.
    1. candidate를 string의 i부터 i + searchLength까지의 부분 문자열로 둡니다.
    2. candidate가 searchValue이면, i를 반환합니다.
  5. not-found를 반환합니다.
참고

searchValue가 빈 String이면 이 알고리즘은 fromIndex를 반환합니다. 빈 String은 마지막 코드 단위 뒤를 포함하여 문자열 내의 모든 위치에서 사실상 발견됩니다.

6.1.5 Symbol 타입

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

각 Symbol은 고유하며 변경할 수 없습니다.

각 Symbol에는 값이 String 또는 undefined인 변경 불가능한 [[Description]] 내부 슬롯이 있습니다.

6.1.5.1 잘 알려진 Symbol

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

이 명세에서 잘 알려진 Symbol은 표준 내재 표기법을 사용하여 참조하며, 여기에서 내재 객체는 표 1에 나열된 값 중 하나입니다.

참고
이 명세의 이전 판에서는 현재 판에서 %Symbol.name%을 사용하는 곳에 @@name 형식의 표기법을 사용했습니다. 구체적으로 다음 이름이 사용되었습니다: @@asyncIterator, @@hasInstance, @@isConcatSpreadable, @@iterator, @@match, @@matchAll, @@replace, @@search, @@species, @@split, @@toPrimitive, @@toStringTag 및 @@unscopables.
표 1: 잘 알려진 Symbol
명세 이름 [[Description]] 값과 목적
%Symbol.asyncDispose% "Symbol.asyncDispose" 객체에서 리소스 정리를 비동기적으로 수행하는 메서드입니다. 포함하는 스코프의 평가가 완료될 때 AsyncDisposableStack 객체와 await using 선언에서 호출됩니다.
%Symbol.asyncIterator% "Symbol.asyncIterator" 객체의 기본 비동기 이터레이터를 반환하는 메서드입니다. for-await-of 문의 의미론에서 호출됩니다.
%Symbol.dispose% "Symbol.dispose" 객체에서 명시적인 리소스 정리를 수행하는 메서드입니다. 포함하는 스코프의 평가가 완료될 때 DisposableStack 객체, AsyncDisposableStack 객체 및 using 선언에서 호출됩니다.
%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라는 두 개의 내장 숫자 타입이 있습니다. 다음 추상 연산은 이러한 숫자 타입에 대해 정의됩니다. “결과” 열에는 반환 타입과 함께 연산의 일부 호출이 비정상 완료를 반환할 가능성이 있는지를 표시합니다.

표 2: 숫자 타입 연산
연산 예제 소스 ...의 Evaluation 의미론에서 호출 결과
Number::unaryMinus -x 단항 - 연산자 Number
BigInt::unaryMinus BigInt
Number::bitwiseNOT ~x 비트 NOT 연산자 ( ~ ) Number
BigInt::bitwiseNOT BigInt
Number::exponentiate x ** y 지수 연산자 및 Math.pow ( base, exponent ) Number
BigInt::exponentiate BigInt를 포함하는 정상 완료 또는 던지기 완료
Number::multiply x * y 곱셈 연산자 Number
BigInt::multiply BigInt
Number::divide x / y 곱셈 연산자 Number
BigInt::divide BigInt를 포함하는 정상 완료 또는 던지기 완료
Number::remainder x % y 곱셈 연산자 Number
BigInt::remainder BigInt를 포함하는 정상 완료 또는 던지기 완료
Number::add x ++
++ x
x + y
후위 증가 연산자, 전위 증가 연산자, 및 덧셈 연산자 ( + ) Number
BigInt::add BigInt
Number::subtract x --
-- x
x - y
후위 감소 연산자, 전위 감소 연산자, 및 뺄셈 연산자 ( - ) Number
BigInt::subtract BigInt
Number::leftShift x << y 왼쪽 시프트 연산자 ( << ) Number
BigInt::leftShift BigInt
Number::signedRightShift x >> y 부호 있는 오른쪽 시프트 연산자 ( >> ) Number
BigInt::signedRightShift BigInt
Number::unsignedRightShift x >>> y 부호 없는 오른쪽 시프트 연산자 ( >>> ) Number
BigInt::unsignedRightShift 던지기 완료
Number::lessThan x < y
x > y
x <= y
x >= y
관계 연산자, IsLessThan ( x, y, leftFirst )를 통해 Boolean 또는 undefined (순서가 없는 입력의 경우)
BigInt::lessThan Boolean
Number::equal x == y
x != y
x === y
x !== y
동등 연산자, IsStrictlyEqual ( x, y )를 통해 Boolean
BigInt::equal
Number::sameValue Object.is(x, y) Object 내부 메서드에서, SameValue ( x, y )를 통해, 정확한 값 동등성을 검사하기 위해 사용 Boolean
Number::sameValueZero [x].includes(y) SameValueZero ( x, y )를 통해, Array, Map 및 Set 메서드에서처럼 +0𝔽과 -0𝔽의 차이를 무시하여 값 동등성을 검사하기 위해 사용 Boolean
Number::bitwiseAND x & y 이항 비트 연산자 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 ( arg )를 통해 호출 String
BigInt::toString

숫자 타입은 일반적으로 정밀도 손실이나 잘림 없이 서로 변환할 수 없으므로 ECMAScript 언어는 이러한 타입 사이에 암묵적 변환을 제공하지 않습니다. 다른 타입을 요구하는 함수를 호출할 때 타입을 변환하려면 프로그래머가 Number 및 BigInt 함수를 명시적으로 호출해야 합니다.

참고

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 값을 서로 구별할 수 없습니다.

참고

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

양의 무한대와 음의 무한대라고 하는 두 개의 다른 특수 값이 있습니다. 간결하게 설명하기 위해 이러한 값은 각각 기호 +∞𝔽와 -∞𝔽로도 지칭합니다. (이 두 무한 Number 값은 프로그램 표현식 +Infinity(또는 단순히 Infinity)와 -Infinity에 의해 생성된다는 점에 유의하십시오.)

나머지 18,437,736,874,454,810,624개(즉, 264 - 253)의 각 값은 유한 Number입니다. 이 중 절반은 양수이고 절반은 음수입니다. 모든 양의 유한 Number에는 크기가 같은 대응하는 음의 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𝔽를 가집니다.

유한 Number가 0이 아니고 이를 표현하는 데 사용되는 정수 m(위에 표시된 두 형식 중 하나에서)가 홀수이면 홀수 유효숫자를 가집니다. 그렇지 않으면 짝수 유효숫자를 가집니다.

이 명세에서 x가 정확한 실수의 수학적 양(π와 같은 무리수일 수도 있음)을 나타낼 때 “x에 대한 Number 값”이라는 구문은 다음 방식으로 선택된 Number 값을 의미합니다. -0𝔽를 제외한 모든 유한 Number의 합집합에 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까지의 양 끝을 포함하는 구간이나 0부터 216 - 1까지의 양 끝을 포함하는 구간과 같은 특정 범위의 정수만 처리합니다. 이러한 연산자는 Number 타입의 모든 값을 허용하지만, 먼저 각 값을 예상 범위의 정수 값으로 변환합니다. 7.1의 숫자 변환 연산에 대한 설명을 참조하십시오.

6.1.6.1.1 Number::unaryMinus ( number )

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

  1. number가 NaN이면, NaN을 반환합니다.
  2. number의 부정값, 즉 크기는 같지만 부호가 반대인 Number를 계산하여 반환합니다.

6.1.6.1.2 Number::bitwiseNOT ( number )

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

  1. oldValue를 ! ToInt32(number)로 둡니다.
  2. oldValue의 비트 보수를 반환합니다. 결과의 수학적 값은 32비트 2의 보수 비트 문자열로 정확하게 표현할 수 있습니다.

6.1.6.1.3 Number::exponentiate ( base, exponent )

추상 연산 Number::exponentiate. 인수 base (Number) 및 exponent (Number). 반환값: Number. base를 exponent 제곱한 결과를 나타내는 구현체 근사 값을 반환합니다. 호출되면 다음 단계를 수행한다.

  1. exponent가 NaN이면 NaN을 반환합니다.
  2. exponent가 +0𝔽 또는 -0𝔽 중 하나이면 1𝔽을 반환합니다.
  3. base가 NaN이면 NaN을 반환합니다.
  4. base가 +∞𝔽이면 다음을 수행합니다.
    1. exponent > +0𝔽이면 +∞𝔽을 반환합니다.
    2. +0𝔽을 반환합니다.
  5. base가 -∞𝔽이면 다음을 수행합니다.
    1. exponent > +0𝔽이면 다음을 수행합니다.
      1. exponent가 홀수인 정수 Number이면 -∞𝔽을 반환합니다.
      2. +∞𝔽을 반환합니다.
    2. exponent가 홀수인 정수 Number이면 -0𝔽을 반환합니다.
    3. +0𝔽을 반환합니다.
  6. base가 +0𝔽이면 다음을 수행합니다.
    1. exponent > +0𝔽이면 +0𝔽을 반환합니다.
    2. +∞𝔽을 반환합니다.
  7. base가 -0𝔽이면 다음을 수행합니다.
    1. exponent > +0𝔽이면 다음을 수행합니다.
      1. exponent가 홀수인 정수 Number이면 -0𝔽을 반환합니다.
      2. +0𝔽을 반환합니다.
    2. exponent가 홀수인 정수 Number이면 -∞𝔽을 반환합니다.
    3. +∞𝔽을 반환합니다.
  8. 단언: base는 유한 Number이며 +0𝔽도 -0𝔽도 아닙니다.
  9. exponent가 +∞𝔽이면 다음을 수행합니다.
    1. abs(ℝ(base)) > 1이면 +∞𝔽을 반환합니다.
    2. abs(ℝ(base)) = 1이면 NaN을 반환합니다.
    3. +0𝔽을 반환합니다.
  10. exponent가 -∞𝔽이면 다음을 수행합니다.
    1. abs(ℝ(base)) > 1이면 +0𝔽을 반환합니다.
    2. abs(ℝ(base)) = 1이면 NaN을 반환합니다.
    3. +∞𝔽을 반환합니다.
  11. 단언: exponent는 유한 Number이며 +0𝔽도 -0𝔽도 아닙니다.
  12. base < -0𝔽이고 exponent가 정수 Number가 아니면 NaN을 반환합니다.
  13. ℝ(base)를 ℝ(exponent) 제곱한 결과를 나타내는 구현에서 근사한 Number 값을 반환합니다.
참고

base가 1𝔽 또는 -1𝔽이고 exponent가 +∞𝔽 또는 -∞𝔽인 경우, 또는 base가 1𝔽이고 exponent가 NaN인 경우의 base ** exponent 결과는 IEEE 754-2019와 다릅니다. ECMAScript 초판은 이 연산의 결과를 NaN으로 명시했지만, 이후 IEEE 754 개정판은 1𝔽을 명시했습니다. 호환성을 위해 역사적인 ECMAScript 동작을 유지합니다.

6.1.6.1.4 Number::multiply ( x, y )

추상 연산 Number::multiply. 인수 x (Number) 및 y (Number). 반환값: Number. IEEE 754-2019 이진 배정밀도 산술 규칙에 따라 곱셈을 수행하여 x와 y의 곱을 생성합니다. 호출되면 다음 단계를 수행한다.

  1. x가 NaN이거나 y가 NaN이면, 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))를 반환합니다.
참고

유한 정밀도 곱셈은 교환법칙을 만족하지만 항상 결합법칙을 만족하는 것은 아닙니다.

6.1.6.1.5 Number::divide ( x, y )

추상 연산 Number::divide. 인수 x (Number) 및 y (Number). 반환값: Number. IEEE 754-2019 이진 배정밀도 산술 규칙에 따라 나눗셈을 수행하며, x가 피제수이고 y가 제수인 x와 y의 몫을 생성합니다. 호출되면 다음 단계를 수행한다.

  1. x가 NaN이거나 y가 NaN이면, NaN을 반환합니다.
  2. x가 +∞𝔽 또는 -∞𝔽이면, 다음을 수행합니다.
    1. y가 +∞𝔽 또는 -∞𝔽이면, NaN을 반환합니다.
    2. y가 +0𝔽이거나 y > +0𝔽이면, x를 반환합니다.
    3. -x를 반환합니다.
  3. y가 +∞𝔽이면, 다음을 수행합니다.
    1. x가 +0𝔽이거나 x > +0𝔽이면, +0𝔽을 반환합니다.
    2. -0𝔽을 반환합니다.
  4. y가 -∞𝔽이면, 다음을 수행합니다.
    1. x가 +0𝔽이거나 x > +0𝔽이면, -0𝔽을 반환합니다.
    2. +0𝔽을 반환합니다.
  5. x가 +0𝔽 또는 -0𝔽이면, 다음을 수행합니다.
    1. y가 +0𝔽 또는 -0𝔽이면, NaN을 반환합니다.
    2. y > +0𝔽이면, x를 반환합니다.
    3. -x를 반환합니다.
  6. y가 +0𝔽이면, 다음을 수행합니다.
    1. x > +0𝔽이면, +∞𝔽을 반환합니다.
    2. -∞𝔽을 반환합니다.
  7. y가 -0𝔽이면, 다음을 수행합니다.
    1. x > +0𝔽이면, -∞𝔽을 반환합니다.
    2. +∞𝔽을 반환합니다.
  8. 𝔽(ℝ(x) / ℝ(y))를 반환합니다.

6.1.6.1.6 Number::remainder ( numerator, denominator )

추상 연산 Number::remainder. 인수 numerator (Number) 및 denominator (Number). 반환값: Number. 피연산자의 암묵적인 나눗셈에서 나머지를 생성하며, 여기에서 numerator는 피제수이고 denominator는 제수입니다. 호출되면 다음 단계를 수행한다.

  1. numerator가 NaN이거나 denominator가 NaN이면 NaN을 반환합니다.
  2. numerator가 +∞𝔽 또는 -∞𝔽 중 하나이면 NaN을 반환합니다.
  3. denominator가 +∞𝔽 또는 -∞𝔽 중 하나이면 numerator를 반환합니다.
  4. denominator가 +0𝔽 또는 -0𝔽 중 하나이면 NaN을 반환합니다.
  5. numerator가 +0𝔽 또는 -0𝔽 중 하나이면 numerator를 반환합니다.
  6. 단언: numerator는 유한 Number이며 +0𝔽도 -0𝔽도 아닙니다.
  7. 단언: denominator는 유한 Number이며 +0𝔽도 -0𝔽도 아닙니다.
  8. quotient를 ℝ(numerator) / ℝ(denominator)로 둡니다.
  9. truncatedQuotient를 truncate(quotient)로 둡니다.
  10. remainder를 ℝ(numerator) - (ℝ(denominator) × truncatedQuotient)로 둡니다.
  11. remainder = 0이고 numerator < -0𝔽이면 -0𝔽을 반환합니다.
  12. 𝔽(remainder)를 반환합니다.
참고 1

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

참고 2
% 연산자가 계산하는 부동소수점 나머지 연산의 결과는 IEEE 754-2019에서 정의한 “나머지” 연산과 같지 않습니다. IEEE 754-2019의 “나머지” 연산은 절삭 나눗셈이 아니라 반올림 나눗셈에서 나머지를 계산하므로 일반적인 정수 나머지 연산자의 동작과 유사하지 않습니다. 대신 ECMAScript 언어는 부동소수점 연산에 대한 %가 Java의 정수 나머지 연산자와 유사하게 동작하도록 정의합니다. 이는 C 라이브러리 함수 fmod와 비교할 수 있습니다.

6.1.6.1.7 Number::add ( x, y )

추상 연산 Number::add. 인수 x (Number) 및 y (Number). 반환값: Number. IEEE 754-2019 이진 배정밀도 산술 규칙에 따라 덧셈을 수행하여 인수의 합을 생성합니다. 호출되면 다음 단계를 수행한다.

  1. x가 NaN이거나 y가 NaN이면 NaN을 반환합니다.
  2. x가 +∞𝔽이고 y가 -∞𝔽이면 NaN을 반환합니다.
  3. x가 -∞𝔽이고 y가 +∞𝔽이면 NaN을 반환합니다.
  4. x가 +∞𝔽 또는 -∞𝔽 중 하나이면 x를 반환합니다.
  5. y가 +∞𝔽 또는 -∞𝔽 중 하나이면 y를 반환합니다.
  6. 단언: x와 y는 유한 Number입니다.
  7. x가 -0𝔽이고 y가 -0𝔽이면 -0𝔽을 반환합니다.
  8. 𝔽(ℝ(x) + ℝ(y))를 반환합니다.
참고

유한 정밀도 덧셈은 교환법칙을 만족하지만 항상 결합법칙을 만족하는 것은 아닙니다.

6.1.6.1.8 Number::subtract ( x, y )

추상 연산 Number::subtract. 인수 x (Number) 및 y (Number). 반환값: Number. 뺄셈을 수행하여 피연산자의 차를 생성합니다. x는 피감수이고 y는 감수입니다. 호출되면 다음 단계를 수행한다.

  1. Number::add(x, Number::unaryMinus(y))를 반환합니다.
참고

x - y는 항상 x + (-y)와 같은 결과를 생성합니다.

6.1.6.1.9 Number::leftShift ( x, y )

추상 연산 Number::leftShift. 인수 x (Number) 및 y (Number). 반환값: 정수인 Number. 호출되면 다음 단계를 수행한다.

  1. leftNumber를 ! ToInt32(x)로 둡니다.
  2. rightNumber를 ! ToUint32(y)로 둡니다.
  3. shiftCount를 ℝ(rightNumber) modulo 32로 둡니다.
  4. leftNumber를 shiftCount비트만큼 왼쪽으로 시프트한 결과를 반환합니다. 결과의 수학적 값은 32비트 2의 보수 비트 문자열로 정확하게 표현할 수 있습니다.

6.1.6.1.10 Number::signedRightShift ( x, y )

추상 연산 Number::signedRightShift. 인수 x (Number) 및 y (Number). 반환값: 정수인 Number. 호출되면 다음 단계를 수행한다.

  1. leftNumber를 ! ToInt32(x)로 둡니다.
  2. rightNumber를 ! ToUint32(y)로 둡니다.
  3. shiftCount를 ℝ(rightNumber) modulo 32로 둡니다.
  4. leftNumber를 shiftCount비트만큼 부호 확장 오른쪽 시프트한 결과를 반환합니다. 최상위 비트가 전파됩니다. 결과의 수학적 값은 32비트 2의 보수 비트 문자열로 정확하게 표현할 수 있습니다.

6.1.6.1.11 Number::unsignedRightShift ( x, y )

추상 연산 Number::unsignedRightShift. 인수 x (Number) 및 y (Number). 반환값: 정수인 Number. 호출되면 다음 단계를 수행한다.

  1. leftNumber를 ! ToUint32(x)로 둡니다.
  2. rightNumber를 ! ToUint32(y)로 둡니다.
  3. shiftCount를 ℝ(rightNumber) modulo 32로 둡니다.
  4. leftNumber를 shiftCount비트만큼 0 채움 오른쪽 시프트한 결과를 반환합니다. 비워진 비트는 0으로 채워집니다. 결과의 수학적 값은 32비트 부호 없는 비트 문자열로 정확하게 표현할 수 있습니다.

6.1.6.1.12 Number::lessThan ( x, y )

추상 연산 Number::lessThan. 인수 x (Number) 및 y (Number). 반환값: Boolean 또는 undefined. 호출되면 다음 단계를 수행한다.

  1. x가 NaN이면 undefined를 반환합니다.
  2. y가 NaN이면 undefined를 반환합니다.
  3. x가 y이면 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. 단언: x와 y는 유한 Number입니다.
  11. ℝ(x) < ℝ(y)이면 true를 반환합니다.
  12. false를 반환합니다.

6.1.6.1.13 Number::equal ( x, y )

추상 연산 Number::equal. 인수 x (Number) 및 y (Number). 반환값: Boolean. 호출되면 다음 단계를 수행한다.

  1. x가 NaN이면, false를 반환합니다.
  2. y가 NaN이면, false를 반환합니다.
  3. x가 y이면, true를 반환합니다.
  4. x가 +0𝔽이고 y가 -0𝔽이면, true를 반환합니다.
  5. x가 -0𝔽이고 y가 +0𝔽이면, true를 반환합니다.
  6. false를 반환합니다.

6.1.6.1.14 Number::sameValue ( x, y )

추상 연산 Number::sameValue. 인수 x (Number) 및 y (Number). 반환값: Boolean. 호출되면 다음 단계를 수행한다.

  1. x가 NaN이고 y가 NaN이면, true를 반환합니다.
  2. x가 +0𝔽이고 y가 -0𝔽이면, false를 반환합니다.
  3. x가 -0𝔽이고 y가 +0𝔽이면, false를 반환합니다.
  4. x가 y이면, true를 반환합니다.
  5. false를 반환합니다.

6.1.6.1.15 Number::sameValueZero ( x, y )

추상 연산 Number::sameValueZero. 인수 x (Number) 및 y (Number). 반환값: Boolean. 호출되면 다음 단계를 수행한다.

  1. x가 NaN이고 y가 NaN이면, true를 반환합니다.
  2. x가 +0𝔽이고 y가 -0𝔽이면, true를 반환합니다.
  3. x가 -0𝔽이고 y가 +0𝔽이면, true를 반환합니다.
  4. x가 y이면, true를 반환합니다.
  5. false를 반환합니다.

6.1.6.1.16 NumberBitwiseOp ( op, x, y )

추상 연산 NumberBitwiseOp. 인수 op ((&, ^ 또는 |)), x (Number) 및 y (Number). 반환값: 정수인 Number. 호출되면 다음 단계를 수행한다.

  1. leftNumber를 ! ToInt32(x)로 둡니다.
  2. rightNumber를 ! ToInt32(y)로 둡니다.
  3. leftBits를 ℝ(leftNumber)를 나타내는 32비트 2의 보수 비트 문자열로 둡니다.
  4. rightBits를 ℝ(rightNumber)를 나타내는 32비트 2의 보수 비트 문자열로 둡니다.
  5. op가 &이면,
    1. result를 leftBits와 rightBits에 비트 단위 AND 연산을 적용한 결과로 둡니다.
  6. 그렇지 않고 op가 ^이면,
    1. result를 leftBits와 rightBits에 비트 단위 XOR(배타적 OR) 연산을 적용한 결과로 둡니다.
  7. 그렇지 않으면,
    1. 단언: op는 |입니다.
    2. result를 leftBits와 rightBits에 비트 단위 OR(포괄적 OR) 연산을 적용한 결과로 둡니다.
  8. 32비트 2의 보수 비트 문자열 result가 나타내는 정수에 해당하는 Number 값을 반환합니다.

6.1.6.1.17 Number::bitwiseAND ( x, y )

추상 연산 Number::bitwiseAND. 인수 x (Number) 및 y (Number). 반환값: 정수인 Number. 호출되면 다음 단계를 수행한다.

  1. NumberBitwiseOp(&, x, y)를 반환합니다.

6.1.6.1.18 Number::bitwiseXOR ( x, y )

추상 연산 Number::bitwiseXOR. 인수 x (Number) 및 y (Number). 반환값: 정수인 Number. 호출되면 다음 단계를 수행한다.

  1. NumberBitwiseOp(^, x, y)를 반환합니다.

6.1.6.1.19 Number::bitwiseOR ( x, y )

추상 연산 Number::bitwiseOR. 인수 x (Number) 및 y (Number). 반환값: 정수인 Number. 호출되면 다음 단계를 수행한다.

  1. NumberBitwiseOp(|, x, y)를 반환합니다.

6.1.6.1.20 Number::toString ( x, radix )

추상 연산 Number::toString. 인수 x (Number) 및 radix (an integer within the closed interval from 2 to 36). 반환값: String. 기수가 radix인 위치 기수법을 사용하여 x를 String으로 나타냅니다. 기수 r을 사용한 수의 표현에 사용되는 숫자는 "0123456789abcdefghijklmnopqrstuvwxyz"의 처음 r개 코드 단위에서 순서대로 가져옵니다. 크기가 1𝔽 이상인 수의 표현에는 선행 0이 포함되지 않습니다. 호출되면 다음 단계를 수행한다.

  1. x가 NaN이면, "NaN"을 반환합니다.
  2. x가 +0𝔽 또는 -0𝔽이면, "0"을 반환합니다.
  3. x < -0𝔽이면, "-"와 Number::toString(-x, radix)의 문자열 연결을 반환합니다.
  4. x가 +∞𝔽이면, "Infinity"를 반환합니다.
  5. k ≥ 1이고, radixk - 1 ≤ s < radixk이며, 𝔽(s × radixn - k)가 x이고, k가 가능한 한 작은 정수 n, k 및 s를 둡니다. k는 기수 radix를 사용한 s 표현의 자릿수이고, s는 radix로 나누어떨어지지 않으며, 이러한 기준만으로 s의 최하위 자릿수가 반드시 고유하게 결정되는 것은 아니라는 점에 유의하시기 바랍니다.
  6. radix ≠ 10이거나 n이 -5부터 21까지의 닫힌 구간에 있으면, 다음을 수행합니다.
    1. n ≥ k이면, 다음을 수행합니다.
      1. 다음의 문자열 연결을 반환합니다:
        • 기수 radix를 사용한 s 표현의 k개 숫자의 코드 단위
        • 코드 단위 0x0030 (DIGIT ZERO)의 n - k개 발생
    2. n > 0이면, 다음을 수행합니다.
      1. 다음의 문자열 연결을 반환합니다:
        • 기수 radix를 사용한 s 표현의 최상위 n개 숫자의 코드 단위
        • 코드 단위 0x002E (FULL STOP)
        • 기수 radix를 사용한 s 표현의 나머지 k - n개 숫자의 코드 단위
    3. 단언: n ≤ 0입니다.
    4. 다음의 문자열 연결을 반환합니다:
      • 코드 단위 0x0030 (DIGIT ZERO)
      • 코드 단위 0x002E (FULL STOP)
      • 코드 단위 0x0030 (DIGIT ZERO)의 -n개 발생
      • 기수 radix를 사용한 s 표현의 k개 숫자의 코드 단위
  7. 참고: 이 경우 입력은 1.2e+3과 같은 과학적 E 표기법을 사용하여 표현됩니다.
  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)의 십진 표현의 코드 단위
  12. 다음의 문자열 연결을 반환합니다:
    • s의 십진 표현에서 최상위 숫자의 코드 단위
    • 코드 단위 0x002E (FULL STOP)
    • s의 십진 표현에서 나머지 k - 1개 숫자의 코드 단위
    • 코드 단위 0x0065 (LATIN SMALL LETTER E)
    • exponentSign
    • abs(n - 1)의 십진 표현의 코드 단위
참고 1

다음 관찰 사항은 구현체를 위한 지침으로 유용할 수 있지만 이 표준의 규범적 요구 사항에 포함되지는 않습니다:

  • x가 -0𝔽 이외의 임의의 Number 값이면 ToNumber(ToString(x))는 x입니다.
  • s의 최하위 자릿수는 5 단계에 나열된 요구 사항만으로 항상 고유하게 결정되는 것은 아닙니다.
참고 2

위 규칙에서 요구하는 것보다 더 정확한 변환을 제공하는 구현체에는 다음과 같은 5 단계의 대체 버전을 지침으로 사용할 것을 권장합니다:

  1. k ≥ 1이고, radixk - 1 ≤ s < radixk이며, 𝔽(s × radixn - k)가 x이고, k가 가능한 한 작은 정수 n, k 및 s를 둡니다. s에 여러 가능성이 있으면 s × radixn - k가 ℝ(x)에 가장 가까워지는 s를 선택합니다. 그러한 가능한 s 값이 두 개이면 짝수인 값을 선택합니다. k는 기수 radix를 사용한 s 표현의 자릿수이고 s는 radix로 나누어떨어지지 않는다는 점에 유의하시기 바랍니다.
참고 3

ECMAScript 구현자는 부동소수점 수의 이진-십진 변환을 위해 David M. Gay가 작성한 다음 논문과 코드를 유용하게 활용할 수 있습니다:

Gay, David M. 정확하게 반올림된 이진-십진 및 십진-이진 변환. Numerical Analysis, Manuscript 90-10. AT&T Bell Laboratories (Murray Hill, New Jersey). 30 November 1990. 다음에서 이용할 수 있습니다
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 ( bigint )

추상 연산 BigInt::unaryMinus. 인수 bigint (BigInt). 반환값: BigInt. 호출되면 다음 단계를 수행한다.

  1. bigint = 0ℤ이면, 0ℤ을 반환합니다.
  2. -bigint를 반환합니다.

6.1.6.2.2 BigInt::bitwiseNOT ( bigint )

추상 연산 BigInt::bitwiseNOT. 인수 bigint (BigInt). 반환값: BigInt. bigint의 1의 보수를 반환합니다. 호출되면 다음 단계를 수행한다.

  1. -bigint - 1ℤ을 반환합니다.

6.1.6.2.3 BigInt::exponentiate ( base, exponent )

추상 연산 BigInt::exponentiate. 인수 base (BigInt) 및 exponent (BigInt). 반환값: BigInt를 포함하는 정상 완료 또는 던지기 완료. 호출되면 다음 단계를 수행한다.

  1. exponent < 0ℤ이면, RangeError 예외를 던집니다.
  2. base = 0ℤ이고 exponent = 0ℤ이면, 1ℤ을 반환합니다.
  3. base를 exponent 제곱한 값을 반환합니다.

6.1.6.2.4 BigInt::multiply ( x, y )

추상 연산 BigInt::multiply. 인수 x (BigInt) 및 y (BigInt). 반환값: BigInt. 호출되면 다음 단계를 수행한다.

  1. x × y를 반환합니다.
참고
결과의 비트 너비가 입력보다 훨씬 크더라도 정확한 수학적 결과가 제공됩니다.

6.1.6.2.5 BigInt::divide ( x, y )

추상 연산 BigInt::divide. 인수 x (BigInt) 및 y (BigInt). 반환값: BigInt를 포함하는 정상 완료 또는 던지기 완료. 호출되면 다음 단계를 수행한다.

  1. y = 0ℤ이면, RangeError 예외를 던집니다.
  2. quotient를 ℝ(x) / ℝ(y)로 둡니다.
  3. ℤ(truncate(quotient))를 반환합니다.

6.1.6.2.6 BigInt::remainder ( numerator, denominator )

추상 연산 BigInt::remainder. 인수 numerator (BigInt) 및 denominator (BigInt). 반환값: BigInt를 포함하는 정상 완료 또는 던지기 완료. 호출되면 다음 단계를 수행한다.

  1. denominator = 0ℤ이면, RangeError 예외를 던집니다.
  2. numerator = 0ℤ이면, 0ℤ을 반환합니다.
  3. quotient를 ℝ(numerator) / ℝ(denominator)로 둡니다.
  4. truncatedQuotient를 ℤ(truncate(quotient))로 둡니다.
  5. numerator - (denominator × truncatedQuotient)를 반환합니다.
참고
결과의 부호는 피제수의 부호입니다.

6.1.6.2.7 BigInt::add ( x, y )

추상 연산 BigInt::add. 인수 x (BigInt) 및 y (BigInt). 반환값: BigInt. 호출되면 다음 단계를 수행한다.

  1. x + y를 반환합니다.

6.1.6.2.8 BigInt::subtract ( x, y )

추상 연산 BigInt::subtract. 인수 x (BigInt) 및 y (BigInt). 반환값: BigInt. 호출되면 다음 단계를 수행한다.

  1. x - y를 반환합니다.

6.1.6.2.9 BigInt::leftShift ( x, y )

추상 연산 BigInt::leftShift. 인수 x (BigInt) 및 y (BigInt). 반환값: BigInt. 호출되면 다음 단계를 수행한다.

  1. y < 0ℤ이면, 다음을 수행합니다.
    1. ℤ(floor(ℝ(x) / 2-ℝ(y)))를 반환합니다.
  2. x × 2ℤy를 반환합니다.
참고
여기에서의 의미론은 BigInt를 길이가 무한한 이진 2의 보수 숫자 문자열로 취급하는 비트 시프트와 동등해야 합니다.

6.1.6.2.10 BigInt::signedRightShift ( x, y )

추상 연산 BigInt::signedRightShift. 인수 x (BigInt) 및 y (BigInt). 반환값: BigInt. 호출되면 다음 단계를 수행한다.

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

6.1.6.2.11 BigInt::unsignedRightShift ( x, y )

추상 연산 BigInt::unsignedRightShift. 인수 x (BigInt) 및 y (BigInt). 반환값: 던지기 완료. 호출되면 다음 단계를 수행한다.

  1. TypeError 예외를 던집니다.

6.1.6.2.12 BigInt::lessThan ( x, y )

추상 연산 BigInt::lessThan. 인수 x (BigInt) 및 y (BigInt). 반환값: Boolean. 호출되면 다음 단계를 수행한다.

  1. ℝ(x) < ℝ(y)이면, true를 반환합니다.
  2. false를 반환합니다.

6.1.6.2.13 BigInt::equal ( x, y )

추상 연산 BigInt::equal. 인수 x (BigInt) 및 y (BigInt). 반환값: Boolean. 호출되면 다음 단계를 수행한다.

  1. ℝ(x) = ℝ(y)이면, true를 반환합니다.
  2. false를 반환합니다.

6.1.6.2.14 BigIntBitwiseOp ( op, x, y )

추상 연산 BigIntBitwiseOp. 인수 op ((&, ^ 또는 |)), x (BigInt) 및 y (BigInt). 반환값: BigInt. 호출되면 다음 단계를 수행한다.

  1. x를 ℝ(x)로 설정합니다.
  2. y를 ℝ(y)로 설정합니다.
  3. result를 0으로 둡니다.
  4. shift를 0으로 둡니다.
  5. (x = 0 또는 x = -1)이고 (y = 0 또는 y = -1)이 될 때까지 다음을 반복합니다,
    1. xBit를 x modulo 2로 둡니다.
    2. yBit를 y modulo 2로 둡니다.
    3. op가 &이면,
      1. resultBit를 xBit와 yBit에 단일 비트 AND 연산을 적용한 결과로 둡니다.
    4. 그렇지 않고 op가 ^이면,
      1. resultBit를 xBit와 yBit에 단일 비트 XOR(배타적 OR) 연산을 적용한 결과로 둡니다.
    5. 그렇지 않으면,
      1. 단언: op는 |입니다.
      2. resultBit를 xBit와 yBit에 단일 비트 OR(포괄적 OR) 연산을 적용한 결과로 둡니다.
    6. result를 result + 2shift × resultBit로 설정합니다.
    7. shift를 shift + 1로 설정합니다.
    8. x를 (x - xBit) / 2로 설정합니다.
    9. y를 (y - yBit) / 2로 설정합니다.
  6. op가 &이면,
    1. signBit를 (x modulo 2)와 (y modulo 2)에 단일 비트 AND 연산을 적용한 결과로 둡니다.
  7. 그렇지 않고 op가 ^이면,
    1. signBit를 (x modulo 2)와 (y modulo 2)에 단일 비트 XOR(배타적 OR) 연산을 적용한 결과로 둡니다.
  8. 그렇지 않으면,
    1. 단언: op는 |입니다.
    2. signBit를 (x modulo 2)와 (y modulo 2)에 단일 비트 OR(포괄적 OR) 연산을 적용한 결과로 둡니다.
  9. signBit ≠ 0이면,
    1. result를 result - 2shift로 설정합니다.
    2. 참고: 이는 부호를 확장합니다.
  10. result에 해당하는 BigInt 값을 반환합니다.

6.1.6.2.15 BigInt::bitwiseAND ( x, y )

추상 연산 BigInt::bitwiseAND. 인수 x (BigInt) 및 y (BigInt). 반환값: BigInt. 호출되면 다음 단계를 수행한다.

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

6.1.6.2.16 BigInt::bitwiseXOR ( x, y )

추상 연산 BigInt::bitwiseXOR. 인수 x (BigInt) 및 y (BigInt). 반환값: BigInt. 호출되면 다음 단계를 수행한다.

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

6.1.6.2.17 BigInt::bitwiseOR ( x, y )

추상 연산 BigInt::bitwiseOR. 인수 x (BigInt) 및 y (BigInt). 반환값: BigInt. 호출되면 다음 단계를 수행한다.

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

6.1.6.2.18 BigInt::toString ( x, radix )

추상 연산 BigInt::toString. 인수 x (BigInt) 및 radix (2부터 36까지의 닫힌 구간에 있는 정수). 반환값: String. 기수가 radix인 위치 기수법을 사용하여 x를 String으로 나타냅니다. 기수 r을 사용한 BigInt 표현에 사용되는 숫자는 "0123456789abcdefghijklmnopqrstuvwxyz"의 처음 r개 코드 단위에서 순서대로 가져옵니다. 0ℤ 이외의 BigInt 표현에는 선행 0이 포함되지 않습니다. 호출되면 다음 단계를 수행한다.

  1. x < 0ℤ이면, "-"와 BigInt::toString(-x, radix)의 문자열 연결을 반환합니다.
  2. 기수 radix를 사용한 x의 표현으로 구성된 String 값을 반환합니다.

6.1.7 Object 타입

간단히 “Object”라고도 하는 Object 타입의 각 인스턴스는 프로퍼티의 컬렉션을 나타냅니다. 각 프로퍼티는 데이터 프로퍼티 또는 접근자 프로퍼티입니다:

  • 데이터 프로퍼티는 키 값을 ECMAScript 언어 값 및 Boolean 속성 집합과 연결합니다.
  • 접근자 프로퍼티는 키 값을 하나 또는 두 개의 접근자 함수 및 Boolean 속성 집합과 연결합니다. 접근자 함수는 프로퍼티와 연결된 ECMAScript 언어 값을 저장하거나 가져오는 데 사용됩니다.

객체의 프로퍼티는 프로퍼티 키를 사용하여 고유하게 식별됩니다. 프로퍼티 키는 String 또는 Symbol입니다. 빈 String을 포함하여 모든 String과 Symbol은 유효한 프로퍼티 키입니다. 프로퍼티 이름은 String인 프로퍼티 키입니다.

정수 인덱스는 CanonicalNumericIndexString(n)이 +0𝔽부터 𝔽(253 - 1)까지의 닫힌 구간에 있는 정수인 Number를 반환하는 프로퍼티 이름 n입니다. 배열 인덱스는 CanonicalNumericIndexString(n)이 +0𝔽부터 𝔽(232 - 2)까지의 닫힌 구간에 있는 정수인 Number를 반환하는 정수 인덱스 n입니다.

참고

모든 음이 아닌 안전한 정수에는 대응하는 정수 인덱스가 있습니다. 232 - 1을 제외한 모든 32비트 부호 없는 정수에는 대응하는 배열 인덱스가 있습니다. "-0"은 정수 인덱스도 배열 인덱스도 아닙니다.

프로퍼티 키는 프로퍼티와 그 값에 접근하는 데 사용됩니다. 프로퍼티 접근에는 값의 검색과 할당에 각각 대응하는 get과 set이라는 두 종류가 있습니다. get 및 set 접근을 통해 접근할 수 있는 프로퍼티에는 객체의 직접적인 일부인 자체 프로퍼티와 프로퍼티 상속 관계를 통해 연결된 다른 객체가 제공하는 상속된 프로퍼티가 모두 포함됩니다. 상속된 프로퍼티는 연결된 객체의 자체 프로퍼티 또는 상속된 프로퍼티일 수 있습니다. 객체의 각 자체 프로퍼티는 해당 객체의 다른 자체 프로퍼티 키 값과 구별되는 키 값을 가져야 합니다.

논리적으로 모든 객체는 프로퍼티의 컬렉션이지만, 프로퍼티에 접근하고 조작하는 의미론이 서로 다른 여러 형태의 객체가 있습니다. 여러 형태의 객체에 대한 정의는 6.1.7.2를 참조하시기 바랍니다.

또한 일부 객체는 호출할 수 있습니다. 이러한 객체를 함수 또는 함수 객체라고 하며 아래에서 더 자세히 설명합니다. ECMAScript의 모든 함수는 Object 타입의 구성원입니다.

6.1.7.1 프로퍼티 속성

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

표 3: Object 프로퍼티의 속성
속성 이름 이 속성이 존재하는 프로퍼티 타입 값 영역 기본값 설명
[[Value]] 데이터 프로퍼티 ECMAScript 언어 값 undefined 프로퍼티에 get 접근하여 가져오는 값입니다.
[[Writable]] 데이터 프로퍼티 Boolean false false이면 ECMAScript 코드가 [[Set]]을 사용하여 프로퍼티의 [[Value]] 속성을 변경하려는 시도는 성공하지 않습니다.
[[Getter]] 접근자 프로퍼티 함수 객체 또는 undefined undefined 값이 undefined가 아니면 프로퍼티에 get 접근을 수행할 때마다 프로퍼티 값을 가져오기 위해 빈 인수 목록으로 해당 [[Call]] 내부 메서드(표 5)를 호출합니다.
[[Setter]] 접근자 프로퍼티 함수 객체 또는 undefined undefined 값이 undefined가 아니면 프로퍼티에 set 접근을 수행할 때마다 할당된 값을 유일한 인수로 포함하는 인수 목록으로 해당 [[Call]] 내부 메서드(표 5)를 호출합니다. 프로퍼티의 [[Setter]] 내부 메서드 효과는 이후 해당 프로퍼티의 [[Getter]] 내부 메서드 호출이 반환하는 값에 영향을 줄 수 있지만 반드시 영향을 주어야 하는 것은 아닙니다.
[[Enumerable]] 데이터 프로퍼티 또는 접근자 프로퍼티 Boolean false true이면 프로퍼티가 for-in 열거(14.7.5 참조)에 포함됩니다. 그렇지 않으면 프로퍼티를 열거할 수 없다고 합니다.
[[Configurable]] 데이터 프로퍼티 또는 접근자 프로퍼티 Boolean false false이면 프로퍼티를 삭제하거나, 데이터 프로퍼티를 접근자 프로퍼티로 또는 접근자 프로퍼티를 데이터 프로퍼티로 변경하거나, 기존 [[Value]]를 교체하거나 [[Writable]]을 false로 설정하는 경우를 제외하고 속성을 변경하려는 시도는 실패합니다.

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

ECMAScript에서 객체의 실제 의미론은 내부 메서드라고 하는 알고리즘을 통해 명시됩니다. ECMAScript 엔진의 각 객체에는 해당 객체의 런타임 동작을 정의하는 내부 메서드 집합이 연결되어 있습니다. 이러한 내부 메서드는 ECMAScript 언어의 일부가 아닙니다. 이 명세에서는 오직 설명을 목적으로 정의합니다. 그러나 ECMAScript 구현체의 각 객체는 해당 객체와 연결된 내부 메서드가 명시하는 대로 동작해야 합니다. 이를 정확히 어떤 방식으로 달성하는지는 구현체가 결정합니다.

내부 메서드 이름은 다형적입니다. 이는 공통 내부 메서드 이름을 서로 다른 객체 값에 대해 호출할 때 서로 다른 알고리즘을 수행할 수 있음을 의미합니다. 내부 메서드가 호출되는 실제 객체를 호출의 “대상”이라고 합니다. 런타임에 알고리즘 구현이 객체가 지원하지 않는 내부 메서드를 사용하려 하면 TypeError 예외가 던져집니다.

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

모든 객체에는 PrivateElements의 List인 [[PrivateElements]]라는 내부 슬롯이 있습니다. 이 List는 객체의 비공개 필드, 메서드 및 접근자의 값을 나타냅니다. 처음에는 빈 List입니다.

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

표 4에는 ECMAScript 코드가 생성하거나 조작하는 모든 객체에 적용되는 이 명세의 필수 내부 메서드가 요약되어 있습니다. 모든 객체에는 모든 필수 내부 메서드에 대한 알고리즘이 있어야 합니다. 그러나 모든 객체가 이러한 메서드에 동일한 알고리즘을 사용하는 것은 아닙니다.

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

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

특수 객체는 일반 객체가 아닌 객체입니다.

이 명세는 객체의 내부 메서드를 기준으로 서로 다른 종류의 특수 객체를 인식합니다. 특정 종류의 특수 객체(예: Array 특수 객체 또는 바인딩된 함수 특수 객체)와 동작상 동등하지만 해당 종류에 명시된 것과 동일한 내부 메서드 집합을 갖지 않는 객체는 그 종류의 특수 객체로 인식되지 않습니다.

표 4와 기타 유사한 표는 각 내부 메서드의 호출 패턴을 설명합니다. 호출 패턴에는 항상 괄호로 둘러싼 설명적 매개변수 이름 목록이 포함됩니다.

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

내부 메서드는 암묵적으로 Completion Record를 반환하며, 호출 패턴에 표시된 반환 타입의 값을 감싸는 정상 완료 또는 던지기 완료 중 하나입니다.

표 4: 필수 내부 메서드
내부 메서드 설명 정의
[[GetPrototypeOf]] ( )

내부 메서드 [[GetPrototypeOf]]. 인수 없음. 반환값: Object 또는 null을 포함하는 정상 완료 또는 던지기 완료.

이 객체에 상속된 프로퍼티를 제공하는 객체를 결정합니다. null 값은 그러한 객체가 없음을 나타냅니다.
이 명세에서는 다음 타입에 정의되어 있으며, 호스트는 자체 정의를 갖는 추가 타입을 제공할 수 있습니다:
[[SetPrototypeOf]] ( proto )

내부 메서드 [[SetPrototypeOf]]. 인수 proto ((Object 또는 null)). 반환값: (정상 완료 (값: Boolean) 또는 throw 완료).

이 객체를 상속된 프로퍼티를 제공하는 다른 객체와 연결합니다. null을 전달하면 상속된 프로퍼티를 제공하는 객체가 없음을 나타냅니다. 연산이 성공적으로 완료되었음을 나타내는 true 또는 연산이 성공하지 못했음을 나타내는 false를 반환합니다.
이 명세에서는 다음 타입에 정의되어 있으며, 호스트는 자체 정의를 갖는 추가 타입을 제공할 수 있습니다:
[[IsExtensible]] ( )

내부 메서드 [[IsExtensible]]. 인수 없음. 반환값: Boolean을 포함하는 정상 완료 또는 던지기 완료.

이 객체에 추가 프로퍼티를 추가하는 것이 허용되는지 결정합니다.
이 명세에서는 다음 타입에 정의되어 있으며, 호스트는 자체 정의를 갖는 추가 타입을 제공할 수 있습니다:
[[PreventExtensions]] ( )

내부 메서드 [[PreventExtensions]]. 인수 없음. 반환값: Boolean을 포함하는 정상 완료 또는 던지기 완료.

이 객체에 새 프로퍼티를 추가할 수 있는지 제어합니다. 연산이 성공하면 true를 반환하고 성공하지 못하면 false를 반환합니다.
이 명세에서는 다음 타입에 정의되어 있으며, 호스트는 자체 정의를 갖는 추가 타입을 제공할 수 있습니다:
[[GetOwnProperty]] ( propertyKey )

내부 메서드 [[GetOwnProperty]]. 인수 propertyKey (프로퍼티 키). 반환값: Property Descriptor 또는 undefined를 포함하는 정상 완료 또는 던지기 완료.

키가 propertyKey인 이 객체의 자체 프로퍼티에 대한 Property Descriptor를 반환하고, 그러한 프로퍼티가 없으면 undefined를 반환합니다.
이 명세에서는 다음 타입에 정의되어 있으며, 호스트는 자체 정의를 갖는 추가 타입을 제공할 수 있습니다:
[[DefineOwnProperty]] ( propertyKey, propertyDesc )

내부 메서드 [[DefineOwnProperty]]. 인수 propertyKey (프로퍼티 키) 및 propertyDesc (프로퍼티 서술자). 반환값: Boolean을 포함하는 정상 완료 또는 던지기 완료.

키가 propertyKey인 자체 프로퍼티를 생성하거나 변경하여 propertyDesc가 설명하는 상태를 갖게 합니다. 연산이 성공하면 true를 반환하고 프로퍼티를 생성하거나 갱신할 수 없으면 false를 반환합니다.
이 명세에서는 다음 타입에 정의되어 있으며, 호스트는 자체 정의를 갖는 추가 타입을 제공할 수 있습니다:
[[HasProperty]] ( propertyKey )

내부 메서드 [[HasProperty]]. 인수 propertyKey (프로퍼티 키). 반환값: Boolean을 포함하는 정상 완료 또는 던지기 완료.

이 객체에 키가 propertyKey인 자체 프로퍼티 또는 상속된 프로퍼티가 이미 있는지를 나타내는 Boolean을 반환합니다.
이 명세에서는 다음 타입에 정의되어 있으며, 호스트는 자체 정의를 갖는 추가 타입을 제공할 수 있습니다:
[[Get]] ( propertyKey, receiver )

내부 메서드 [[Get]]. 인수 propertyKey (프로퍼티 키) 및 receiver (ECMAScript 언어 값). 반환값: (정상 완료 (값: ECMAScript 언어 값) 또는 throw 완료).

이 객체에서 키가 propertyKey인 프로퍼티의 값을 반환합니다. 프로퍼티 값을 가져오기 위해 ECMAScript 코드를 실행해야 하는 경우 코드를 평가할 때 receiver를 this 값으로 사용합니다.
이 명세에서는 다음 타입에 정의되어 있으며, 호스트는 자체 정의를 갖는 추가 타입을 제공할 수 있습니다:
[[Set]] ( propertyKey, value, receiver )

내부 메서드 [[Set]]. 인수 propertyKey (프로퍼티 키), value (ECMAScript 언어 값) 및 receiver (ECMAScript 언어 값). 반환값: (정상 완료 (값: Boolean) 또는 throw 완료).

키가 propertyKey인 프로퍼티의 값을 value로 설정합니다. 프로퍼티 값을 설정하기 위해 ECMAScript 코드를 실행해야 하는 경우 코드를 평가할 때 receiver를 this 값으로 사용합니다. 프로퍼티 값이 설정되었으면 true를 반환하고 설정할 수 없으면 false를 반환합니다.
이 명세에서는 다음 타입에 정의되어 있으며, 호스트는 자체 정의를 갖는 추가 타입을 제공할 수 있습니다:
[[Delete]] ( propertyKey )

내부 메서드 [[Delete]]. 인수 propertyKey (프로퍼티 키). 반환값: (정상 완료 (값: Boolean) 또는 throw 완료).

이 객체에서 키가 propertyKey인 자체 프로퍼티를 제거합니다. 프로퍼티가 삭제되지 않아 여전히 존재하면 false를 반환합니다. 프로퍼티가 삭제되었거나 존재하지 않으면 true를 반환합니다.
이 명세에서는 다음 타입에 정의되어 있으며, 호스트는 자체 정의를 갖는 추가 타입을 제공할 수 있습니다:
[[OwnPropertyKeys]] ( )

내부 메서드 [[OwnPropertyKeys]]. 인수 없음. 반환값: (정상 완료 (값: 리스트 (요소: 프로퍼티 키)) 또는 throw 완료).

객체의 모든 자체 프로퍼티 키를 요소로 갖는 List를 반환합니다.
이 명세에서는 다음 타입에 정의되어 있으며, 호스트는 자체 정의를 갖는 추가 타입을 제공할 수 있습니다:

표 5에는 함수로 호출될 수 있는 객체가 지원하는 추가 필수 내부 메서드가 요약되어 있습니다. 함수 객체는 [[Call]] 내부 메서드를 지원하는 객체입니다. 생성자는 [[Construct]] 내부 메서드를 지원하는 객체입니다. [[Construct]]를 지원하는 모든 객체는 [[Call]]도 지원해야 합니다. 즉, 모든 생성자는 함수 객체여야 합니다. 따라서 생성자는 생성자 함수 또는 생성자 함수 객체라고도 할 수 있습니다.

표 5: 함수 객체의 추가 필수 내부 메서드
내부 메서드 설명 정의
[[Call]] ( thisArg, argList )

내부 메서드 [[Call]]. 인수 thisArg (ECMAScript 언어 값) 및 argList (리스트 (요소: ECMAScript 언어 값)). 반환값: (정상 완료 (값: ECMAScript 언어 값) 또는 throw 완료).

이 객체와 연결된 코드를 실행합니다. 함수 호출 표현식을 통해 호출됩니다. 내부 메서드의 인수는 this 값과, 호출 표현식이 함수에 전달한 인수를 요소로 갖는 List입니다. 이 내부 메서드를 구현하는 객체는 호출 가능합니다.
이 명세에서는 다음 타입에 정의되어 있으며, 호스트는 자체 정의를 갖는 추가 타입을 제공할 수 있습니다:
[[Construct]] ( argList, newTarget )

내부 메서드 [[Construct]]. 인수 argList (리스트 (요소: ECMAScript 언어 값)) 및 newTarget (생성자). 반환값: (정상 완료 (값: Object) 또는 throw 완료).

객체를 생성합니다. new 연산자 또는 super 호출을 통해 호출됩니다. 내부 메서드의 첫 번째 인수는 생성자 호출 또는 super 호출의 인수를 요소로 갖는 List입니다. 두 번째 인수는 처음에 new 연산자가 적용된 객체입니다. 이 내부 메서드를 구현하는 객체를 생성자라고 합니다. 함수 객체가 반드시 생성자인 것은 아니며, 이러한 생성자가 아닌 함수 객체에는 [[Construct]] 내부 메서드가 없습니다.
이 명세에서는 다음 타입에 정의되어 있으며, 호스트는 자체 정의를 갖는 추가 타입을 제공할 수 있습니다:

일반 객체와 표준 특수 객체의 필수 내부 메서드 의미론은 10 절에 명시되어 있습니다. 특수 객체의 내부 메서드를 명시된 방식으로 사용하는 것을 구현체가 지원하지 않는 경우, 해당 사용을 시도하면 TypeError 예외를 던져야 합니다.

6.1.7.3 필수 내부 메서드의 불변 조건

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

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

구현체는 불변 조건을 강제하지 않은 채 필수 내부 메서드의 기능을 구현하는 대체 인터페이스를 제공하는 등의 방법으로 이러한 불변 조건을 우회할 수 있게 해서는 안 됩니다.

정의:

  • 내부 메서드의 대상은 해당 내부 메서드가 호출되는 객체입니다.
  • [[IsExtensible]] 내부 메서드에서 false를 반환한 것이 관찰되었거나 [[PreventExtensions]] 내부 메서드에서 true를 반환한 것이 관찰된 대상은 확장 불가능합니다.
  • 존재하지 않는 프로퍼티는 확장 불가능한 대상에 자체 프로퍼티로 존재하지 않는 프로퍼티입니다.
  • SameValue에 대한 모든 참조는 SameValue 알고리즘의 정의를 따릅니다.

반환값:

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

  • [[Type]] = normal, [[Target]] = empty, 그리고 [[Value]] = 해당 내부 메서드에 대해 아래에 표시된 “정상 반환 타입”의 값, 또는
  • [[Type]] = throw, [[Target]] = empty, 그리고 [[Value]] = 임의의 ECMAScript 언어 값.
참고 1

내부 메서드는 continue 완료, break 완료 또는 return 완료를 반환해서는 안 됩니다.

[[GetPrototypeOf]] ( )

  • 정상 반환 타입은 Object 또는 Null입니다.
  • 대상이 확장 불가능하고 [[GetPrototypeOf]]가 값 proto를 반환하면, 이후 [[GetPrototypeOf]]의 모든 호출은 proto와 SameValue인 값을 반환해야 합니다.
참고 2

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

[[SetPrototypeOf]] ( proto )

  • 정상 반환 타입은 Boolean입니다.
  • 대상이 확장 불가능하면 proto가 대상에서 관찰된 [[GetPrototypeOf]] 값과 SameValue인 경우를 제외하고 [[SetPrototypeOf]]는 false를 반환해야 합니다.

[[IsExtensible]] ( )

  • 정상 반환 타입은 Boolean입니다.
  • [[IsExtensible]]이 false를 반환하면 이후 대상에 대한 모든 [[IsExtensible]] 호출도 false를 반환해야 합니다.

[[PreventExtensions]] ( )

  • 정상 반환 타입은 Boolean입니다.
  • [[PreventExtensions]]가 true를 반환하면 이후 대상에 대한 모든 [[IsExtensible]] 호출은 false를 반환해야 하며, 이제 대상은 확장 불가능한 것으로 간주됩니다.

[[GetOwnProperty]] ( propertyKey )

  • 정상 반환 타입은 Property Descriptor 또는 Undefined입니다.
  • 반환값이 Property Descriptor이면 모든 필드가 채워진 Property Descriptor여야 합니다.
  • propertyKey가 구성 불가능하고 쓰기 불가능한 자체 데이터 프로퍼티로 기술되었으면 이후 [[GetOwnProperty]] ( propertyKey )의 모든 호출은 [[Value]]가 propertyKey의 [[Value]] 속성과 SameValue인 Property Descriptor를 반환해야 합니다.
  • [[Writable]]과 [[Value]] 이외의 propertyKey 속성이 시간에 따라 변경될 수 있거나 프로퍼티가 삭제될 수 있다면 propertyKey의 [[Configurable]] 속성은 true여야 합니다.
  • [[Writable]] 속성이 false에서 true로 변경될 수 있다면 [[Configurable]] 속성은 true여야 합니다.
  • 대상이 확장 불가능하고 propertyKey가 존재하지 않으면 이후 대상에 대한 모든 [[GetOwnProperty]] (propertyKey) 호출은 propertyKey가 존재하지 않는 것으로 기술해야 합니다(즉, [[GetOwnProperty]] (propertyKey)는 undefined를 반환해야 합니다).
참고 3

세 번째 불변 조건의 결과로, 프로퍼티가 데이터 프로퍼티로 기술되고 시간에 따라 서로 다른 값을 반환할 수 있다면 다른 필수 내부 메서드를 통해 값을 변경하는 메커니즘이 노출되지 않더라도 [[Writable]]과 [[Configurable]] 속성 중 하나 또는 둘 모두가 true여야 합니다.

[[DefineOwnProperty]] ( propertyKey, propertyDesc )

  • 정상 반환 타입은 Boolean입니다.
  • propertyKey가 이전에 대상의 구성 불가능한 자체 프로퍼티로 관찰되었으면 다음 중 하나에 해당하지 않는 한 [[DefineOwnProperty]]는 false를 반환해야 합니다:
    1. propertyKey가 쓰기 가능한 데이터 프로퍼티입니다. 구성 불가능하면서 쓰기 가능한 데이터 프로퍼티는 구성 불가능하면서 쓰기 불가능한 데이터 프로퍼티로 변경할 수 있습니다.
    2. propertyDesc의 모든 속성이 propertyKey의 속성과 SameValue입니다.
  • 대상이 확장 불가능하고 propertyKey가 존재하지 않는 자체 프로퍼티이면 [[DefineOwnProperty]] (propertyKey, propertyDesc)는 false를 반환해야 합니다. 즉, 확장 불가능한 대상 객체는 새 프로퍼티로 확장할 수 없습니다.

[[HasProperty]] ( propertyKey )

  • 정상 반환 타입은 Boolean입니다.
  • propertyKey가 이전에 대상의 구성 불가능한 자체 데이터 프로퍼티 또는 접근자 프로퍼티로 관찰되었으면 [[HasProperty]]는 true를 반환해야 합니다.

[[Get]] ( propertyKey, receiver )

  • 정상 반환 타입은 임의의 ECMAScript 언어 타입입니다.
  • propertyKey가 이전에 값 value를 갖는 대상의 구성 불가능하고 쓰기 불가능한 자체 데이터 프로퍼티로 관찰되었으면 [[Get]]은 value와 SameValue인 값을 반환해야 합니다.
  • propertyKey가 이전에 [[Getter]] 속성이 undefined인 대상의 구성 불가능한 자체 접근자 프로퍼티로 관찰되었으면 [[Get]] 연산은 undefined를 반환해야 합니다.

[[Set]] ( propertyKey, value, receiver )

  • 정상 반환 타입은 Boolean입니다.
  • propertyKey가 이전에 대상의 구성 불가능하고 쓰기 불가능한 자체 데이터 프로퍼티로 관찰되었으면 value가 propertyKey의 [[Value]] 속성과 SameValue인 경우를 제외하고 [[Set]]은 false를 반환해야 합니다.
  • propertyKey가 이전에 [[Setter]] 속성이 undefined인 대상의 구성 불가능한 자체 접근자 프로퍼티로 관찰되었으면 [[Set]] 연산은 false를 반환해야 합니다.

[[Delete]] ( propertyKey )

  • 정상 반환 타입은 Boolean입니다.
  • propertyKey가 이전에 대상의 구성 불가능한 자체 데이터 프로퍼티 또는 접근자 프로퍼티로 관찰되었으면 [[Delete]]는 false를 반환해야 합니다.

[[OwnPropertyKeys]] ( )

  • 정상 반환 타입은 List입니다.
  • 반환된 List에는 중복 항목이 포함되어서는 안 됩니다.
  • 반환된 List의 각 요소는 프로퍼티 키여야 합니다.
  • 반환된 List에는 이전에 관찰된 모든 구성 불가능한 자체 프로퍼티의 키가 적어도 포함되어야 합니다.
  • 대상이 확장 불가능하면 반환된 List에는 [[GetOwnProperty]]를 사용하여 관찰할 수 있는 대상의 모든 자체 프로퍼티 키만 포함되어야 합니다.

[[Call]] ( )

[[Construct]] ( )

  • 정상 반환 타입은 Object입니다.
  • 대상에는 [[Call]] 내부 메서드도 있어야 합니다.

6.1.7.4 잘 알려진 내재 객체

잘 알려진 내재 객체는 이 명세의 알고리즘에서 명시적으로 참조되며 일반적으로 realm별 고유한 동일성을 갖는 내장 객체입니다. 달리 명시되지 않는 한 각 내재 객체는 실제로 realm마다 하나씩 존재하는 유사한 객체의 집합에 대응합니다.

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

표 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)
%AsyncDisposableStack% "AsyncDisposableStack" AsyncDisposableStack 생성자 (27.4.1)
%AsyncFromSyncIteratorPrototype% Async-from-Sync Iterator 객체의 프로토타입 (27.1.5)
%AsyncFunction% 비동기 함수 객체의 생성자 (27.10.1)
%AsyncGeneratorFunction% 비동기 제너레이터 함수 객체의 생성자 (27.7.1)
%AsyncGeneratorPrototype% 비동기 제너레이터 객체의 프로토타입 (27.9)
%AsyncIteratorPrototype% 모든 표준 내장 비동기 이터레이터 객체가 간접적으로 상속하는 객체
%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)
%DisposableStack% "DisposableStack" DisposableStack 생성자 (27.3.1)
%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% 제너레이터 함수 객체의 생성자 (27.6.1)
%GeneratorPrototype% 제너레이터 객체의 프로토타입 (27.8)
%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.5.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)
%SuppressedError% "SuppressedError" SuppressedError 생성자 (20.5.8.1)
%Symbol% "Symbol" Symbol 생성자 (20.4.1)
%SyntaxError% "SyntaxError" SyntaxError 생성자 (20.5.5.4)
%ThrowTypeError% 무조건 %TypeError%의 새 인스턴스를 던지는 함수 객체
%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이 반환하는 래핑된 이터레이터 객체의 프로토타입 (27.1.3.2.2.1)
참고

표 103에 추가 항목이 있습니다.

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은 산세리프체를 사용하여 대문자 케밥 표기법으로 나타냅니다. 예를 들어 Completion Record의 [[Type]] 필드는 normal, return 또는 throw와 같은 값을 가집니다. Enum에는 이름 이외의 특성이 없습니다. Enum의 이름은 다른 Enum과 구별하는 것 이외의 목적은 없으며, 문맥에서의 용도나 의미에 대해서는 아무것도 암시하지 않습니다.

6.2.2 List 및 Record 명세 타입

List 타입은 new 표현식, 함수 호출 및 단순한 순서 있는 값 목록이 필요한 기타 알고리즘에서 인수 목록의 평가(13.3.8 참조)를 설명하는 데 사용됩니다. List 타입의 값은 개별 값을 포함하는 목록 요소의 단순한 순서 있는 시퀀스입니다. 이러한 시퀀스는 임의의 길이를 가질 수 있습니다. 목록의 요소는 0부터 시작하는 인덱스를 사용하여 임의 접근할 수 있습니다. 표기상의 편의를 위해 배열과 유사한 구문을 사용하여 List 요소에 접근할 수 있습니다. 예를 들어 args[2]는 List args의 3번째 요소를 나타내는 축약 표현입니다.

알고리즘이 순서를 지정하지 않고 List의 요소를 반복 처리하는 경우, List 내의 요소 순서를 사용합니다.

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

이 명세에서 “A, B, ...의 목록 연결”이라는 문구(각 인수는 비어 있을 수도 있는 List입니다)는 각 인수의 요소를 인수 순서대로 연결한 요소를 갖는 새로운 List 값을 나타냅니다.

String의 List에 적용할 때 “사전식 코드 단위 순서에 따라 정렬”이라는 문구는 더 짧은 문자열의 길이까지 각 코드 단위의 숫자 값으로 정렬하고, 모든 값이 같으면 더 짧은 문자열을 더 긴 문자열보다 앞에 정렬하는 것을 의미하며, 이는 추상 연산 IsLessThan에 설명되어 있습니다.

Record 타입은 이 명세의 알고리즘 내에서 데이터 집합을 설명하는 데 사용됩니다. Record 타입 값은 하나 이상의 이름 있는 필드로 구성됩니다. 각 필드의 값은 ECMAScript 언어 값 또는 명세 값입니다. 필드 이름은 항상 이중 대괄호로 둘러싸며, 예를 들어 [[Value]]와 같습니다.

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

명세 텍스트와 알고리즘에서는 점 표기법을 사용하여 Record의 특정 필드를 참조할 수 있습니다. 예를 들어 R이 이전 단락에 표시된 Record라면 R.[[Field2]]는 “이름이 [[Field2]]인 R의 필드”를 나타내는 축약 표현입니다.

자주 사용되는 Record 필드 조합의 스키마에는 이름을 지정할 수 있으며, 해당 이름을 리터럴 Record의 접두사로 사용하여 설명 중인 특정 종류의 집합을 식별할 수 있습니다. 예: PropertyDescriptor { [[Value]]: 42, [[Writable]]: false, [[Configurable]]: true }.

6.2.3 Set 및 Relation 명세 타입

Set 타입은 메모리 모델에서 사용하는 순서 없는 요소의 컬렉션을 설명하는 데 사용됩니다. 이는 같은 이름의 ECMAScript 컬렉션 타입과 구별됩니다. 모호함을 피하기 위해 이 명세에서는 ECMAScript 컬렉션의 인스턴스를 일관되게 “Set 객체”라고 합니다. Set 타입의 값은 요소의 단순한 컬렉션이며, 동일한 요소가 두 번 이상 나타나지 않습니다. Set에 요소를 추가하거나 제거할 수 있습니다. Set은 서로 합집합, 교집합 또는 차집합을 구할 수 있습니다.

Relation 타입은 Set에 대한 제약 조건을 설명하는 데 사용됩니다. Relation 타입의 값은 해당 값 영역의 값들로 이루어진 순서쌍의 Set입니다. 예를 들어 Memory 이벤트에 대한 Relation은 Memory 이벤트의 순서쌍으로 이루어진 집합입니다. Relation R과 R의 값 영역에 있는 두 값 a와 b에 대해 a R b는 순서쌍 (a, b)가 R의 구성원임을 나타내는 축약 표현입니다. 어떤 조건에 대해 Relation이 해당 조건을 만족하는 가장 작은 Relation이면 이를 최소 Relation이라고 합니다.

엄격 부분 순서는 다음을 만족하는 Relation 값 R입니다.

  • R의 영역에 있는 모든 a, b 및 c에 대해:

    • a R a가 성립하지 않으며,
    • a R b이고 b R c이면, a R c입니다.
참고 1

위의 두 특성을 각각 비반사성과 추이성이라고 합니다.

엄격 전순서는 다음을 만족하는 Relation 값 R입니다.

  • R의 영역에 있는 모든 a, b 및 c에 대해:

    • a가 b이거나 a R b이거나 b R a이며,
    • a R a가 성립하지 않으며,
    • a R b이고 b R c이면, a R c입니다.
참고 2

위의 세 특성을 각각 전성, 비반사성 및 추이성이라고 합니다.

6.2.4 Completion Record 명세 타입

Completion Record 명세 타입은 비국소적인 제어 이전을 수행하는 문(break, continue, return 및 throw)의 동작과 같은 값 및 제어 흐름의 런타임 전파를 설명하는 데 사용됩니다.

Completion Record에는 표 7에 정의된 필드가 있습니다.

표 7: Completion Record 필드
필드 이름 값 의미
[[Type]] normal, break, continue, return 또는 throw 발생한 완료의 타입입니다.
[[Value]] Completion Record를 제외한 임의의 값 생성된 값입니다.
[[Target]] String 또는 empty 지시된 제어 이전의 대상 레이블입니다.

Completion Record를 참조하기 위해 다음 축약 용어를 사용하는 경우가 있습니다.

  • 정상 완료는 [[Type]] 값이 normal인 모든 Completion Record를 가리킵니다.
  • break 완료는 [[Type]] 값이 break인 모든 Completion Record를 가리킵니다.
  • continue 완료는 [[Type]] 값이 continue인 모든 Completion Record를 가리킵니다.
  • return 완료는 [[Type]] 값이 return인 모든 Completion Record를 가리킵니다.
  • throw 완료는 [[Type]] 값이 throw인 모든 Completion Record를 가리킵니다.
  • 비정상 완료는 [[Type]] 값이 normal이 아닌 모든 Completion Record를 가리킵니다.
  • 어떤 타입의 값을 포함하는 정상 완료는 [[Value]] 필드에 해당 타입의 값을 갖는 정상 완료를 가리킵니다.

이 명세에서 정의한 호출 가능 객체는 정상 완료 또는 throw 완료만 반환합니다. 그 밖의 종류의 Completion Record를 반환하는 것은 편집 오류로 간주됩니다.

구현체 정의 호출 가능 객체는 정상 완료 또는 throw 완료 중 하나를 반환해야 합니다.

6.2.4.1 NormalCompletion ( value )

추상 연산 NormalCompletion. 인수 value (Completion Record를 제외한 임의의 값). 반환값: 정상 완료. 호출되면 다음 단계를 수행한다.

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

6.2.4.2 ThrowCompletion ( value )

추상 연산 ThrowCompletion. 인수 value (ECMAScript 언어 값). 반환값: throw 완료. 호출되면 다음 단계를 수행한다.

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

6.2.4.3 ReturnCompletion ( value )

추상 연산 ReturnCompletion. 인수 value (ECMAScript 언어 값). 반환값: return 완료. 호출되면 다음 단계를 수행한다.

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

6.2.4.4 UpdateEmpty ( completionRecord, value )

추상 연산 UpdateEmpty. 인수 completionRecord (Completion 레코드) 및 value (Completion Record를 제외한 임의의 값). 반환값: Completion 레코드. 호출되면 다음 단계를 수행한다.

  1. 단언: completionRecord가 return 완료 또는 throw 완료이면, 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는 해석된 이름 또는 (아직 해석되지 않았을 수도 있는) 프로퍼티 바인딩이며, 해당 필드는 표 8에 정의되어 있습니다.

표 8: Reference Record 필드
필드 이름 값 의미
[[Base]] ECMAScript 언어 값, Environment Record 또는 unresolvable 바인딩을 보유하는 값 또는 Environment Record입니다. [[Base]]가 unresolvable이면 바인딩을 해석할 수 없었음을 나타냅니다.
[[ReferencedName]] ECMAScript 언어 값 또는 Private Name 바인딩의 이름입니다. [[Base]] 값이 Environment Record이면 항상 String입니다. 그렇지 않으면 ToPropertyKey를 수행할 때까지 String이나 Symbol 이외의 ECMAScript 언어 값일 수도 있습니다.
[[Strict]] Boolean Reference Record가 엄격 모드 코드에서 유래했으면 true이고, 그렇지 않으면 false입니다.
[[ThisValue]] ECMAScript 언어 값 또는 empty empty가 아니면 Reference Record는 super 키워드를 사용하여 표현한 프로퍼티 바인딩을 나타냅니다. 이를 Super Reference Record라고 하며, 해당 [[Base]] 값은 절대로 Environment Record가 아닙니다. 이 경우 [[ThisValue]] 필드는 Reference Record가 생성된 시점의 this 값을 보유합니다.

이 명세에서는 Reference Record에 대해 연산하기 위해 다음 추상 연산을 사용합니다:

6.2.5.1 IsPropertyReference ( refRecord )

추상 연산 IsPropertyReference. 인수 refRecord (Reference 레코드). 반환값: Boolean. 호출되면 다음 단계를 수행한다.

  1. refRecord.[[Base]]가 unresolvable이면, false를 반환합니다.
  2. refRecord.[[Base]]가 Environment Record이면, false를 반환합니다.
  3. true를 반환합니다.

6.2.5.2 IsUnresolvableReference ( refRecord )

추상 연산 IsUnresolvableReference. 인수 refRecord (Reference 레코드). 반환값: Boolean. 호출되면 다음 단계를 수행한다.

  1. refRecord.[[Base]]가 unresolvable이면, true를 반환합니다.
  2. false를 반환합니다.

6.2.5.3 IsSuperReference ( refRecord )

추상 연산 IsSuperReference. 인수 refRecord (Reference 레코드). 반환값: Boolean. 호출되면 다음 단계를 수행한다.

  1. refRecord.[[ThisValue]]가 empty이면, false를 반환합니다.
  2. true를 반환합니다.

6.2.5.4 IsPrivateReference ( refRecord )

추상 연산 IsPrivateReference. 인수 refRecord (Reference 레코드). 반환값: Boolean. 호출되면 다음 단계를 수행한다.

  1. refRecord.[[ReferencedName]]이 Private Name이면, true를 반환합니다.
  2. false를 반환합니다.

6.2.5.5 GetValue ( refRecord )

추상 연산 GetValue. 인수 refRecord (Reference Record 또는 ECMAScript 언어 값). 반환값: ECMAScript 언어 값을 포함하는 정상 완료 또는 비정상 완료. 호출되면 다음 단계를 수행한다.

  1. refRecord가 Reference Record가 아니면, refRecord를 반환합니다.
  2. IsUnresolvableReference(refRecord)가 true이면, ReferenceError 예외를 던집니다.
  3. IsPropertyReference(refRecord)가 true이면, 다음을 수행합니다.
    1. baseObj를 ? ToObject(refRecord.[[Base]])로 둡니다.
    2. IsPrivateReference(refRecord)가 true이면, 다음을 수행합니다.
      1. ? PrivateGet(baseObj, refRecord.[[ReferencedName]])을 반환합니다.
    3. refRecord.[[ReferencedName]]이 프로퍼티 키가 아니면, 다음을 수행합니다.
      1. refRecord.[[ReferencedName]]을 ? ToPropertyKey(refRecord.[[ReferencedName]])로 설정합니다.
    4. ? baseObj.[[Get]](refRecord.[[ReferencedName]], GetThisValue(refRecord))를 반환합니다.
  4. base를 refRecord.[[Base]]로 둡니다.
  5. 단언: base는 Environment Record입니다.
  6. ? base.GetBindingValue(refRecord.[[ReferencedName]], refRecord.[[Strict]])를 반환합니다(9.1 참조).
참고

3.a 단계에서 생성될 수 있는 객체에는 위 추상 연산과 일반 객체 [[Get]] 내부 메서드 외부에서 접근할 수 없습니다. 구현체는 실제 객체 생성을 피하도록 선택할 수도 있습니다.

6.2.5.6 PutValue ( refRecord, value )

추상 연산 PutValue. 인수 refRecord (Reference Record 또는 ECMAScript 언어 값) 및 value (ECMAScript 언어 값). 반환값: unused를 포함하는 정상 완료 또는 비정상 완료. 호출되면 다음 단계를 수행한다.

  1. refRecord가 Reference Record가 아니면, ReferenceError 예외를 던집니다.
  2. IsUnresolvableReference(refRecord)가 true이면, 다음을 수행합니다.
    1. refRecord.[[Strict]]가 true이면, ReferenceError 예외를 던집니다.
    2. globalObj를 GetGlobalObject()로 둡니다.
    3. ? Set(globalObj, refRecord.[[ReferencedName]], value, false)를 수행합니다.
    4. unused를 반환합니다.
  3. IsPropertyReference(refRecord)가 true이면, 다음을 수행합니다.
    1. baseObj를 ? ToObject(refRecord.[[Base]])로 둡니다.
    2. IsPrivateReference(refRecord)가 true이면, 다음을 수행합니다.
      1. ? PrivateSet(baseObj, refRecord.[[ReferencedName]], value)를 반환합니다.
    3. refRecord.[[ReferencedName]]이 프로퍼티 키가 아니면, 다음을 수행합니다.
      1. refRecord.[[ReferencedName]]을 ? ToPropertyKey(refRecord.[[ReferencedName]])로 설정합니다.
    4. succeeded를 ? baseObj.[[Set]](refRecord.[[ReferencedName]], value, GetThisValue(refRecord))로 둡니다.
    5. succeeded가 false이고 refRecord.[[Strict]]가 true이면, TypeError 예외를 던집니다.
    6. unused를 반환합니다.
  4. base를 refRecord.[[Base]]로 둡니다.
  5. 단언: base는 Environment Record입니다.
  6. ? base.SetMutableBinding(refRecord.[[ReferencedName]], value, refRecord.[[Strict]])를 반환합니다(9.1 참조).
참고

3.a 단계에서 생성될 수 있는 객체에는 위 추상 연산과 일반 객체 [[Set]] 내부 메서드 외부에서 접근할 수 없습니다. 구현체는 해당 객체의 실제 생성을 피하도록 선택할 수도 있습니다.

6.2.5.7 GetThisValue ( refRecord )

추상 연산 GetThisValue. 인수 refRecord (Reference 레코드). 반환값: ECMAScript 언어 값. 호출되면 다음 단계를 수행한다.

  1. 단언: IsPropertyReference(refRecord)는 true입니다.
  2. IsSuperReference(refRecord)가 true이면, refRecord.[[ThisValue]]를 반환합니다.
  3. refRecord.[[Base]]를 반환합니다.

6.2.5.8 InitializeReferencedBinding ( refRecord, value )

추상 연산 InitializeReferencedBinding. 인수 refRecord (Reference 레코드) 및 value (ECMAScript 언어 값). 반환값: unused를 포함하는 정상 완료 또는 비정상 완료. 호출되면 다음 단계를 수행한다.

  1. 단언: IsUnresolvableReference(refRecord)는 false입니다.
  2. base를 refRecord.[[Base]]로 둡니다.
  3. 단언: base는 Environment Record입니다.
  4. ? base.InitializeBinding(refRecord.[[ReferencedName]], value)을 반환합니다.

6.2.5.9 MakePrivateReference ( baseValue, privateIdentifier )

추상 연산 MakePrivateReference. 인수 baseValue (ECMAScript 언어 값) 및 privateIdentifier (String). 반환값: Reference 레코드. 호출되면 다음 단계를 수행한다.

  1. privateEnv를 실행 중인 실행 컨텍스트의 PrivateEnvironment로 둡니다.
  2. 단언: privateEnv는 null이 아닙니다.
  3. privateName을 ResolvePrivateIdentifier(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 Record의 리터럴 설명에 태그를 지정하는 데 사용하는 스키마 이름은 “PropertyDescriptor”입니다.

Property Descriptor 값은 특정 필드의 존재 여부 또는 사용에 따라 데이터 Property Descriptor와 접근자 Property Descriptor로 더 분류할 수 있습니다. 데이터 Property Descriptor는 [[Value]] 또는 [[Writable]]이라는 이름의 필드를 하나라도 포함하는 Property Descriptor입니다. 접근자 Property Descriptor는 [[Getter]] 또는 [[Setter]]라는 이름의 필드를 하나라도 포함하는 Property Descriptor입니다. 모든 Property Descriptor에는 [[Enumerable]] 및 [[Configurable]]이라는 이름의 필드가 있을 수 있습니다. Property Descriptor 값은 데이터 Property Descriptor이면서 동시에 접근자 Property Descriptor일 수 없습니다. 그러나 둘 다 아닐 수는 있습니다(이 경우 일반 Property Descriptor입니다). 모든 필드가 채워진 Property Descriptor는 접근자 Property Descriptor 또는 데이터 Property Descriptor 중 하나이면서 표 3에 정의된 해당 필드를 모두 갖는 Property Descriptor입니다.

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

6.2.6.1 IsAccessorDescriptor ( propertyDesc )

추상 연산 IsAccessorDescriptor. 인수 propertyDesc (프로퍼티 서술자). 반환값: Boolean. 호출되면 다음 단계를 수행한다.

  1. propertyDesc에 [[Getter]] 필드가 있으면, true를 반환합니다.
  2. propertyDesc에 [[Setter]] 필드가 있으면, true를 반환합니다.
  3. false를 반환합니다.

6.2.6.2 IsDataDescriptor ( propertyDesc )

추상 연산 IsDataDescriptor. 인수 propertyDesc (프로퍼티 서술자). 반환값: Boolean. 호출되면 다음 단계를 수행한다.

  1. propertyDesc에 [[Value]] 필드가 있으면, true를 반환합니다.
  2. propertyDesc에 [[Writable]] 필드가 있으면, true를 반환합니다.
  3. false를 반환합니다.

6.2.6.3 IsGenericDescriptor ( propertyDesc )

추상 연산 IsGenericDescriptor. 인수 propertyDesc (프로퍼티 서술자). 반환값: Boolean. 호출되면 다음 단계를 수행한다.

  1. IsAccessorDescriptor(propertyDesc)가 true이면, false를 반환합니다.
  2. IsDataDescriptor(propertyDesc)가 true이면, false를 반환합니다.
  3. true를 반환합니다.

6.2.6.4 FromPropertyDescriptor ( propertyDesc )

추상 연산 FromPropertyDescriptor. 인수 propertyDesc (Property Descriptor 또는 undefined). 반환값: Object 또는 undefined. 호출되면 다음 단계를 수행한다.

  1. propertyDesc가 undefined이면, undefined를 반환합니다.
  2. obj를 OrdinaryObjectCreate(%Object.prototype%)로 둡니다.
  3. 단언: obj는 자체 프로퍼티가 없는 확장 가능한 일반 객체입니다.
  4. propertyDesc에 [[Value]] 필드가 있으면, 다음을 수행합니다.
    1. ! CreateDataPropertyOrThrow(obj, "value", propertyDesc.[[Value]])를 수행합니다.
  5. propertyDesc에 [[Writable]] 필드가 있으면, 다음을 수행합니다.
    1. ! CreateDataPropertyOrThrow(obj, "writable", propertyDesc.[[Writable]])를 수행합니다.
  6. propertyDesc에 [[Getter]] 필드가 있으면, 다음을 수행합니다.
    1. ! CreateDataPropertyOrThrow(obj, "get", propertyDesc.[[Getter]])를 수행합니다.
  7. propertyDesc에 [[Setter]] 필드가 있으면, 다음을 수행합니다.
    1. ! CreateDataPropertyOrThrow(obj, "set", propertyDesc.[[Setter]])를 수행합니다.
  8. propertyDesc에 [[Enumerable]] 필드가 있으면, 다음을 수행합니다.
    1. ! CreateDataPropertyOrThrow(obj, "enumerable", propertyDesc.[[Enumerable]])를 수행합니다.
  9. propertyDesc에 [[Configurable]] 필드가 있으면, 다음을 수행합니다.
    1. ! CreateDataPropertyOrThrow(obj, "configurable", propertyDesc.[[Configurable]])를 수행합니다.
  10. obj를 반환합니다.

6.2.6.5 ToPropertyDescriptor ( obj )

추상 연산 ToPropertyDescriptor. 인수 obj (ECMAScript 언어 값). 반환값: Property Descriptor를 포함하는 정상 완료 또는 throw 완료. 호출되면 다음 단계를 수행한다.

  1. obj가 Object가 아니면, TypeError 예외를 던집니다.
  2. propertyDesc를 처음에는 필드가 없는 새로운 Property Descriptor로 둡니다.
  3. hasEnumerable을 ? HasProperty(obj, "enumerable")로 둡니다.
  4. hasEnumerable이 true이면, 다음을 수행합니다.
    1. enumerable을 ToBoolean(? Get(obj, "enumerable"))로 둡니다.
    2. propertyDesc.[[Enumerable]]을 enumerable로 설정합니다.
  5. hasConfigurable을 ? HasProperty(obj, "configurable")로 둡니다.
  6. hasConfigurable이 true이면, 다음을 수행합니다.
    1. configurable을 ToBoolean(? Get(obj, "configurable"))로 둡니다.
    2. propertyDesc.[[Configurable]]을 configurable로 설정합니다.
  7. hasValue를 ? HasProperty(obj, "value")로 둡니다.
  8. hasValue가 true이면, 다음을 수행합니다.
    1. value를 ? Get(obj, "value")로 둡니다.
    2. propertyDesc.[[Value]]를 value로 설정합니다.
  9. hasWritable을 ? HasProperty(obj, "writable")로 둡니다.
  10. hasWritable이 true이면, 다음을 수행합니다.
    1. writable을 ToBoolean(? Get(obj, "writable"))로 둡니다.
    2. propertyDesc.[[Writable]]을 writable로 설정합니다.
  11. hasGet을 ? HasProperty(obj, "get")로 둡니다.
  12. hasGet이 true이면, 다음을 수행합니다.
    1. getter를 ? Get(obj, "get")로 둡니다.
    2. IsCallable(getter)이 false이고 getter가 undefined가 아니면, TypeError 예외를 던집니다.
    3. propertyDesc.[[Getter]]를 getter로 설정합니다.
  13. hasSet을 ? HasProperty(obj, "set")로 둡니다.
  14. hasSet이 true이면, 다음을 수행합니다.
    1. setter를 ? Get(obj, "set")로 둡니다.
    2. IsCallable(setter)이 false이고 setter가 undefined가 아니면, TypeError 예외를 던집니다.
    3. propertyDesc.[[Setter]]를 setter로 설정합니다.
  15. propertyDesc에 [[Getter]] 필드가 있거나 propertyDesc에 [[Setter]] 필드가 있으면, 다음을 수행합니다.
    1. propertyDesc에 [[Value]] 필드가 있거나 propertyDesc에 [[Writable]] 필드가 있으면, TypeError 예외를 던집니다.
  16. propertyDesc를 반환합니다.

6.2.6.6 CompletePropertyDescriptor ( propertyDesc )

추상 연산 CompletePropertyDescriptor. 인수 propertyDesc (프로퍼티 서술자). 반환값: unused. 호출되면 다음 단계를 수행한다.

  1. like를 Record { [[Value]]: undefined, [[Writable]]: false, [[Getter]]: undefined, [[Setter]]: undefined, [[Enumerable]]: false, [[Configurable]]: false }로 둡니다.
  2. IsGenericDescriptor(propertyDesc)가 true이거나 IsDataDescriptor(propertyDesc)가 true이면, 다음을 수행합니다.
    1. propertyDesc에 [[Value]] 필드가 없으면, propertyDesc.[[Value]]를 like.[[Value]]로 설정합니다.
    2. propertyDesc에 [[Writable]] 필드가 없으면, propertyDesc.[[Writable]]을 like.[[Writable]]로 설정합니다.
  3. 그렇지 않으면,
    1. propertyDesc에 [[Getter]] 필드가 없으면, propertyDesc.[[Getter]]를 like.[[Getter]]로 설정합니다.
    2. propertyDesc에 [[Setter]] 필드가 없으면, propertyDesc.[[Setter]]를 like.[[Setter]]로 설정합니다.
  4. propertyDesc에 [[Enumerable]] 필드가 없으면, propertyDesc.[[Enumerable]]을 like.[[Enumerable]]로 설정합니다.
  5. propertyDesc에 [[Configurable]] 필드가 없으면, propertyDesc.[[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를 반환하는 경우, 해당 Completion Record는 정상 완료 또는 throw 완료 중 하나여야 합니다.

Abstract Closure는 다음 예에 표시된 것처럼 다른 알고리즘의 일부로 인라인 생성됩니다.

  1. addend를 41로 둡니다.
  2. closure를 매개변수 (x)를 갖고 addend를 캡처하며 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. x + addend를 반환합니다.
  3. value를 closure(1)로 둡니다.
  4. 단언: value는 42입니다.

6.2.9 데이터 블록

Data Block 명세 타입은 바이트 크기(8비트)의 숫자 값으로 이루어진 독립적이고 변경 가능한 시퀀스를 설명하는 데 사용됩니다. 바이트 값은 0부터 255까지의 닫힌 구간에 있는 정수입니다. Data Block 값은 고정된 개수의 바이트로 생성되며 각 바이트의 초기값은 0입니다.

이 명세에서는 표기상의 편의를 위해 배열과 유사한 구문을 사용하여 Data Block 값의 개별 바이트에 접근할 수 있습니다. 이 표기법은 Data Block 값을 0부터 시작하는 바이트의 정수 인덱스 시퀀스로 나타냅니다. 예를 들어 dataBlock이 5바이트 Data Block 값이면 dataBlock[2]를 사용하여 세 번째 바이트에 접근할 수 있습니다.

여러 에이전트가 동시에 참조할 수 있는 메모리에 존재하는 데이터 블록을 Shared Data Block이라고 합니다. Shared Data Block에는 Shared Data Block 값의 동등성 검사에 사용되는 주소 독립적 동일성이 있습니다. 즉, 블록이 어떤 프로세스에서 매핑되는 가상 주소에 연결되는 것이 아니라 블록이 나타내는 메모리 위치의 집합에 연결됩니다. 두 데이터 블록은 포함하는 위치 집합이 같을 때만 서로 같으며, 그렇지 않으면 서로 같지 않고 각 블록이 포함하는 위치 집합의 교집합은 비어 있습니다. 마지막으로 Shared Data Block은 Data Block과 구별할 수 있습니다.

Shared Data Block의 의미론은 메모리 모델에서 Shared Data Block 이벤트를 사용하여 정의됩니다. 아래의 추상 연산은 Shared Data Block 이벤트를 도입하고 평가 의미론과 메모리 모델의 이벤트 의미론 사이의 인터페이스 역할을 합니다. 이벤트는 후보 실행을 형성하며, 메모리 모델은 이를 필터로 처리합니다. 전체 의미론은 메모리 모델을 참조하시기 바랍니다.

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

이 명세에서는 Data Block 값에 대해 연산하기 위해 다음 추상 연산을 사용합니다:

6.2.9.1 CreateByteDataBlock ( size )

추상 연산 CreateByteDataBlock. 인수 size (음이 아닌 정수). 반환값: Data Block을 포함하는 정상 완료 또는 throw 완료. 호출되면 다음 단계를 수행한다.

  1. size > 253 - 1이면, RangeError 예외를 던집니다.
  2. dataBlock을 size바이트로 구성된 새로운 Data Block 값으로 둡니다. 그러한 Data Block을 생성할 수 없으면 RangeError 예외를 던집니다.
  3. dataBlock의 모든 바이트를 0으로 설정합니다.
  4. dataBlock을 반환합니다.

6.2.9.2 CreateSharedByteDataBlock ( size )

추상 연산 CreateSharedByteDataBlock. 인수 size (음이 아닌 정수). 반환값: Shared Data Block을 포함하는 정상 완료 또는 throw 완료. 호출되면 다음 단계를 수행한다.

  1. dataBlock을 size바이트로 구성된 새로운 Shared Data Block 값으로 둡니다. 그러한 Shared Data Block을 생성할 수 없으면 RangeError 예외를 던집니다.
  2. agentRecord를 주변 에이전트의 Agent Record로 둡니다.
  3. execution을 agentRecord.[[CandidateExecution]]으로 둡니다.
  4. eventsRecord를 [[AgentSignifier]]가 AgentSignifier()인 execution.[[EventsRecords]]의 Agent Events Record로 둡니다.
  5. zero를 « 0 »으로 둡니다.
  6. dataBlock의 각 인덱스 index에 대해 다음을 수행합니다.
    1. WriteSharedMemory { [[Order]]: init, [[NoTear]]: true, [[Block]]: dataBlock, [[ByteIndex]]: index, [[ElementSize]]: 1, [[Payload]]: zero }를 eventsRecord.[[EventList]]에 추가합니다.
  7. dataBlock을 반환합니다.

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

추상 연산 CopyDataBlockBytes. 인수 toBlock (Data Block 또는 Shared Data Block), toIndex (음이 아닌 정수), fromBlock (Data Block 또는 Shared Data Block), fromIndex (음이 아닌 정수) 및 count (음이 아닌 정수). 반환값: unused. 호출되면 다음 단계를 수행한다.

  1. 단언: fromBlock과 toBlock은 서로 다른 값입니다.
  2. fromSize를 fromBlock의 바이트 수로 둡니다.
  3. 단언: fromIndex + count ≤ fromSize입니다.
  4. toSize를 toBlock의 바이트 수로 둡니다.
  5. 단언: toIndex + count ≤ toSize입니다.
  6. count > 0인 동안 다음을 반복합니다.
    1. fromBlock이 Shared Data Block이면, 다음을 수행합니다.
      1. agentRecord를 주변 에이전트의 Agent Record로 둡니다.
      2. execution을 agentRecord.[[CandidateExecution]]으로 둡니다.
      3. eventsRecord를 [[AgentSignifier]]가 AgentSignifier()인 execution.[[EventsRecords]]의 Agent Events Record로 둡니다.
      4. bytes를 비결정적으로 선택한 하나의 바이트 값만을 요소로 갖는 List로 둡니다.
      5. 참고: 구현체에서 bytes는 기반 하드웨어의 비원자적 읽기 명령 결과입니다. 비결정성은 약한 일관성을 가진 하드웨어에서 관찰 가능한 동작을 설명하기 위한 메모리 모델의 의미론적 규정입니다.
      6. readEvent를 ReadSharedMemory { [[Order]]: unordered, [[NoTear]]: true, [[Block]]: fromBlock, [[ByteIndex]]: fromIndex, [[ElementSize]]: 1 }로 둡니다.
      7. readEvent를 eventsRecord.[[EventList]]에 추가합니다.
      8. Chosen Value Record { [[Event]]: readEvent, [[ChosenValue]]: bytes }를 execution.[[ChosenValues]]에 추가합니다.
      9. toBlock이 Shared Data Block이면, 다음을 수행합니다.
        1. WriteSharedMemory { [[Order]]: unordered, [[NoTear]]: true, [[Block]]: toBlock, [[ByteIndex]]: toIndex, [[ElementSize]]: 1, [[Payload]]: bytes }를 eventsRecord.[[EventList]]에 추가합니다.
      10. 그렇지 않으면,
        1. toBlock[toIndex]를 bytes[0]으로 설정합니다.
    2. 그렇지 않으면,
      1. 단언: toBlock은 Shared Data Block이 아닙니다.
      2. toBlock[toIndex]를 fromBlock[fromIndex]로 설정합니다.
    3. toIndex를 toIndex + 1로 설정합니다.
    4. fromIndex를 fromIndex + 1로 설정합니다.
    5. count를 count - 1로 설정합니다.
  7. unused를 반환합니다.

6.2.10 PrivateElement 명세 타입

PrivateElement 타입은 private 클래스 필드, 메서드 및 접근자의 명세에서 사용되는 Record입니다. private 요소는 Property Descriptor와 연결되지 않고 프로퍼티도 아니지만, 이를 참조하는 표현식의 런타임 의미론은 몇 가지 측면에서 구성 불가능한 프로퍼티의 런타임 의미론과 유사합니다(private 필드는 쓰기 가능한 데이터 프로퍼티와 유사하고, private 메서드는 쓰기 불가능한 데이터 프로퍼티와 유사하며, private 접근자는 접근자 프로퍼티와 유사합니다). 또한 대응하는 Record 필드는 유사한 목적으로 사용됩니다.

PrivateElement 타입의 값은 표 9에 의해 필드가 정의되는 Record입니다. 이러한 값을 PrivateElements라고 합니다.

표 9: PrivateElement 필드
필드 이름 이 필드가 존재하는 [[Kind]] 필드의 값 값 의미
[[Key]] 전체 Private Name 필드, 메서드 또는 접근자의 이름입니다.
[[Kind]] 전체 field, method 또는 accessor 요소의 종류입니다.
[[Value]] field 및 method ECMAScript 언어 값 필드의 값입니다.
[[Getter]] accessor 함수 객체 또는 undefined 비공개 접근자의 getter입니다.
[[Setter]] accessor 함수 객체 또는 undefined 비공개 접근자의 setter입니다.

6.2.11 ClassFieldDefinition Record 명세 타입

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

ClassFieldDefinition 타입의 값은 표 10에 의해 필드가 정의되는 Record입니다. 이러한 값을 ClassFieldDefinition Records라고 합니다.

표 10: ClassFieldDefinition Record 필드
필드 이름 값 의미
[[Name]] Private Name, String 또는 Symbol 필드의 이름입니다.
[[Initializer]] ECMAScript 함수 객체 또는 empty 필드의 이니셜라이저가 있는 경우 해당 이니셜라이저입니다.

6.2.12 Private Name

Private Name 명세 타입은 비공개 클래스 요소(필드, 메서드 또는 접근자)의 키를 나타내는 전역적으로 고유한 값(그 밖의 면에서 구별할 수 없더라도 다른 모든 Private Name과 서로 다른 값)을 설명하는 데 사용됩니다. 각 Private Name에는 String인 변경 불가능한 [[Description]] 내부 슬롯이 있습니다. Private Name은 PrivateFieldAdd 또는 PrivateMethodOrAccessorAdd를 사용하여 임의의 ECMAScript 객체에 설치할 수 있으며, 이후 PrivateGet과 PrivateSet을 사용하여 읽거나 쓸 수 있습니다.

6.2.13 ClassStaticBlockDefinition Record 명세 타입

ClassStaticBlockDefinition Record는 클래스 정적 초기화 블록의 실행 가능한 코드를 캡슐화하는 데 사용하는 Record입니다.

ClassStaticBlockDefinition Record에는 표 11에 나열된 필드가 있습니다.

표 11: ClassStaticBlockDefinition Record 필드
필드 이름 값 의미
[[BodyFunction]] ECMAScript 함수 객체 클래스의 정적 초기화 중에 호출할 함수 객체입니다.