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

String 내용을 해석하지 않는 ECMAScript 연산은 추가 의미를 적용하지 않는다. String 값을 해석하는 연산은 각 요소를 단일 UTF-16 코드 유닛으로 취급한다. 그러나 ECMAScript는 이 코드 유닛들의 값이나 상호 관계를 제한하지 않으므로, String 내용을 UTF-16으로 인코딩된 유니코드 코드 포인트의 시퀀스로 더 해석하는 연산은 잘못 형성된 부분 시퀀스를 고려해야 한다. 이러한 연산은 숫자 값이 0xD800에서 0xDBFF까지의 포함 구간에 있는 모든 코드 유닛(Unicode 표준에서 leading surrogate 로 정의되며, 더 형식적으로는 high-surrogate code unit 이라고 함)과, 숫자 값이 0xDC00에서 0xDFFF까지의 포함 구간에 있는 모든 코드 유닛(trailing surrogate로 정의되며, 더 형식적으로는 low-surrogate code unit 이라고 함)에 대해 다음 규칙을 사용하여 특별 처리를 적용한다.

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

Note

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

이 명세에서 "A, B, ...의 string-concatenation "이라는 구(각 인수는 String 값, 코드 유닛, 또는 코드 유닛 시퀀스이다)는 각 인수의 코드 유닛을 (순서대로) 이어 붙인 코드 유닛 시퀀스를 가지는 String 값을 뜻한다.

"inclusiveStart부터 exclusiveEnd까지의 strsubstring"이라는 구(str은 String 값 또는 코드 유닛 시퀀스이고 inclusiveStartexclusiveEnd정수이다)는 인덱스 inclusiveStart에서 시작하여 인덱스 exclusiveEnd 바로 앞에서 끝나는 str의 연속된 코드 유닛으로 이루어진 String 값을 뜻한다 (inclusiveStart = exclusiveEnd이면 빈 String이다). "to" 접미사가 생략되면 str의 길이가 exclusiveEnd 값으로 사용된다.

"ASCII 단어 문자들"이라는 구는 다음 String 값을 뜻하며, 이는 U+005F (LOW LINE)와 함께 Unicode Basic Latin 블록의 모든 문자와 숫자만으로 구성된다:
"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 or not-found. It performs the following steps when called:

  1. lenstring의 길이라고 하자.
  2. searchValue가 빈 String이고 fromIndexlen이면, fromIndex를 반환한다.
  3. searchLensearchValue의 길이라고 하자.
  4. fromIndexilen - searchLen을 만족하는 각 정수 i에 대해, 오름차순으로 다음을 수행한다.
    1. candidatestringi부터 i + searchLen까지의 substring이라고 하자.
    2. candidatesearchValue이면, i를 반환한다.
  5. not-found를 반환한다.
Note 1

searchValue가 빈 String이고 fromIndexstring의 길이면, 이 알고리즘은 fromIndex를 반환한다. 빈 String은 마지막 코드 유닛 뒤를 포함하여 문자열의 모든 위치에서 사실상 발견된다.

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 or not-found. It performs the following steps when called:

  1. lenstring의 길이라고 하자.
  2. searchLensearchValue의 길이라고 하자.
  3. Assert: fromIndex + searchLenlen.
  4. 0 ≤ ifromIndex를 만족하는 각 정수 i에 대해, 내림차순으로 다음을 수행한다.
    1. candidatestringi부터 i + searchLen까지의 substring이라고 하자.
    2. candidatesearchValue이면, i를 반환한다.
  5. not-found를 반환한다.
Note

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

6.1.5 Symbol 타입

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

각 Symbol은 고유하며 불변이다.

각 Symbol은 값이 String 또는 undefined인 불변의 [[Description]] 내부 슬롯을 가진다.

6.1.5.1 Well-Known Symbols

well-known symbol은 이 명세의 알고리즘에서 명시적으로 참조되는 내장 Symbol 값이다. 이들은 일반적으로 명세 알고리즘의 확장 지점으로 기능하는 값을 가지는 프로퍼티의 키로 사용된다. 달리 명시되지 않는 한, well-known symbol 값은 모든 realm에서 공유된다 (9.3).

이 명세에서 well-known symbol은, intrinsic이 Table 1에 나열된 값 중 하나인 표준 intrinsic 표기법 을 사용하여 참조된다.

Note
이 명세의 이전 판에서는 @@name 형식의 표기법을 사용했으며, 현재 판에서는 %Symbol.name%를 사용한다. 특히 다음 이름들이 사용되었다: @@asyncIterator, @@hasInstance, @@isConcatSpreadable, @@iterator, @@match, @@matchAll, @@replace, @@search, @@species, @@split, @@toPrimitive, @@toStringTag, @@unscopables.
Table 1: Well-known Symbols
명세 이름 [[Description]] 값과 목적
%Symbol.asyncIterator% "Symbol.asyncIterator" 객체의 기본 async iterator를 반환하는 메서드. for-await-of 문의 의미론에 의해 호출된다.
%Symbol.hasInstance% "Symbol.hasInstance" 생성자 객체가 어떤 객체를 해당 생성자의 인스턴스 중 하나로 인식하는지를 결정하는 메서드. instanceof 연산자의 의미론에 의해 호출된다.
%Symbol.isConcatSpreadable% "Symbol.isConcatSpreadable" 값이 참이면 객체가 Array.prototype.concat에 의해 자신의 배열 요소들로 평탄화되어야 함을 나타내는 Boolean 값 프로퍼티.
%Symbol.iterator% "Symbol.iterator" 객체의 기본 iterator를 반환하는 메서드. for-of 문의 의미론에 의해 호출된다.
%Symbol.match% "Symbol.match" 정규 표현식을 문자열에 매치시키는 정규 표현식 메서드. String.prototype.match 메서드에 의해 호출된다.
%Symbol.matchAll% "Symbol.matchAll" 문자열에 대한 정규 표현식의 매치를 산출하는 iterator를 반환하는 정규 표현식 메서드. 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" 열은 반환 타입을 보여 주며, 해당 연산의 일부 호출이 급작 완료를 반환할 가능성이 있는지 여부도 함께 나타낸다.

Table 2: Numeric Type Operations
연산 예시 소스 ...의 Evaluation 의미론에 의해 호출됨 결과
Number::unaryMinus -x 단항 - 연산자 Number
BigInt::unaryMinus BigInt
Number::bitwiseNOT ~x 비트 NOT 연산자 ( ~ ) Number
BigInt::bitwiseNOT BigInt
Number::exponentiate x ** y 거듭제곱 연산자 and Math.pow ( base, exponent ) Number
BigInt::exponentiate BigInt를 포함하는 정상 완료 또는 throw 완료
Number::multiply x * y 곱셈 연산자 Number
BigInt::multiply BigInt
Number::divide x / y 곱셈 연산자 Number
BigInt::divide BigInt를 포함하는 정상 완료 또는 throw 완료
Number::remainder x % y 곱셈 연산자 Number
BigInt::remainder BigInt를 포함하는 정상 완료 또는 throw 완료
Number::add x ++
++ x
x + y
후위 증가 연산자, 전위 증가 연산자, and 덧셈 연산자 ( + ) Number
BigInt::add BigInt
Number::subtract x --
-- x
x - y
후위 감소 연산자, 전위 감소 연산자, and 뺄셈 연산자 ( - ) 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 throw 완료
Number::lessThan x < y
x > y
x <= y
x >= y
관계 연산자, via IsLessThan ( x, y, leftFirst ) Boolean 또는 undefined (순서가 정해지지 않은 입력의 경우)
BigInt::lessThan Boolean
Number::equal x == y
x != y
x === y
x !== y
동등 연산자, via IsStrictlyEqual ( x, y ) Boolean
BigInt::equal
Number::sameValue Object.is(x, y) Object internal methods, via SameValue ( x, y ), to test exact value equality Boolean
Number::sameValueZero [x].includes(y) via SameValueZero ( x, y ), to test value equality, ignoring the difference between +0𝔽 and -0𝔽, as in Array, Map, and Set methods 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) Many expressions and built-in functions, via 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 Standard for Binary Floating-Point Arithmetic에 명시된 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 값의 내부 표현과 반드시 동일할 필요는 없다.

또 다른 두 개의 특수 값이 있으며, positive Infinitynegative Infinity라고 부른다. 간결함을 위해 설명 목적상 이 값들은 각각 기호 +∞𝔽-∞𝔽로도 지칭된다. (이 두 개의 무한 Number 값은 프로그램 표현식 +Infinity (또는 단순히 Infinity)와 -Infinity에 의해 생성된다는 점에 유의하라.)

나머지 18,437,736,874,454,810,624개(즉, 264 - 253)의 값은 유한 수라고 불린다. 이들 중 절반은 양수이고 절반은 음수이며, 모든 유한 양의 Number 값마다 같은 크기를 가지는 대응 음의 값이 존재한다.

positive zeronegative zero가 모두 존재한다는 점에 유의하라. 간결함을 위해 설명 목적상 이 값들은 각각 기호 +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 (위에 제시된 두 형식 중 하나에서)이 홀수이면 홀수 유효숫자 (odd significand)를 가진다. 그렇지 않으면 짝수 유효숫자 를 가진다.

이 명세에서 “x에 대한 Number value for ”라는 구는, 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까지의 포함 구간이나, 0에서 216 - 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를 계산한다.

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𝔽이면, +∞𝔽를 반환한다.
    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. Assert: base유한하고 +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. Assert: 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 초판은 이 연산에 대해 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 binary 배정밀도 산술의 규칙에 따라 곱셈을 수행하여 xy의 곱을 생성한다. It performs the following steps when called:

  1. xNaN이거나 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 binary 배정밀도 산술의 규칙에 따라 나눗셈을 수행하여 x를 피제수, y를 제수로 하는 몫을 생성한다. It performs the following steps when called:

  1. xNaN이거나 yNaN이면, 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 ( 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. nNaN이거나 dNaN이면, NaN을 반환한다.
  2. n+∞𝔽 또는 -∞𝔽이면, NaN을 반환한다.
  3. d+∞𝔽 또는 -∞𝔽이면, n을 반환한다.
  4. d+0𝔽 또는 -0𝔽이면, NaN을 반환한다.
  5. n+0𝔽 또는 -0𝔽이면, n을 반환한다.
  6. Assert: 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++에서 remainder 연산자는 정수 피연산자만 허용하지만, ECMAScript에서는 부동소수점 피연산자도 허용한다.

Note 2
% 연산자가 계산하는 부동소수점 remainder 연산의 결과는 IEEE 754-2019에서 정의한 “remainder” 연산과 동일하지 않다. IEEE 754-2019 “remainder” 연산은 절단 나눗셈이 아니라 반올림 나눗셈의 나머지를 계산하므로, 그 동작은 일반적인 integer remainder 연산자와 유사하지 않다. 대신 ECMAScript 언어는 부동소수점 연산에서 %가 Java의 integer remainder 연산자와 유사한 방식으로 동작하도록 정의한다. 이는 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 binary 배정밀도 산술의 규칙에 따라 덧셈을 수행하여 인수들의 합을 생성한다. It performs the following steps when called:

  1. xNaN이거나 yNaN이면, NaN을 반환한다.
  2. x+∞𝔽이고 y-∞𝔽이면, NaN을 반환한다.
  3. x-∞𝔽이고 y+∞𝔽이면, NaN을 반환한다.
  4. x+∞𝔽 또는 -∞𝔽이면, x를 반환한다.
  5. y+∞𝔽 또는 -∞𝔽이면, y를 반환한다.
  6. Assert: 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 - yx + (-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) modulo 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) modulo 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) modulo 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. Assert: xy유한하다.
  11. (x) < (y)이면, true를 반환한다.
  12. 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. xNaN이고 yNaN이면, 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. xNaN이고 yNaN이면, 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 (&, ^, or |), 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에 비트 배타적 OR (XOR) 연산을 적용한 결과라고 하자.
  7. 그렇지 않으면,
    1. Assert: op|이다.
    2. resultlBitsrBits에 비트 포괄적 OR 연산을 적용한 결과라고 하자.
  8. 32비트 2의 보수 비트 문자열 result가 나타내는 정수에 대한 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의 위치 표기 수 체계를 사용하여 String으로 나타낸다. 기수 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)의 string-concatenation을 반환한다.
  4. x+∞𝔽이면, "Infinity"를 반환한다.
  5. n, k, s를 다음을 만족하는 정수라고 하자: k ≥ 1, radixk - 1s < radixk, 𝔽(s × radixn - k)가 x이며, k는 가능한 한 작다. k는 기수 radix를 사용한 s 표현의 자릿수이고, sradix로 나누어떨어지지 않으며, s의 최하위 자릿수는 이 기준들만으로는 반드시 유일하게 결정되지 않는다는 점에 유의하라.
  6. radix ≠ 10이거나 n이 -5부터 21까지의 포함 구간에 있으면,
    1. nk이면,
      1. 다음의 string-concatenation을 반환한다:
        • 기수 radix를 사용한 s 표현의 k개 숫자의 코드 유닛들
        • 코드 유닛 0x0030 (DIGIT ZERO)의 n - k회 반복
    2. n > 0이면,
      1. 다음의 string-concatenation을 반환한다:
        • 기수 radix를 사용한 s 표현의 최상위 n개 숫자의 코드 유닛들
        • 코드 유닛 0x002E (FULL STOP)
        • 기수 radix를 사용한 s 표현의 나머지 k - n개 숫자의 코드 유닛들
    3. Assert: n ≤ 0.
    4. 다음의 string-concatenation을 반환한다:
      • 코드 유닛 0x0030 (DIGIT ZERO)
      • 코드 유닛 0x002E (FULL STOP)
      • 코드 유닛 0x0030 (DIGIT ZERO)의 -n회 반복
      • 기수 radix를 사용한 s 표현의 k개 숫자의 코드 유닛들
  7. NOTE: 이 경우 입력은 1.2e+3과 같은 과학적 E 표기법을 사용하여 표현된다.
  8. Assert: radix는 10이다.
  9. n < 0이면,
    1. exponentSign을 코드 유닛 0x002D (HYPHEN-MINUS)라고 하자.
  10. 그렇지 않으면,
    1. exponentSign을 코드 유닛 0x002B (PLUS SIGN)라고 하자.
  11. k = 1이면,
    1. 다음의 string-concatenation을 반환한다:
      • s의 단일 숫자 코드 유닛
      • 코드 유닛 0x0065 (LATIN SMALL LETTER E)
      • exponentSign
      • abs(n - 1)의 십진 표현 코드 유닛들
  12. 다음의 string-concatenation을 반환한다:
    • s의 십진 표현에서 최상위 숫자의 코드 유닛
    • 코드 유닛 0x002E (FULL STOP)
    • s의 십진 표현에서 나머지 k - 1개 숫자의 코드 유닛들
    • 코드 유닛 0x0065 (LATIN SMALL LETTER E)
    • exponentSign
    • abs(n - 1)의 십진 표현 코드 유닛들
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는 가능한 한 작다. s에 대해 여러 가능성이 있으면, s × radixn - k(x)에 가장 가까워지도록 s를 선택한다. 그런 s 값이 둘이면, 짝수인 쪽을 선택한다. k는 기수 radix를 사용한 s 표현의 자릿수이고 sradix로 나누어떨어지지 않는다는 점에 유의하라.
Note 3

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

Gay, David M. Correctly Rounded Binary-Decimal and Decimal-Binary Conversions. Numerical Analysis, Manuscript 90-10. AT&T Bell Laboratories (Murray Hill, New Jersey). 30 November 1990. Available as
https://ampl.com/_archive/first-website/REFS/rounding.pdf. Associated code available as
http://netlib.sandia.gov/fp/dtoa.c and as
http://netlib.sandia.gov/fp/g_fmt.c and may also be found at the various netlib mirror sites.

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 예외를 던진다.
  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 예외를 던진다.
  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 예외를 던진다.
  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 예외를 던진다.

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를 반환한다.
  2. 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를 반환한다.
  2. 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 modulo 2라고 하자.
    2. yDigity modulo 2라고 하자.
    3. op&이면,
      1. resultresult + 2shift × BinaryAnd(xDigit, yDigit)로 설정한다.
    4. 그렇지 않고 op|이면,
      1. resultresult + 2shift × BinaryOr(xDigit, yDigit)로 설정한다.
    5. 그렇지 않으면,
      1. Assert: 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 modulo 2, y modulo 2)라고 하자.
  7. 그렇지 않고 op|이면,
    1. tmpBinaryOr(x modulo 2, y modulo 2)라고 하자.
  8. 그렇지 않으면,
    1. Assert: op^이다.
    2. tmpBinaryXor(x modulo 2, y modulo 2)라고 하자.
  9. tmp ≠ 0이면,
    1. resultresult - 2shift로 설정한다.
    2. NOTE: 이것은 부호를 확장한다.
  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의 위치 표기 수 체계를 사용하여 String으로 나타낸다. 기수 r을 사용하는 BigInt 표현에 사용되는 숫자들은 "0123456789abcdefghijklmnopqrstuvwxyz"의 처음 r개 코드 유닛을 순서대로 취한 것이다. 0이 아닌 BigInt의 표현에는 앞쪽 0이 결코 포함되지 않는다. It performs the following steps when called:

  1. x < 0이면, "-"BigInt::toString(-x, radix)의 string-concatenation을 반환한다.
  2. 기수 radix를 사용한 x의 표현으로 이루어진 String 값을 반환한다.

6.1.7 Object 타입

Object 타입의 각 인스턴스, 즉 간단히 “an Object”라고도 불리는 것은 프로퍼티들의 집합을 나타낸다. 각 프로퍼티는 데이터 프로퍼티이거나 접근자 프로퍼티이다.

  • data property는 키 값을 ECMAScript 언어 값 및 Boolean 속성 집합과 연관시킨다.
  • accessor property는 키 값을 하나 또는 두 개의 접근자 함수 및 Boolean 속성 집합과 연관시킨다. 접근자 함수는 해당 프로퍼티와 연관된 ECMAScript 언어 값을 저장하거나 검색하는 데 사용된다.

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

integer index CanonicalNumericIndexString(n)이 +0𝔽에서 𝔽(253 - 1)까지의 포함 구간에 있는 정수 Number를 반환하는 프로퍼티 이름 n이다. array indexCanonicalNumericIndexString(n)이 +0𝔽에서 𝔽(232 - 2)까지의 포함 구간에 있는 정수 Number를 반환하는 integer index n이다.

Note

모든 음이 아닌 안전 정수는 대응하는 integer index를 가진다. 232 - 1을 제외한 모든 32비트 부호 없는 정수는 대응하는 array index를 가진다. "-0"는 integer index도 array index도 아니다.

프로퍼티 키는 프로퍼티와 그 값을 접근하는 데 사용된다. 프로퍼티 접근에는 두 종류가 있다: getset으로, 각각 값 검색과 값 할당에 대응한다. get 및 set 접근을 통해 접근 가능한 프로퍼티에는, 객체의 직접적인 일부인 own properties와, 프로퍼티 상속 관계를 통해 다른 연관 객체가 제공하는 inherited properties가 모두 포함된다. 상속된 프로퍼티는 그 연관 객체의 own 프로퍼티일 수도 있고 상속된 프로퍼티일 수도 있다. 객체의 각 own 프로퍼티는 반드시 그 객체의 다른 own 프로퍼티의 키 값들과 구별되는 키 값을 가져야 한다.

모든 객체는 논리적으로 프로퍼티들의 집합이지만, 프로퍼티 접근과 조작의 의미론이 서로 다른 여러 형태의 객체가 존재한다. 여러 형태의 객체 정의는 6.1.7.2 를 보라.

또한 일부 객체는 호출 가능하다. 이들은 함수 또는 함수 객체라고 불리며 아래에서 더 설명된다. ECMAScript의 모든 함수는 Object 타입의 구성원이다.

6.1.7.1 프로퍼티 속성

속성은 이 명세에서 Table 3에 설명된 대로 Object 프로퍼티의 상태를 정의하고 설명하는 데 사용된다. 명시적으로 지정되지 않는 한, 각 속성의 초기 값은 그 Default Value이다.

Table 3: Attributes of an Object property
속성 이름 존재하는 프로퍼티 유형 값의 영역 기본값 설명
[[Value]] 데이터 프로퍼티 ECMAScript 언어 값 undefined 프로퍼티에 대한 get 접근 시 검색되는 값.
[[Writable]] 데이터 프로퍼티 Boolean false false이면, ECMAScript 코드가 [[Set]]을 사용하여 해당 프로퍼티의 [[Value]] 속성을 변경하려는 시도는 성공하지 못한다.
[[Get]] 접근자 프로퍼티 Object 또는 undefined undefined 값이 Object인 경우 반드시 함수 객체여야 한다. 그 함수의 [[Call]] 내부 메서드(Table 5)는 프로퍼티에 대한 get 접근이 수행될 때마다 빈 인수 목록으로 호출되어 프로퍼티 값을 검색한다.
[[Set]] 접근자 프로퍼티 Object 또는 undefined undefined 값이 Object인 경우 반드시 함수 객체여야 한다. 그 함수의 [[Call]] 내부 메서드(Table 5)는 프로퍼티에 대한 set 접근이 수행될 때마다 할당된 값을 유일한 인수로 포함하는 인수 목록과 함께 호출된다. 프로퍼티의 [[Set]] 내부 메서드의 효과는 이후 그 프로퍼티의 [[Get]] 내부 메서드 호출이 반환하는 값에 영향을 줄 수도 있지만, 반드시 그래야 하는 것은 아니다.
[[Enumerable]] 데이터 프로퍼티 또는 접근자 프로퍼티 Boolean false true이면, 이 프로퍼티는 for-in 열거에 의해 열거된다 (참조 14.7.5). 그렇지 않으면, 이 프로퍼티는 열거 불가능하다고 한다.
[[Configurable]] 데이터 프로퍼티 또는 접근자 프로퍼티 Boolean false false이면, 해당 프로퍼티를 삭제하거나, 데이터 프로퍼티에서 접근자 프로퍼티로 또는 접근자 프로퍼티에서 데이터 프로퍼티로 바꾸거나, 그 속성들에 어떤 변경이든 가하려는 시도는(기존 [[Value]]를 교체하거나 [[Writable]]false로 설정하는 경우를 제외하고) 실패한다.

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

ECMAScript에서 객체의 실제 의미론은 internal methods라고 불리는 알고리즘을 통해 명세된다. ECMAScript 엔진의 각 객체는 그 객체의 런타임 동작을 정의하는 내부 메서드 집합과 연관된다. 이러한 내부 메서드는 ECMAScript 언어의 일부가 아니다. 이들은 순전히 설명 목적을 위해 이 명세에서 정의된다. 그러나 ECMAScript 구현 내의 각 객체는 자신과 연관된 내부 메서드가 명세한 대로 동작해야 한다. 이를 정확히 어떤 방식으로 달성하는지는 구현이 결정한다.

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

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

모든 객체는 [[PrivateElements]]라는 이름의 내부 슬롯을 가지며, 이는 PrivateElementsList이다. 이 List는 그 객체의 private field, method, accessor의 값을 나타낸다. 초기에는 빈 List이다.

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

Table 4는 ECMAScript 코드에 의해 생성되거나 조작되는 모든 객체에 적용되는, 이 명세에서 사용하는 essential internal methods를 요약한다. 모든 객체는 모든 essential internal method에 대한 알고리즘을 가져야 한다. 그러나 모든 객체가 반드시 그 메서드들에 대해 동일한 알고리즘을 사용하는 것은 아니다.

ordinary object는 다음 기준을 모두 만족하는 객체이다.

  • Table 4에 나열된 내부 메서드에 대해, 그 객체는 10.1 에 정의된 것을 사용한다.
  • 객체가 [[Call]] 내부 메서드를 가진다면, 10.2.1 에 정의된 것이나 10.3.1 에 정의된 것 중 하나를 사용한다.
  • 객체가 [[Construct]] 내부 메서드를 가진다면, 10.2.2 에 정의된 것이나 10.3.2 에 정의된 것 중 하나를 사용한다.

exotic objectordinary object가 아닌 객체이다.

이 명세는 객체들의 내부 메서드를 기준으로 서로 다른 종류의 exotic object를 인식한다. 특정 종류의 exotic object(예: Array exotic object 또는 bound function exotic object)와 동작적으로 동등하더라도, 그 종류에 대해 명세된 동일한 내부 메서드 집합을 가지고 있지 않다면, 그 객체는 해당 종류의 exotic object로 인식되지 않는다.

Table 4 및 다른 유사 표의 “Signature” 열은 각 내부 메서드의 호출 패턴을 설명한다. 호출 패턴은 항상 설명적인 매개변수 이름의 괄호 친 목록을 포함한다. 매개변수 이름이 ECMAScript 타입 이름과 같다면, 그 이름은 매개변수 값의 요구 타입을 설명한다. 내부 메서드가 명시적으로 값을 반환하는 경우, 그 매개변수 목록 뒤에는 기호 “→”와 반환 값의 타입 이름이 따른다. 시그니처에 사용되는 타입 이름은 절 6에서 정의된 타입을 가리키며, 여기에 다음 추가 이름들이 더해진다. “any”는 값이 어떤 ECMAScript 언어 타입이라도 될 수 있음을 의미한다.

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

내부 메서드는 암묵적으로 Completion Record를 반환하며, 이는 호출 패턴에 표시된 반환 타입의 값을 감싼 정상 완료이거나 throw 완료이다.

Table 4: Essential Internal Methods
내부 메서드 시그니처 설명
[[GetPrototypeOf]] ( ) Object | Null 이 객체에 상속된 프로퍼티를 제공하는 객체를 결정한다. null 값은 상속된 프로퍼티가 없음을 나타낸다.
[[SetPrototypeOf]] (Object | Null) Boolean 이 객체를 상속된 프로퍼티를 제공하는 다른 객체와 연관시킨다. null을 전달하는 것은 상속된 프로퍼티가 없음을 나타낸다. 연산이 성공적으로 완료되었음을 나타내는 true 또는 성공하지 못했음을 나타내는 false를 반환한다.
[[IsExtensible]] ( ) Boolean 이 객체에 추가 프로퍼티를 더하는 것이 허용되는지를 결정한다.
[[PreventExtensions]] ( ) Boolean 이 객체에 새로운 프로퍼티를 추가할 수 있는지를 제어한다. 연산이 성공하면 true, 실패하면 false를 반환한다.
[[GetOwnProperty]] (propertyKey) Undefined | Property Descriptor 키가 propertyKey인 이 객체의 own 프로퍼티에 대한 Property Descriptor를 반환하거나, 그러한 프로퍼티가 없으면 undefined를 반환한다.
[[DefineOwnProperty]] (propertyKey, propertyDescriptor) Boolean 키가 propertyKey인 own 프로퍼티를 생성하거나 변경하여 propertyDescriptor가 설명하는 상태를 가지게 한다. 그 프로퍼티가 성공적으로 생성/갱신되면 true를 반환하고, 생성 또는 갱신할 수 없으면 false를 반환한다.
[[HasProperty]] (propertyKey) Boolean 이 객체가 이미 키가 propertyKey인 own 또는 상속 프로퍼티를 가지고 있는지를 나타내는 Boolean 값을 반환한다.
[[Get]] (propertyKey, receiver) any 키가 propertyKey인 프로퍼티의 값을 이 객체로부터 반환한다. 프로퍼티 값을 검색하기 위해 ECMAScript 코드를 실행해야 한다면, receiver는 그 코드를 평가할 때 this 값으로 사용된다.
[[Set]] (propertyKey, value, receiver) Boolean 키가 propertyKey인 프로퍼티의 값을 value로 설정한다. 프로퍼티 값을 설정하기 위해 ECMAScript 코드를 실행해야 한다면, receiver는 그 코드를 평가할 때 this 값으로 사용된다. 프로퍼티 값이 설정되면 true, 설정할 수 없으면 false를 반환한다.
[[Delete]] (propertyKey) Boolean 키가 propertyKey인 own 프로퍼티를 이 객체에서 제거한다. 프로퍼티가 삭제되지 않았고 여전히 존재하면 false를 반환한다. 프로퍼티가 삭제되었거나 존재하지 않으면 true를 반환한다.
[[OwnPropertyKeys]] ( ) List of property keys 객체의 모든 own 프로퍼티 키를 요소로 가지는 List를 반환한다.

Table 5 는 함수처럼 호출될 수 있는 객체가 지원하는 추가적인 essential internal methods를 요약한다. function object[[Call]] 내부 메서드를 지원하는 객체이다. constructor[[Construct]] 내부 메서드를 지원하는 객체이다. [[Construct]]를 지원하는 모든 객체는 [[Call]]도 지원해야 한다. 즉, 모든 constructorfunction object여야 한다. 따라서 constructorconstructor function 또는 constructor function object라고도 불릴 수 있다.

Table 5: Additional Essential Internal Methods of Function Objects
내부 메서드 시그니처 설명
[[Call]] (any, a List of any) any 이 객체와 연관된 코드를 실행한다. 함수 호출 표현식을 통해 호출된다. 내부 메서드의 인수는 this 값과, 호출 표현식에 의해 함수에 전달된 인수들을 요소로 가지는 List이다. 이 내부 메서드를 구현하는 객체는 callable하다.
[[Construct]] (a List of any, Object) Object 객체를 생성한다. new 연산자나 super 호출을 통해 호출된다. 내부 메서드의 첫 번째 인수는 constructor 호출 또는 super 호출의 인수들을 요소로 가지는 List이다. 두 번째 인수는 new 연산자가 처음 적용된 객체이다. 이 내부 메서드를 구현하는 객체를 constructors라고 부른다. function object가 반드시 constructor인 것은 아니며, 그런 non-constructor function object[[Construct]] 내부 메서드를 가지지 않는다.

ordinary object 및 표준 exotic object의 essential internal methods의 의미론은 절 10 에 명세되어 있다. exotic object의 내부 메서드에 대한 어떤 명세된 사용이 구현에서 지원되지 않는다면, 그러한 사용이 시도될 때 반드시 TypeError 예외를 던져야 한다.

6.1.7.3 Essential Internal Methods의 불변식

ECMAScript 엔진의 객체 내부 메서드는 아래에 명세된 불변식 목록을 준수해야 한다. ordinary ECMAScript 객체와 이 명세의 모든 표준 exotic object는 이러한 불변식을 유지한다. ECMAScript Proxy 객체는 [[ProxyHandler]] 객체에서 호출된 trap 결과에 대한 런타임 검사를 통해 이러한 불변식을 유지한다.

구현이 제공하는 모든 exotic object 또한 그 객체들에 대해 이러한 불변식을 유지해야 한다. 이러한 불변식의 위반은 ECMAScript 코드가 예측할 수 없는 동작을 하게 하거나 보안 문제를 만들 수 있다. 그러나 이러한 불변식의 위반이 구현의 메모리 안전성을 훼손해서는 결코 안 된다.

구현은 essential internal methods의 기능을 구현하면서 그 불변식을 강제하지 않는 대체 인터페이스를 제공하는 방식 등을 포함하여, 어떤 방법으로든 이러한 불변식이 우회되도록 허용해서는 안 된다.

정의:

  • 내부 메서드의 target은 그 내부 메서드가 호출되는 객체이다.
  • target이 자신의 [[IsExtensible]] 내부 메서드에서 false를 반환하거나, 자신의 [[PreventExtensions]] 내부 메서드에서 true를 반환하는 것이 관찰되었다면, 그 target은 non-extensible이다.
  • non-existent 프로퍼티는 non-extensible target 위에 own 프로퍼티로 존재하지 않는 프로퍼티이다.
  • SameValue에 대한 모든 참조는 SameValue 알고리즘의 정의에 따른다.

반환 값:

어떤 내부 메서드가 반환하는 값은 반드시 다음 중 하나를 가지는 Completion Record여야 한다.

  • [[Type]] = normal, [[Target]] = empty, 그리고 [[Value]] = 아래에 그 내부 메서드의 "normal return type"으로 제시된 타입의 값, 또는
  • [[Type]] = throw, [[Target]] = empty, 그리고 [[Value]] = 임의의 ECMAScript 언어 값.
Note 1

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

[[GetPrototypeOf]] ( )

  • 정상 반환 타입은 Object 또는 Null이다.
  • target이 non-extensible이고 [[GetPrototypeOf]]가 값 proto를 반환했다면, 이후의 모든 [[GetPrototypeOf]] 호출은 protoSameValue인 값을 반환해야 한다.
Note 2

객체의 프로토타입 체인은 유한 길이를 가져야 한다 (즉, 어떤 객체에서 시작해 [[GetPrototypeOf]] 내부 메서드를 그 결과에 재귀적으로 적용하면 결국 null 값에 도달해야 한다). 그러나 이 요구는 프로토타입 체인에 [[GetPrototypeOf]]에 대해 ordinary object 정의를 사용하지 않는 exotic object가 포함되는 경우 객체 수준 불변식으로는 강제할 수 없다. 그러한 순환 프로토타입 체인은 객체 프로퍼티 접근 시 무한 루프를 초래할 수 있다.

[[SetPrototypeOf]] ( proto )

  • 정상 반환 타입은 Boolean이다.
  • target이 non-extensible이면, proto가 target의 관찰된 [[GetPrototypeOf]] 값과 SameValue인 경우를 제외하고 [[SetPrototypeOf]]는 반드시 false를 반환해야 한다.

[[IsExtensible]] ( )

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

[[PreventExtensions]] ( )

  • 정상 반환 타입은 Boolean이다.
  • [[PreventExtensions]]true를 반환하면, 이후 target에 대한 모든 [[IsExtensible]] 호출은 반드시 false를 반환해야 하며, target은 이제 non-extensible로 간주된다.

[[GetOwnProperty]] ( propertyKey )

  • 정상 반환 타입은 Property Descriptor 또는 Undefined이다.
  • 반환 값이 Property Descriptor이면, 그것은 완전히 채워진 Property Descriptor여야 한다.
  • propertyKey가 non-configurable이고 non-writable인 own 데이터 프로퍼티로 기술되었다면, 이후의 모든 [[GetOwnProperty]] ( propertyKey ) 호출은 [[Value]]propertyKey[[Value]] 속성과 SameValueProperty Descriptor를 반환해야 한다.
  • propertyKey[[Writable]][[Value]] 이외의 속성이 시간에 따라 변할 수 있거나, 프로퍼티가 삭제될 수 있다면, propertyKey[[Configurable]] 속성은 반드시 true여야 한다.
  • [[Writable]] 속성이 false에서 true로 바뀔 수 있다면, [[Configurable]] 속성은 반드시 true여야 한다.
  • target이 non-extensible이고 propertyKey가 non-existent이면, 이후 target에 대한 모든 [[GetOwnProperty]] (propertyKey) 호출은 propertyKey를 non-existent로 기술해야 한다 (즉, [[GetOwnProperty]] (propertyKey)는 반드시 undefined를 반환해야 한다).
Note 3

세 번째 불변식의 결과로, 어떤 프로퍼티가 데이터 프로퍼티로 기술되었고 시간이 지나며 다른 값을 반환할 수 있다면, 값을 바꾸는 메커니즘이 다른 essential internal methods를 통해 노출되지 않더라도 [[Writable]][[Configurable]] 속성 중 하나 또는 둘 다 반드시 true여야 한다.

[[DefineOwnProperty]] ( propertyKey, desc )

  • 정상 반환 타입은 Boolean이다.
  • [[DefineOwnProperty]]propertyKey가 이전에 target의 non-configurable own 프로퍼티로 관찰된 적이 있다면 반드시 false를 반환해야 한다. 단, 다음 경우는 예외이다.
    1. propertyKey가 writable 데이터 프로퍼티인 경우. non-configurable writable 데이터 프로퍼티는 non-configurable non-writable 데이터 프로퍼티로 변경될 수 있다.
    2. desc의 모든 속성이 propertyKey의 속성과 SameValue인 경우.
  • target이 non-extensible이고 propertyKey가 non-existent own 프로퍼티이면, [[DefineOwnProperty]] (propertyKey, desc)는 반드시 false를 반환해야 한다. 즉, non-extensible target 객체는 새로운 프로퍼티로 확장될 수 없다.

[[HasProperty]] ( propertyKey )

  • 정상 반환 타입은 Boolean이다.
  • propertyKey가 이전에 target의 non-configurable own 데이터 또는 접근자 프로퍼티로 관찰된 적이 있다면, [[HasProperty]]는 반드시 true를 반환해야 한다.

[[Get]] ( propertyKey, receiver )

  • 정상 반환 타입은 임의의 ECMAScript 언어 타입이다.
  • propertyKey가 이전에 값이 value인 target의 non-configurable, non-writable own 데이터 프로퍼티로 관찰된 적이 있다면, [[Get]]은 반드시 valueSameValue인 값을 반환해야 한다.
  • propertyKey가 이전에 [[Get]] 속성이 undefined인 target의 non-configurable own 접근자 프로퍼티로 관찰된 적이 있다면, [[Get]] 연산은 반드시 undefined를 반환해야 한다.

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

  • 정상 반환 타입은 Boolean이다.
  • propertyKey가 이전에 target의 non-configurable, non-writable own 데이터 프로퍼티로 관찰된 적이 있다면, [[Set]]valuepropertyKey[[Value]] 속성과 SameValue인 경우를 제외하고 반드시 false를 반환해야 한다.
  • propertyKey가 이전에 [[Set]] 속성이 undefined인 target의 non-configurable own 접근자 프로퍼티로 관찰된 적이 있다면, [[Set]] 연산은 반드시 false를 반환해야 한다.

[[Delete]] ( propertyKey )

  • 정상 반환 타입은 Boolean이다.
  • propertyKey가 이전에 target의 non-configurable own 데이터 또는 접근자 프로퍼티로 관찰된 적이 있다면, [[Delete]]는 반드시 false를 반환해야 한다.

[[OwnPropertyKeys]] ( )

  • 정상 반환 타입은 List이다.
  • 반환된 List는 중복 항목을 포함해서는 안 된다.
  • 반환된 List의 각 요소는 반드시 property key여야 한다.
  • 반환된 List는 이전에 관찰된 모든 non-configurable own 프로퍼티의 키를 적어도 포함해야 한다.
  • target이 non-extensible이면, 반환된 List[[GetOwnProperty]]를 사용해 관찰 가능한 target의 모든 own 프로퍼티의 키만 포함해야 한다.

[[Call]] ( )

[[Construct]] ( )

  • 정상 반환 타입은 Object이다.
  • target은 또한 [[Call]] 내부 메서드도 가져야 한다.

6.1.7.4 Well-Known Intrinsic Objects

well-known intrinsic은 이 명세의 알고리즘에서 명시적으로 참조되며, 보통 realm별 identity를 가지는 내장 객체들이다. 달리 명시되지 않는 한, 각 intrinsic object는 실제로 realm마다 하나씩 존재하는 유사 객체들의 집합에 대응한다.

이 명세에서 %name%과 같은 참조는 현재 realm과 연관된, 그 이름에 대응하는 intrinsic object를 의미한다. %name.a.b%와 같은 참조는, 마치 intrinsic object %name%의 "a" 프로퍼티 값의 "b" 프로퍼티가 어떤 ECMAScript 코드도 평가되기 전에 접근된 것처럼 의미한다. 현재 realm과 그 intrinsic의 결정은 9.4에 설명되어 있다. well-known intrinsic은 Table 6에 나열되어 있다.

Table 6: Well-Known Intrinsic Objects
Intrinsic 이름 전역 이름 ECMAScript 언어 연관
%AggregateError% AggregateError AggregateError 생성자 (20.5.7.1)
%Array% Array Array 생성자 (23.1.1)
%ArrayBuffer% ArrayBuffer ArrayBuffer 생성자 (25.1.4)
%ArrayIteratorPrototype% Array Iterator 객체들의 prototype (23.1.5)
%AsyncFromSyncIteratorPrototype% Async-from-Sync Iterator 객체들의 prototype (27.1.5)
%AsyncFunction% async function 객체들의 생성자 (27.7.1)
%AsyncGeneratorFunction% async generator function 객체들의 생성자 (27.4.1)
%AsyncGeneratorPrototype% async generator 객체들의 prototype (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 객체들의 prototype (14.7.5.10)
%Function% Function Function 생성자 (20.2.1)
%GeneratorFunction% generator function 객체들의 생성자 (27.3.1)
%GeneratorPrototype% generator 객체들의 prototype (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 객체들의 prototype (27.1.2.1)
%JSON% JSON JSON 객체 (25.5)
%Map% Map Map 생성자 (24.1.1)
%MapIteratorPrototype% Map Iterator 객체들의 prototype (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 객체들의 prototype (22.2.9)
%Set% Set Set 생성자 (24.2.2)
%SetIteratorPrototype% Set Iterator 객체들의 prototype (24.2.6)
%SharedArrayBuffer% SharedArrayBuffer SharedArrayBuffer 생성자 (25.2.3)
%String% String String 생성자 (22.1.1)
%StringIteratorPrototype% String Iterator 객체들의 prototype (22.1.5)
%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이 반환하는 wrapped iterator 객체들의 prototype (27.1.3.2.2.1)
Note

Table 98 에 추가 항목이 있다.

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 서체를 사용한 upper kebab case로 표기된다. 예를 들어, Completion Record[[Type]] 필드는 normal, return, throw 같은 값을 가진다. Enum은 이름 외에 다른 특성을 가지지 않는다. enum의 이름은 다른 enum과 구별하기 위한 목적 외에는 아무 역할도 하지 않으며, 문맥 속 사용법이나 의미에 대해 아무것도 시사하지 않는다.

6.2.2 List와 Record 명세 타입

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

알고리즘이 List의 요소를 순서를 명시하지 않고 반복할 때, 사용되는 순서는 List 안의 요소 순서이다.

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

이 명세에서 "A, B, ...의 list-concatenation"이라는 구 (각 인수는 비어 있을 수도 있는 List이다)는 각 인수의 요소들을 (순서대로) 이어 붙인 요소들을 가지는 새로운 List 값을 뜻한다.

String들의 List에 적용될 때, " lexicographic code unit order에 따라 정렬됨 "이라는 구는, 더 짧은 문자열의 길이까지 각 코드 유닛의 숫자 값을 기준으로 정렬하고, 모두 같다면 짧은 문자열을 긴 문자열보다 앞에 두는 것을 의미하며, 이는 추상 연산 IsLessThan에 설명되어 있다.

Record 타입은 이 명세의 알고리즘 안에서 데이터 집합을 설명하는 데 사용된다. Record 타입 값은 하나 이상의 이름 붙은 필드로 이루어진다. 각 필드의 값은 ECMAScript 언어 값 또는 명세 값이다. 필드 이름은 항상 이중 대괄호로 둘러싸인다. 예를 들어 [[Value]] 와 같다.

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

명세 텍스트와 알고리즘에서는 점 표기법을 사용하여 Record 값의 특정 필드를 참조할 수 있다. 예를 들어, R이 앞 문단에 표시된 record라면 R.[[Field2]]는 “R의 [[Field2]]라는 이름의 필드”를 말하는 축약 표현이다.

자주 사용되는 Record 필드 조합의 스키마에는 이름이 붙을 수 있으며, 그 이름은 특정 종류의 집합을 식별하기 위해 리터럴 Record 값의 접두사로 사용될 수 있다. 예: PropertyDescriptor { [[Value]]: 42, [[Writable]]: false, [[Configurable]]: true }.

6.2.3 Set과 Relation 명세 타입

Set 타입은 메모리 모델에서 사용할 무순서 요소들의 집합을 설명하는 데 사용된다. 이것은 같은 이름의 ECMAScript 컬렉션 타입과는 구별된다. 혼동을 피하기 위해, ECMAScript 컬렉션의 인스턴스는 이 명세에서 일관되게 "Set objects"라고 부른다. Set 타입의 값은 어떤 요소도 두 번 이상 나타나지 않는 단순한 요소 집합이다. 요소는 Set에 추가되거나 제거될 수 있다. Set은 서로 합집합, 교집합, 차집합을 취할 수 있다.

Relation 타입은 Set에 대한 제약을 설명하는 데 사용된다. Relation 타입의 값은 자신의 값 영역으로부터의 값들의 순서쌍들의 Set이다. 예를 들어, Memory event 위의 Relation은 Memory event 순서쌍들의 집합이다. Relation RR의 값 영역 안의 두 값 a, b에 대해, a R b는 순서쌍 (a, b)가 R의 원소임을 말하는 축약 표현이다. 어떤 조건들에 대한 least Relation은 그 조건들을 만족하는 가장 작은 Relation이다.

strict partial order는 다음을 만족하는 Relation 값 R이다.

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

    • a R a인 경우는 아니고,
    • a R b이고 b R c이면, a R c이다.
Note 1

위 두 성질은 각각 irreflexivity와 transitivity라고 불린다.

strict total order는 다음을 만족하는 Relation 값 R이다.

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

    • a is b 또는 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 Fields
필드 이름 의미
[[Type]] normal, break, continue, return, 또는 throw 발생한 완료의 유형.
[[Value]] Completion Record가 아닌 모든 값 생성된 값.
[[Target]] String 또는 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 [[Value]] 필드에 그 타입의 값을 가진 normal completion을 가리킨다.

이 명세에 정의된 callable object는 normal completion 또는 throw completion만 반환한다. 다른 종류의 Completion Record를 반환하는 것은 편집상의 오류로 간주된다.

구현 정의 callable object는 normal completion 또는 throw completion 중 하나를 반환해야 한다.

6.2.4.1 NormalCompletion ( value )

The abstract operation NormalCompletion takes argument value (any value except a Completion Record) and returns a 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 (an ECMAScript language value) and returns a 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 (an ECMAScript language value) and returns a 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 (a Completion Record) and value (any value except a Completion Record) and returns a Completion Record. It performs the following steps when called:

  1. Assert: 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 Fields
필드 이름 의미
[[Base]] ECMAScript 언어 값, Environment Record, 또는 unresolvable 바인딩을 보유하는 값 또는 Environment Record. [[Base]]unresolvable이면 바인딩을 해석할 수 없었음을 나타낸다.
[[ReferencedName]] ECMAScript 언어 값 또는 Private Name 바인딩의 이름. [[Base]] 값이 Environment Record인 경우에는 항상 String이다. 그렇지 않으면, ToPropertyKey가 수행될 때까지는 String이나 Symbol이 아닌 ECMAScript 언어 값일 수도 있다.
[[Strict]] Boolean Reference Recordstrict mode 코드에서 유래했으면 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 ( referenceRecord )

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

  1. referenceRecord.[[Base]]unresolvable이면, false를 반환한다.
  2. referenceRecord.[[Base]]Environment Record이면, false를 반환한다.
  3. true를 반환한다.

6.2.5.2 IsUnresolvableReference ( referenceRecord )

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

  1. referenceRecord.[[Base]]unresolvable이면, true를 반환한다.
  2. false를 반환한다.

6.2.5.3 IsSuperReference ( referenceRecord )

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

  1. referenceRecord.[[ThisValue]]empty이면, false를 반환한다.
  2. true를 반환한다.

6.2.5.4 IsPrivateReference ( referenceRecord )

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

  1. referenceRecord.[[ReferencedName]]Private Name이면, true를 반환한다.
  2. false를 반환한다.

6.2.5.5 GetValue ( referenceRecord )

The abstract operation GetValue takes argument referenceRecord (a Reference Record or an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:

  1. referenceRecordReference Record가 아니면, referenceRecord를 반환한다.
  2. IsUnresolvableReference(referenceRecord)가 true이면, ReferenceError 예외를 던진다.
  3. IsPropertyReference(referenceRecord)가 true이면,
    1. baseObj를 ? ToObject(referenceRecord.[[Base]])라고 하자.
    2. IsPrivateReference(referenceRecord)가 true이면,
      1. PrivateGet(baseObj, referenceRecord.[[ReferencedName]])를 반환한다.
    3. referenceRecord.[[ReferencedName]]가 property key가 아니면,
      1. referenceRecord.[[ReferencedName]]를 ? ToPropertyKey(referenceRecord.[[ReferencedName]])로 설정한다.
    4. baseObj.[[Get]](referenceRecord.[[ReferencedName]], GetThisValue(referenceRecord))를 반환한다.
  4. basereferenceRecord.[[Base]]라고 하자.
  5. Assert: baseEnvironment Record이다.
  6. base.GetBindingValue(referenceRecord.[[ReferencedName]], referenceRecord.[[Strict]])를 반환한다 (참조 9.1).
Note

단계 3.a에서 생성될 수도 있는 객체는 위 추상 연산ordinary object [[Get]] 내부 메서드 밖에서는 접근할 수 없다. 구현은 그 객체를 실제로 생성하지 않기로 선택할 수도 있다.

6.2.5.6 PutValue ( referenceRecord, value )

The abstract operation PutValue takes arguments referenceRecord (a Reference Record or an ECMAScript language value) and value (an ECMAScript language value) and returns either a normal completion containing unused or an abrupt completion. It performs the following steps when called:

  1. referenceRecordReference Record가 아니면, ReferenceError 예외를 던진다.
  2. IsUnresolvableReference(referenceRecord)가 true이면,
    1. referenceRecord.[[Strict]]true이면, ReferenceError 예외를 던진다.
    2. globalObjGetGlobalObject()라고 하자.
    3. Set(globalObj, referenceRecord.[[ReferencedName]], value, false)를 수행한다.
    4. unused를 반환한다.
  3. IsPropertyReference(referenceRecord)가 true이면,
    1. baseObj를 ? ToObject(referenceRecord.[[Base]])라고 하자.
    2. IsPrivateReference(referenceRecord)가 true이면,
      1. PrivateSet(baseObj, referenceRecord.[[ReferencedName]], value)를 반환한다.
    3. referenceRecord.[[ReferencedName]]가 property key가 아니면,
      1. referenceRecord.[[ReferencedName]]를 ? ToPropertyKey(referenceRecord.[[ReferencedName]])로 설정한다.
    4. succeeded를 ? baseObj.[[Set]](referenceRecord.[[ReferencedName]], value, GetThisValue(referenceRecord))라고 하자.
    5. succeededfalse이고 referenceRecord.[[Strict]]true이면, TypeError 예외를 던진다.
    6. unused를 반환한다.
  4. basereferenceRecord.[[Base]]라고 하자.
  5. Assert: baseEnvironment Record이다.
  6. base.SetMutableBinding(referenceRecord.[[ReferencedName]], value, referenceRecord.[[Strict]])를 반환한다 (참조 9.1).
Note

단계 3.a에서 생성될 수도 있는 객체는 위 추상 연산ordinary object [[Set]] 내부 메서드 밖에서는 접근할 수 없다. 구현은 그 객체를 실제로 생성하지 않기로 선택할 수도 있다.

6.2.5.7 GetThisValue ( referenceRecord )

The abstract operation GetThisValue takes argument referenceRecord (a Reference Record) and returns an ECMAScript language value. It performs the following steps when called:

  1. Assert: IsPropertyReference(referenceRecord)는 true이다.
  2. IsSuperReference(referenceRecord)가 true이면, referenceRecord.[[ThisValue]]를 반환한다.
  3. referenceRecord.[[Base]]를 반환한다.

6.2.5.8 InitializeReferencedBinding ( referenceRecord, value )

The abstract operation InitializeReferencedBinding takes arguments referenceRecord (a Reference Record) and value (an ECMAScript language value) and returns either a normal completion containing unused or an abrupt completion. It performs the following steps when called:

  1. Assert: IsUnresolvableReference(referenceRecord)는 false이다.
  2. basereferenceRecord.[[Base]]라고 하자.
  3. Assert: baseEnvironment Record이다.
  4. base.InitializeBinding(referenceRecord.[[ReferencedName]], value)를 반환한다.

6.2.5.9 MakePrivateReference ( baseValue, privateIdentifier )

The abstract operation MakePrivateReference takes arguments baseValue (an ECMAScript language value) and privateIdentifier (a String) and returns a Reference Record. It performs the following steps when called:

  1. privateEnv를 현재 실행 컨텍스트의 PrivateEnvironment라고 하자.
  2. Assert: 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 record의 리터럴 설명에 태그를 붙이는 데 사용되는 schema 이름은 “PropertyDescriptor”이다.

Property Descriptor 값은 특정 필드의 존재 또는 사용에 따라 데이터 Property Descriptor와 접근자 Property Descriptor로 더 분류될 수 있다. 데이터 Property Descriptor는 [[Value]] 또는 [[Writable]]라는 이름의 필드를 포함하는 것이다. 접근자 Property Descriptor는 [[Get]] 또는 [[Set]]라는 이름의 필드를 포함하는 것이다. 모든 Property Descriptor는 [[Enumerable]][[Configurable]]라는 이름의 필드를 가질 수 있다. Property Descriptor 값은 데이터 Property Descriptor이면서 동시에 접근자 Property Descriptor일 수는 없다. 그러나 둘 다 아닐 수는 있다 (이 경우 generic Property Descriptor이다). fully populated Property Descriptor는 접근자 Property Descriptor 또는 데이터 Property Descriptor 중 하나이며, 그에 대응하는 모든 필드가 Table 3에 정의되어 있는 것이다.

다음 추상 연산들은 이 명세에서 Property Descriptor 값에 대해 연산하는 데 사용된다.

6.2.6.1 IsAccessorDescriptor ( desc )

The abstract operation IsAccessorDescriptor takes argument desc (a Property Descriptor) and returns a 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 (a Property Descriptor) and returns a 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 (a Property Descriptor) and returns a Boolean. It performs the following steps when called:

  1. IsAccessorDescriptor(desc)가 true이면, false를 반환한다.
  2. IsDataDescriptor(desc)가 true이면, false를 반환한다.
  3. true를 반환한다.

6.2.6.4 FromPropertyDescriptor ( desc )

The abstract operation FromPropertyDescriptor takes argument desc (a Property Descriptor or undefined) and returns an Object or undefined. It performs the following steps when called:

  1. descundefined이면, undefined를 반환한다.
  2. objOrdinaryObjectCreate(%Object.prototype%)라고 하자.
  3. Assert: obj는 own 프로퍼티가 없는 확장 가능한 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 (an ECMAScript language value) and returns either a normal completion containing a Property Descriptor or a throw completion. It performs the following steps when called:

  1. obj가 Object가 아니면, TypeError 예외를 던진다.
  2. 처음에는 아무 필드도 없는 새로운 Property Descriptordesc라고 하자.
  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 예외를 던진다.
    3. desc.[[Get]]getter로 설정한다.
  13. hasSet을 ? HasProperty(obj, "set")라고 하자.
  14. hasSettrue이면,
    1. setter를 ? Get(obj, "set")라고 하자.
    2. IsCallable(setter)가 false이고 setterundefined가 아니면, TypeError 예외를 던진다.
    3. desc.[[Set]]setter로 설정한다.
  15. desc[[Get]] 필드 또는 [[Set]] 필드를 가지면,
    1. desc[[Value]] 필드 또는 [[Writable]] 필드를 가지면, TypeError 예외를 던진다.
  16. desc를 반환한다.

6.2.6.6 CompletePropertyDescriptor ( desc )

The abstract operation CompletePropertyDescriptor takes argument desc (a 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"라는 동사 뒤에 alias 목록을 사용하여 값을 포착한다. Abstract Closure가 생성될 때, 각 alias와 연관된 값을 그 시점에 포착한다. Abstract Closure가 호출될 때 수행할 알고리즘을 명시하는 단계에서는, 각 포착된 값이 그 값을 포착하는 데 사용된 alias로 참조된다.

Abstract Closure가 Completion Record를 반환한다면, 그 Completion Recordnormal completion 또는 throw completion 중 하나여야 한다.

Abstract Closure는 다른 알고리즘의 일부로 인라인으로 생성되며, 다음 예시에 나타나 있다.

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

6.2.9 Data Blocks

Data Block 명세 타입은 서로 구별되며 가변적인 바이트 크기(8비트) 숫자 값들의 시퀀스를 설명하는 데 사용된다. byte value는 0에서 255까지의 포함 구간에 있는 정수이다. Data Block 값은 고정된 개수의 바이트로 생성되며, 각 바이트의 초기 값은 0이다.

이 명세에서는 표기상 편의를 위해 배열과 유사한 문법을 사용하여 Data Block 값의 개별 바이트에 접근할 수 있다. 이 표기법은 Data Block 값을 0부터 시작하는 integer-indexed 바이트 시퀀스로 나타낸다. 예를 들어, db가 5바이트 Data Block 값이라면 db[2]를 사용하여 세 번째 바이트에 접근할 수 있다.

여러 agent가 동시에 참조할 수 있는 메모리에 존재하는 data block은 Shared Data Block으로 지정된다. Shared Data Block은 (Shared Data Block 값의 동등성 검사를 위한 목적상) address-free한 identity를 가진다. 즉, 이 identity는 어떤 프로세스에서 그 블록이 매핑되는 가상 주소에 묶이지 않고, 그 블록이 나타내는 메모리 위치들의 집합에 묶인다. 두 data block은 자신들이 포함하는 위치의 집합이 같을 때에만 같으며, 그렇지 않으면 같지 않고, 포함하는 위치 집합의 교집합은 공집합이다. 마지막으로, Shared Data Block은 Data Block과 구별될 수 있다.

Shared Data Block의 의미론은 메모리 모델에 의해 Shared Data Block event를 사용해 정의된다. 아래 추상 연산들은 Shared Data Block event를 도입하고, 평가 의미론과 메모리 모델의 event 의미론 사이의 인터페이스 역할을 한다. 이 event들은 candidate execution을 형성하며, 메모리 모델은 여기에 필터로 작용한다. 전체 의미론은 메모리 모델을 참조하라.

Shared Data Block event는 메모리 모델에 정의된 Record로 모델링된다.

다음 추상 연산들은 이 명세에서 Data Block 값에 대해 연산하는 데 사용된다.

6.2.9.1 CreateByteDataBlock ( size )

The abstract operation CreateByteDataBlock takes argument size (a non-negative integer) and returns either a normal completion containing a Data Block or a throw completion. It performs the following steps when called:

  1. size > 253 - 1이면, RangeError 예외를 던진다.
  2. size 바이트로 이루어진 새로운 Data Blockdb를 생성한다. 그런 Data Block을 생성할 수 없으면, RangeError 예외를 던진다.
  3. db의 모든 바이트를 0으로 설정한다.
  4. db를 반환한다.

6.2.9.2 CreateSharedByteDataBlock ( size )

The abstract operation CreateSharedByteDataBlock takes argument size (a non-negative integer) and returns either a normal completion containing a Shared Data Block or a throw completion. It performs the following steps when called:

  1. size 바이트로 이루어진 새로운 Shared Data Blockdb를 생성한다. 그런 Shared Data Block을 생성할 수 없으면, RangeError 예외를 던진다.
  2. agentRecord를 주변 agent의 Agent Record라고 하자.
  3. executionagentRecord.[[CandidateExecution]]라고 하자.
  4. eventsRecordexecution.[[EventsRecords]][[AgentSignifier]]AgentSignifier()인 Agent Events Record라고 하자.
  5. zero를 « 0 »이라고 하자.
  6. db의 각 인덱스 i에 대해, 다음을 수행한다.
    1. WriteSharedMemory { [[Order]]: init, [[NoTear]]: true, [[Block]]: db, [[ByteIndex]]: i, [[ElementSize]]: 1, [[Payload]]: zero }를 eventsRecord.[[EventList]]에 추가한다.
  7. db를 반환한다.

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

The abstract operation CopyDataBlockBytes takes arguments toBlock (a Data Block or a Shared Data Block), toIndex (a non-negative integer), fromBlock (a Data Block or a Shared Data Block), fromIndex (a non-negative integer), and count (a non-negative integer) and returns unused. It performs the following steps when called:

  1. Assert: fromBlocktoBlock은 서로 다른 값이다.
  2. fromSizefromBlock의 바이트 수라고 하자.
  3. Assert: fromIndex + countfromSize.
  4. toSizetoBlock의 바이트 수라고 하자.
  5. Assert: toIndex + counttoSize.
  6. count > 0인 동안, 다음을 반복한다.
    1. fromBlockShared Data Block이면,
      1. agentRecord를 주변 agent의 Agent Record라고 하자.
      2. executionagentRecord.[[CandidateExecution]]라고 하자.
      3. eventsRecordexecution.[[EventsRecords]][[AgentSignifier]]AgentSignifier()인 Agent Events Record라고 하자.
      4. bytes를 비결정적으로 선택된 byte value 하나만을 유일한 원소로 가지는 List라고 하자.
      5. NOTE: 구현에서 bytes는 하부 하드웨어의 비원자적 읽기 명령의 결과이다. 이 비결정성은 약한 일관성을 가진 하드웨어의 관찰 가능한 동작을 설명하기 위한 메모리 모델의 의미론적 처방이다.
      6. readEventReadSharedMemory { [[Order]]: unordered, [[NoTear]]: true, [[Block]]: fromBlock, [[ByteIndex]]: fromIndex, [[ElementSize]]: 1 }라고 하자.
      7. readEventeventsRecord.[[EventList]]에 추가한다.
      8. Chosen Value Record { [[Event]]: readEvent, [[ChosenValue]]: bytes }를 execution.[[ChosenValues]]에 추가한다.
      9. toBlockShared 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. Assert: 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 class field, method, accessor의 명세에 사용되는 Record이다. Property Descriptor는 private element에 사용되지 않지만, private field는 non-configurable, non-enumerable, writable 데이터 프로퍼티와 유사하게 동작하고, private method는 non-configurable, non-enumerable, non-writable 데이터 프로퍼티와 유사하게 동작하며, private accessor는 non-configurable, non-enumerable 접근자 프로퍼티와 유사하게 동작한다.

PrivateElement 타입의 값은 Table 9에 정의된 필드를 가지는 Record 값이다. 이러한 값은 PrivateElements라고 불린다.

Table 9: PrivateElement Fields
필드 이름 존재하는 [[Kind]] 필드 값 의미
[[Key]] 모두 Private Name field, method, 또는 accessor의 이름.
[[Kind]] 모두 field, method, 또는 accessor element의 종류.
[[Value]] fieldmethod ECMAScript 언어 값 field의 값.
[[Get]] accessor 함수 객체 또는 undefined private accessor의 getter.
[[Set]] accessor 함수 객체 또는 undefined private accessor의 setter.

6.2.11 ClassFieldDefinition Record 명세 타입

ClassFieldDefinition 타입은 class field의 명세에 사용되는 Record이다.

ClassFieldDefinition 타입의 값은 Table 10에 정의된 필드를 가지는 Record 값이다. 이러한 값은 ClassFieldDefinition Records 라고 불린다.

Table 10: ClassFieldDefinition Record Fields
필드 이름 의미
[[Name]] Private Name, String, 또는 Symbol field의 이름.
[[Initializer]] ECMAScript 함수 객체 또는 empty 존재하는 경우 field의 initializer.

6.2.12 Private Names

Private Name 명세 타입은 private class element(field, method, accessor)의 키를 나타내는, 전역적으로 고유한 값(다른 모든 Private Name과 구별되는 값으로, 다른 점에서 구별되지 않더라도 다름)을 설명하는 데 사용된다. 각 Private Name은 String인 불변의 [[Description]] 내부 슬롯을 가진다. Private Name은 PrivateFieldAdd 또는 PrivateMethodOrAccessorAdd를 사용하여 어떤 ECMAScript 객체에도 설치될 수 있고, 이후 PrivateGetPrivateSet을 사용하여 읽거나 쓸 수 있다.

6.2.13 ClassStaticBlockDefinition Record 명세 타입

ClassStaticBlockDefinition Record 는 class static initialization block의 실행 가능한 코드를 캡슐화하는 데 사용되는 Record 값이다.

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

Table 11: ClassStaticBlockDefinition Record Fields
필드 이름 의미
[[BodyFunction]] ECMAScript 함수 객체 class의 static initialization 동안 호출될 함수 객체.