?
u
m
/
p
1-9
0
`
이 명세서의 알고리즘은 각각 타입이 연관된 값을 다룹니다. 가능한 값의 타입은 이 절에서 정의된 것들만 해당합니다. 타입은
ECMAScript 언어 타입은 ECMAScript 프로그래머가 ECMAScript 언어를 통해 직접 다루는 값에 해당합니다. ECMAScript 언어 타입에는 Undefined, Null, Boolean, String, Symbol, Number, BigInt, Object가 있습니다. ECMAScript 언어 값은 ECMAScript 언어 타입에 의해 특징지어지는 값입니다.
Undefined 타입은
Null 타입은
Boolean 타입은
String 타입은 0개 이상의 16비트 부호 없는 정수값(“요소”)으로 이루어진 모든 순서 있는 시퀀스의 집합이며, 최대 길이는 253 - 1 요소까지입니다. String 타입은 일반적으로 ECMAScript 프로그램에서 텍스트 데이터를 표현하는 데 사용되며, 이 경우 String의 각 요소는 UTF-16 코드 유닛 값으로 간주됩니다. 각 요소는 시퀀스 내에서 위치를 가지며, 이 위치는 0 이상의
String 내용을 해석하지 않는 ECMAScript 연산은 추가 의미를 적용하지 않습니다. String 값을 해석하는 연산은 각 요소를 단일 UTF-16 코드 유닛으로 취급합니다. 그러나 ECMAScript는 이 코드 유닛의 값이나 관계를 제한하지 않으므로, 추가적으로 String 내용을 UTF-16로 인코딩된 유니코드 코드 포인트 시퀀스로 해석하는 연산은 잘못된 하위 시퀀스를 고려해야 합니다. 이러한 연산은 다음 규칙에 따라 0xD800~0xDBFF(유니코드 표준에서 선행 서러게이트, 또는 high-surrogate 코드 유닛)와 0xDC00~0xDFFF(후행 서러게이트, 또는 low-surrogate 코드 유닛) 값을 특별 처리합니다:
String.prototype.normalize
함수(String.prototype.localeCompare
(
이 설계의 취지는 문자열 구현을 최대한 단순하고 고성능으로 유지하는 것이었습니다. ECMAScript 소스 텍스트가 Normalized Form C인 경우, 문자열 리터럴은 유니코드 이스케이프 시퀀스를 포함하지 않는 한 정규화가 보장됩니다.
이 명세서에서 "the string-concatenation of A, B, ..."라는 구문(각 인자가 String 값, 코드 유닛, 또는 코드 유닛 시퀀스임)은 인자 각각의 코드 유닛을 차례로 이어붙인 시퀀스로 구성된 String 값을 의미합니다.
"the substring of S from inclusiveStart to exclusiveEnd"(여기서 S는 String 값 또는 코드 유닛 시퀀스, inclusiveStart와 exclusiveEnd는 정수)라는 구문은 inclusiveStart 인덱스에서 시작하여 exclusiveEnd 바로 앞까지 연속된 코드 유닛으로 구성된 String 값을 의미합니다(inclusiveStart = exclusiveEnd이면 빈 문자열). "to" 접미사가 생략된 경우, S의 길이가 exclusiveEnd로 사용됩니다.
"ASCII word characters"라는 구문은 다음 String 값을 의미하며, 이는 유니코드 Basic Latin 블록 내 모든 문자와 숫자, U+005F(LOW LINE)만으로 구성됩니다:
역사적 이유로 여러 알고리즘에서 의미를 가집니다.
The abstract operation StringIndexOf takes arguments string (a String), searchValue (a String), and fromIndex (a non-negative
searchValue가 빈 문자열이고 fromIndex ≤ string의 길이면 이 알고리즘은 fromIndex를 반환합니다. 빈 문자열은 문자열 내 모든 위치(마지막 코드 유닛 뒤 포함)에서 발견된 것으로 간주됩니다.
fromIndex + searchValue의 길이 > string의 길이이면 이 알고리즘은 항상
The abstract operation StringLastIndexOf takes arguments string (a String), searchValue (a String), and fromIndex (a non-negative
searchValue가 빈 문자열이면 이 알고리즘은 fromIndex를 반환합니다. 빈 문자열은 문자열 내 모든 위치(마지막 코드 유닛 뒤 포함)에서 발견된 것으로 간주됩니다.
Symbol 타입은 Object 프로퍼티의 키로 사용될 수 있는 모든 String이 아닌 값의 집합입니다(
각 Symbol은 고유하며 변하지 않습니다.
각 Symbol에는 불변의 [[Description]] 내부 슬롯이 있으며, 그 값은 String 또는
잘 알려진 심볼은 이 명세서 알고리즘에서 명시적으로 참조되는 내장 Symbol 값입니다. 일반적으로 이 값들은 명세 알고리즘의 확장 지점 역할을 하는 프로퍼티의 키로 사용됩니다. 별도 명시가 없는 한, 잘 알려진 심볼 값은 모든
이 명세서에서는 잘 알려진 심볼을
%Symbol.name%
을 사용합니다. 특히 다음 이름들이 사용되었습니다: @@asyncIterator, @@hasInstance, @@isConcatSpreadable, @@명세 이름 | [[Description]] | 값 및 용도 |
---|---|---|
%Symbol.asyncIterator% |
|
객체의 기본 비동기 이터레이터를 반환하는 메서드. for -await -of 구문의 의미론에 의해 호출됨.
|
%Symbol.hasInstance% |
|
instanceof 연산자 의미론에 의해 호출됨.
|
%Symbol.isConcatSpreadable% |
|
값이 true면, 객체가 Array.prototype.concat |
%Symbol.iterator% |
|
객체의 기본 이터레이터를 반환하는 메서드. for-of 구문의 의미론에 의해 호출됨. |
%Symbol.match% |
|
정규 표현식을 문자열과 매칭하는 정규식 메서드. String.prototype.match |
%Symbol.matchAll% |
|
정규 표현식을 문자열과 매칭하여 이터레이터로 반환하는 정규식 메서드. String.prototype.matchAll |
%Symbol.replace% |
|
문자열의 매칭된 부분을 교체하는 정규식 메서드. String.prototype.replace |
%Symbol.search% |
|
정규 표현식과 매칭되는 문자열 내의 인덱스를 반환하는 정규식 메서드. String.prototype.search |
%Symbol.species% |
|
파생 객체를 생성하는 데 사용되는 |
%Symbol.split% |
|
정규 표현식과 매칭되는 인덱스에서 문자열을 분할하는 정규식 메서드. String.prototype.split |
%Symbol.toPrimitive% |
|
객체를 해당 원시값으로 변환하는 메서드. |
%Symbol.toStringTag% |
|
객체의 기본 문자열 설명을 생성하는 데 사용되는 String 값 프로퍼티. Object.prototype.toString |
%Symbol.unscopables% |
|
자신의 프로퍼티명과 상속된 프로퍼티명이 해당 객체의 with 환경 바인딩에서 제외되는 객체 값 프로퍼티.
|
ECMAScript에는 두 가지 내장 숫자 타입(Number와 BigInt)이 있습니다. 아래 추상 연산들은 이 숫자 타입에 대해 정의되어 있습니다. "결과(Result)" 열은 반환 타입과, 일부 연산 호출이
숫자 타입들은 일반적으로 정밀도 손실이나 절단 없이 변환될 수 없으므로, ECMAScript 언어는 이러한 타입들 간의 암시적 변환을 제공하지 않습니다. 프로그래머는 다른 타입이 필요한 함수를 호출할 때 타입 간 변환을 위해 반드시 Number
와 BigInt
함수를 명시적으로 호출해야 합니다.
ECMAScript의 최초 및 이후 판들은 일부 연산자에 대해 정밀도 손실이나 절단이 발생할 수 있는 암시적 숫자 변환을 제공해왔습니다. 이러한 기존 암시적 변환은 하위 호환성을 위해 유지되지만, BigInt에는 제공되지 않아 프로그래머의 오류 가능성을 최소화하고, 미래 판에서 일반화된 값 타입 옵션을 열어두기 위함입니다.
Number 타입은 정확히 18,437,736,874,454,810,627개(즉, NaN
에 의해 생성됩니다.) 일부 구현에서는 외부 코드가 다양한 NaN 값을 구분할 수 있지만, 그러한 동작은
또 다른 두 개의 특별한 값, +Infinity
(또는 단순히 Infinity
) 및 -Infinity
에 의해 생성됩니다.)
나머지 18,437,736,874,454,810,624개(즉,
양의 0과 음의 0이 모두 존재함을 유의하세요. 설명상 이 값들은 각각 +0
(또는 단순히 0
) 및 -0
에 의해 생성됩니다.)
18,437,736,874,454,810,622개(즉,
18,428,729,675,200,069,632개(즉,
여기서 s는 1 또는 -1, m은 252(포함)에서 253(제외) 사이의 정수, e는 -1074에서 971(포함) 사이의 정수입니다.
나머지 9,007,199,254,740,990개(즉,
여기서 s는 1 또는 -1, m은 0(제외)에서 252(제외) 사이의 정수, e는 -1074입니다.
크기가 253 이하인 모든 양의 및 음의 정수가 Number 타입으로 표현 가능합니다. 정수 0은 Number 타입에서
본 명세에서 “x의 Number 값”이라는 구절은 x가 정확한 실수 수량(π와 같은 무리수일 수도 있음)을 나타내는 경우, 다음 방식으로 선택된 Number 값을 의미합니다. Number 타입의 모든
+∞의 Number 값은
일부 ECMAScript 연산자는
The abstract operation Number::unaryMinus takes argument x (a Number) and returns a Number. It performs the following steps when called:
The abstract operation Number::bitwiseNOT takes argument x (a Number) and returns an
The abstract operation Number::exponentiate takes arguments base (a Number) and exponent (a Number) and returns a Number. base에 exponent 제곱을 한 결과를 구현에 따라 근사한 값을 반환한다. It performs the following steps when called:
base가 **
exponent의 결과는
The abstract operation Number::multiply takes arguments x (a Number) and y (a Number) and returns a Number.
The abstract operation Number::divide takes arguments x (a Number) and y (a Number) and returns a Number.
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:
C 및 C++에서 나머지 연산자는 정수 피연산자만 허용하지만, ECMAScript에서는 부동소수점 피연산자도 허용합니다.
%
가 Java의 The abstract operation Number::add takes arguments x (a Number) and y (a Number) and returns a Number.
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:
항상 x - y
의 결과는 x + (-y)
의 결과와 같습니다.
The abstract operation Number::leftShift takes arguments x (a Number) and y (a Number) and returns an
The abstract operation Number::signedRightShift takes arguments x (a Number) and y (a Number) and returns an
The abstract operation Number::unsignedRightShift takes arguments x (a Number) and y (a Number) and returns an
The abstract operation Number::lessThan takes arguments x (a Number) and y (a Number) and returns a Boolean or
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:
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:
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:
The abstract operation NumberBitwiseOp takes arguments op (&
, ^
, 또는 |
), x (a Number), and y (a Number) and returns an
&
이면,^
이면,|
이다.The abstract operation Number::bitwiseAND takes arguments x (a Number) and y (a Number) and returns an
&
, x, y) 반환.The abstract operation Number::bitwiseXOR takes arguments x (a Number) and y (a Number) and returns an
^
, x, y) 반환.The abstract operation Number::bitwiseOR takes arguments x (a Number) and y (a Number) and returns an
|
, x, y) 반환.The abstract operation Number::toString takes arguments x (a Number) and radix (an
1.2e+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
미러 사이트에서 확인 가능.
BigInt 타입은 정수 값을 나타냅니다. 값의 크기는 제한이 없으며 특정 비트 폭에 제한되지 않습니다. 별도 언급이 없는 한, 연산들은 일반적으로 정확한 수학적 결과를 반환하도록 설계되었습니다. 이항 연산에서 BigInt는 2의 보수 이진 문자열처럼 동작하며, 음수는 비트가 왼쪽으로 무한히 설정된 것으로 취급됩니다.
The abstract operation BigInt::unaryMinus takes argument x (a BigInt) and returns a BigInt. It performs the following steps when called:
The abstract operation BigInt::bitwiseNOT takes argument x (a BigInt) and returns a BigInt. x의 1의 보수를 반환합니다. It performs the following steps when called:
The abstract operation BigInt::exponentiate takes arguments base (a BigInt) and exponent (a BigInt) and returns either a
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:
The abstract operation BigInt::divide takes arguments x (a BigInt) and y (a BigInt) and returns either a
The abstract operation BigInt::remainder takes arguments n (a BigInt) and d (a BigInt) and returns either a
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:
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:
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:
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:
The abstract operation BigInt::unsignedRightShift takes arguments x (a BigInt) and y (a BigInt) and returns a
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:
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:
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:
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:
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:
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:
&
이면,|
이면,^
이다.&
이면,|
이면,^
이다.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:
&
, 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:
^
, 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:
|
, x, y)를 반환한다.The abstract operation BigInt::toString takes arguments x (a BigInt) and radix (an
Object 타입의 각 인스턴스(간단히 “객체”라고도 함)는 프로퍼티들의 집합을 나타냅니다. 각 프로퍼티는 데이터 프로퍼티 또는 접근자 프로퍼티입니다:
객체의 프로퍼티는
정수 인덱스는
모든 객체는 논리적으로 프로퍼티의 집합이지만, 프로퍼티 접근과 조작의 의미론이 다른 여러 형태의 객체가 존재합니다. 여러 형태의 객체 정의는
또한 일부 객체는 호출 가능하며, 이러한 객체를 함수 또는
속성은
속성 이름 | 해당되는 프로퍼티 종류 | 값 도메인 | 기본값 | 설명 |
---|---|---|---|---|
[[Value]] |
|
|
|
get 접근으로 프로퍼티에서 가져오는 값입니다. |
[[Writable]] |
|
불리언 |
|
|
[[Get]] |
|
Object 또는 |
|
값이 Object인 경우, 반드시 |
[[Set]] |
|
Object 또는 |
|
값이 Object인 경우, 반드시 |
[[Enumerable]] |
|
불리언 |
|
|
[[Configurable]] |
|
불리언 |
|
|
ECMAScript에서 객체의 실제 의미론은 내부 메소드라 불리는 알고리즘을 통해 지정됩니다. ECMAScript 엔진의 각 객체는 런타임 행동을 정의하는 내부 메소드 집합과 연결되어 있습니다. 이러한 내부 메소드는 ECMAScript 언어의 일부가 아닙니다. 이 명세에서는 순전히 설명 목적으로 정의됩니다. 하지만 ECMAScript 구현 내의 각 객체는 해당 객체에 연결된 내부 메소드로 지정된 대로 동작해야 합니다. 이를 구현하는 정확한 방법은 구현에 따라 결정됩니다.
내부 메소드 이름은 다형적입니다. 즉, 서로 다른 객체 값이 동일한 내부 메소드 이름이 호출될 때 서로 다른 알고리즘을 실행할 수 있습니다. 내부 메소드가 호출되는 실제 객체는 호출의 “대상”입니다. 런타임에 알고리즘 구현이 객체가 지원하지 않는 내부 메소드를 사용하려 하면
내부 슬롯은 객체, 심볼, 또는
모든 객체는 [[PrivateElements]]라는 내부 슬롯을 가지며, 이는 PrivateElements의 리스트입니다. 이 리스트는 객체의 private 필드, 메소드, 접근자의 값을 나타냅니다. 초기에는 빈 리스트입니다.
내부 메소드와 내부 슬롯은 이 명세에서 [[ ]]로 둘러싼 이름으로 식별됩니다.
일반 객체는 다음 기준을 모두 만족하는 객체입니다:
이국 객체는
이 명세는 내부 메소드에 따라 여러 종류의
내부 메소드는 매개변수 외에도 항상 해당 메소드 호출의 대상 객체에 접근할 수 있습니다.
내부 메소드는 암시적으로
내부 메소드 | 서명(Signature) | 설명 |
---|---|---|
[[GetPrototypeOf]] | ( ) → Object | Null |
이 객체의 상속 프로퍼티를 제공하는 객체를 결정합니다. |
[[SetPrototypeOf]] | (Object | Null) → Boolean |
이 객체를 상속 프로퍼티를 제공하는 다른 객체와 연결합니다. |
[[IsExtensible]] | ( ) → Boolean | 이 객체에 추가 프로퍼티를 추가할 수 있는지 결정합니다. |
[[PreventExtensions]] | ( ) → Boolean |
객체에 새 프로퍼티를 추가할 수 있는지 제어합니다. 연산이 성공하면 |
[[GetOwnProperty]] |
(propertyKey) → Undefined | |
이 객체의 키가 propertyKey인 자체 프로퍼티에 대한 프로퍼티 설명자를 반환하거나, 해당 프로퍼티가 없으면 |
[[DefineOwnProperty]] | (propertyKey, PropertyDescriptor) → Boolean |
키가 propertyKey인 자체 프로퍼티를 생성하거나 상태를 PropertyDescriptor로 변경합니다. 프로퍼티가 성공적으로 생성/업데이트되면 |
[[HasProperty]] | (propertyKey) → Boolean | 이 객체에 propertyKey인 자체 또는 상속 프로퍼티가 이미 있는지 불리언 값으로 반환합니다. |
[[Get]] | (propertyKey, Receiver) → any |
이 객체에서 키가 propertyKey인 프로퍼티의 값을 반환합니다. 프로퍼티 값을 가져오려면 ECMAScript 코드 실행이 필요할 수 있으며, 그 경우 Receiver가 코드 평가 시 |
[[Set]] | (propertyKey, value, Receiver) → Boolean |
키가 propertyKey인 프로퍼티 값을 value로 설정합니다. ECMAScript 코드 실행이 필요하면, Receiver가 |
[[Delete]] | (propertyKey) → Boolean |
키가 propertyKey인 자체 프로퍼티를 객체에서 제거합니다. 프로퍼티가 삭제되지 않고 여전히 존재하면 |
[[OwnPropertyKeys]] |
( ) → |
객체에 대한 모든 자체 |
내부 메소드 | 서명(Signature) | 설명 |
---|---|---|
[[Call]] | (any, any의 리스트) → any |
이 객체와 연관된 코드를 실행합니다. 함수 호출 표현식으로 호출됩니다. 내부 메소드의 인자는 |
[[Construct]] | (any의 리스트, Object) → Object |
객체를 생성합니다. new 연산자나 super 호출로 호출됩니다. 내부 메소드의 첫 번째 인자는 super 호출의 인자 리스트이고, 두 번째 인자는 new 연산자가 최초로 적용된 객체입니다. 이 내부 메소드를 구현한 객체는 |
ECMAScript 엔진의 객체 내부 메소드는 아래에 명시된 불변성 목록을 준수해야 합니다. 일반 ECMAScript 객체와 이 명세의 모든 표준
구현에서 제공하는
이 불변성을 필수 내부 메소드의 기능을 대체하는 대체 인터페이스를 제공하는 등 어떤 방식으로든 우회하도록 허용해서는 안 됩니다.
모든 내부 메소드가 반환하는 값은 다음 중 하나인
내부 메소드는 continue, break, return 완료를 반환하면 안 됩니다.
세 번째 불변성의 결과로,
잘 알려진 내장 객체는 이 명세의 알고리즘에서 명시적으로 참조되는 내장 객체이며, 일반적으로
이 명세 내에서 %name%과 같은 참조는 현재
명세 타입은 ECMAScript 언어 구조와
Enum은 명세 내부에서만 사용되며 ECMAScript 코드에서는 직접적으로 관찰할 수 없는 값입니다. Enum은
List 타입은 new
표현식, 함수 호출, 그 외 값의 단순 순서 리스트가 필요한 알고리즘에서 인자 리스트 평가를 설명하는 데 사용됩니다(
알고리즘이 List의 요소를 반복할 때 순서를 지정하지 않으면 List 요소의 순서대로 사용됩니다.
이 명세에서는 리터럴 문법을 사용해 새로운 List 값을 표현할 수 있습니다. 예를 들어, « 1, 2 »는 두 개의 요소를 특정 값으로 초기화한 List 값을 정의합니다. 새로운 빈 List는 « »로 표현할 수 있습니다.
이 명세에서 “the list-concatenation of A, B, ...”(각 인자가 비어 있을 수도 있는 List)라는 표현은 각 인자(순서대로)의 요소를 이어붙인(순서대로) 새로운 List 값을 의미합니다.
List가 String 요소로 구성된 경우 “sorted according to lexicographic code unit order”란,
Record 타입은 이 명세의 알고리즘 내에서 데이터 집합을 설명하는 데 사용됩니다. Record 타입 값은 하나 이상의 이름 있는 필드로 구성됩니다. 각 필드의 값은
이 명세에서는 객체 리터럴과 유사한 문법으로 Record 값을 표현할 수 있습니다. 예를 들어, { [[Field1]]: 42, [[Field2]]:
명세 텍스트와 알고리즘에서 점 표기법으로 Record 값의 특정 필드를 참조할 수 있습니다. 예를 들어, 위의 예시 Record R에 대해 R.[[Field2]]는 “R의 [[Field2]] 필드”를 의미합니다.
자주 사용되는 Record 필드 조합에 대해 스키마 이름을 붙일 수 있으며, 그 이름을 리터럴 Record 값에 접두어로 사용해 특정 집합의 집계임을 명시할 수 있습니다. 예: PropertyDescriptor { [[Value]]: 42, [[Writable]]:
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에 대해:
위 두 속성은 각각 반사 불가성(irreflexivity)과 추이성(transitivity)이라 부릅니다.
엄격 전순서(strict total order)는 다음을 만족하는 Relation 값 R입니다.
모든 R의 도메인 내 a, b, c에 대해:
위 세 속성은 각각 전체성(totality), 반사 불가성(irreflexivity), 추이성(transitivity)이라 부릅니다.
Completion Record 명세 타입은 실행 중 값의 전달과 제어 흐름(비지역적 제어 이동을 수행하는 문장인 break
, continue
, return
, throw
의 동작 등)을 설명하는 데 사용됩니다.
Completion Record는
필드 이름 | 값 | 의미 |
---|---|---|
[[Type]] |
|
발생한 completion의 타입 |
[[Value]] |
|
생성된 값 |
[[Target]] |
문자열 또는 |
지시된 제어 이동의 대상 레이블 |
다음과 같은 용어들이 Completion Record를 참조할 때 종종 사용됩니다.
이 명세에서 정의된 호출 가능한 객체는 항상 normal completion이나 throw completion만 반환합니다. 그 외 Completion Record를 반환하는 것은 편집 오류로 간주합니다.
The abstract operation NormalCompletion takes argument value (
The abstract operation ThrowCompletion takes argument value (
The abstract operation ReturnCompletion takes argument value (
The abstract operation UpdateEmpty takes arguments completionRecord (
Reference Record 타입은 delete
, typeof
, 대입 연산자, super
키워드 및 기타 언어 기능의 동작을 설명하는 데 사용됩니다. 예를 들어, 대입의 왼쪽 피연산자는 Reference Record를 생성해야 합니다.
Reference Record는 해석된 이름 또는(아직 해석되지 않았을 수도 있는) 프로퍼티 바인딩이며, 필드는
필드 이름 | 값 | 의미 |
---|---|---|
[[Base]] | 바인딩을 담고 있는 값 또는 |
|
[[ReferencedName]] | 바인딩의 이름. [[Base]] 값이 |
|
[[Strict]] | 불리언 | |
[[ThisValue]] | super 키워드로 표현된 프로퍼티 바인딩을 나타냅니다. 이를 Super Reference Record라 하며, [[Base]] 값은 |
Reference Record를 다루기 위해 명세에서 다음과 같은 추상 연산을 사용합니다:
The abstract operation IsPropertyReference takes argument V (
The abstract operation IsUnresolvableReference takes argument V (
The abstract operation IsSuperReference takes argument V (
The abstract operation IsPrivateReference takes argument V (
The abstract operation GetValue takes argument V (
The abstract operation PutValue takes arguments V (
The abstract operation GetThisValue takes argument V (
The abstract operation InitializeReferencedBinding takes arguments V (
The abstract operation MakePrivateReference takes arguments baseValue (
Property Descriptor 타입은 Object 프로퍼티 속성의 조작과 구체화를 설명하는 데 사용됩니다. Property Descriptor는 0개 이상의 필드를 갖는
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이면서
이 명세에서 Property Descriptor 값을 다루기 위해 다음 추상 연산을 사용합니다:
The abstract operation IsAccessorDescriptor takes argument Desc (
The abstract operation IsDataDescriptor takes argument Desc (
The abstract operation IsGenericDescriptor takes argument Desc (
The abstract operation FromPropertyDescriptor takes argument Desc (
The abstract operation ToPropertyDescriptor takes argument Obj (
The abstract operation CompletePropertyDescriptor takes argument Desc (
Abstract Closure 명세 타입은 알고리즘 단계와 값 집합을 함께 참조하는 데 사용됩니다. Abstract Closure는 메타 값이며 함수 호출 방식(closure(arg1, arg2))으로 호출됩니다. 추상 연산과 마찬가지로, 호출 시 Abstract Closure에 기술된 알고리즘 단계를 수행합니다.
Abstract Closure를 생성하는 알고리즘 단계에서는 "capture" 뒤에 별칭 목록으로 값을 캡처합니다. Abstract Closure가 생성될 때 각 별칭에 연관된 값을 캡처합니다. Abstract Closure가 호출될 때 수행할 알고리즘 단계에서는 캡처된 값을 캡처 당시 사용된 별칭으로 참조합니다.
Abstract Closure가
Abstract Closure는 다른 알고리즘의 일부로 인라인 생성됩니다. 예시는 다음과 같습니다.
Data Block 명세 타입은 개별적이고 변경 가능한 바이트 크기(8비트)의 숫자값 시퀀스를 설명하는 데 사용됩니다. byte value는 0부터 255(포함) 사이의 정수입니다. Data Block 값은 고정된 바이트 수로 생성되며 각 바이트의 초기값은 0입니다.
이 명세에서는 배열과 유사한 문법으로 Data Block 값의 개별 바이트에 접근할 수 있습니다. 이 표기법은 Data Block 값을 0 기반
메모리 내에서 여러
Shared Data Block의 의미론은 메모리 모델에서 Shared Data Block 이벤트를 사용해 정의됩니다. 아래 추상 연산들은 Shared Data Block 이벤트를 도입하며, 평가 의미론과 메모리 모델의 이벤트 의미론 사이의 인터페이스 역할을 합니다. 이벤트들은 후보 실행(
Shared Data Block 이벤트는 메모리 모델에서 정의된
이 명세에서 Data Block 값을 다루기 위해 다음과 같은 추상 연산을 사용합니다:
The abstract operation CreateByteDataBlock takes argument size (0 이상 정수) and returns
The abstract operation CreateSharedByteDataBlock takes argument size (0 이상 정수) and returns
The abstract operation CopyDataBlockBytes takes arguments toBlock (
PrivateElement 타입은 private 클래스 필드, 메소드, 접근자 명세에 사용되는
PrivateElement 타입의 값은
필드 이름 | [[Kind]] 필드 값이 있을 때 | 값 | 의미 |
---|---|---|---|
[[Key]] | 전체 |
|
필드, 메소드, 접근자의 이름 |
[[Kind]] | 전체 |
|
element의 종류 |
[[Value]] |
|
|
필드의 값 |
[[Get]] |
|
|
private 접근자의 getter |
[[Set]] |
|
|
private 접근자의 setter |
ClassFieldDefinition 타입은 클래스 필드 명세에 사용되는
ClassFieldDefinition 타입의 값은
필드 이름 | 값 | 의미 |
---|---|---|
[[Name]] |
|
필드의 이름 |
[[Initializer]] |
ECMAScript |
필드의 초기화 함수(있으면) |
Private Name 명세 타입은 전역적으로 고
ClassStaticBlockDefinition Record는 클래스 static 초기화 블록의 실행 코드를 캡슐화하는 데 사용되는
ClassStaticBlockDefinition Record는
필드 이름 | 값 | 의미 |
---|---|---|
[[BodyFunction]] |
ECMAScript |
클래스 static 초기화 시 호출되는 |