이 Ecma 표준은 ECMAScript 2027 언어를 정의합니다.
이것은 ECMAScript 언어 명세의 열여덟 번째 판입니다.
ECMAScript는 여러 기원 기술을 바탕으로 하였으며,
가장 잘 알려진 것은 JavaScript(넷스케이프)와 JScript(마이크로소프트)
입니다. 이 언어는 Brendan Eich가 넷스케이프에서 만들었으며,
넷스케이프의 Navigator 2.0 브라우저에 처음 나타났습니다.
웹 브라우저에 포함된 언어로 가장 널리 알려져 있지만,
브라우저 이외 서버 및 내장 응용프로그램 분야에서도 많이 사용되어,
세계에서 가장 널리 쓰이는 범용 프로그래밍 언어 중 하나로 성장했습니다.
ECMAScript 언어 명세의 개발은 1996년 11월에 시작되었으며,
이 Ecma 표준의 첫 번째 판은 1997년 6월 Ecma 총회에서 채택되었습니다.
해당 Ecma 표준은 패스트 트랙 절차를 거쳐
ISO/IEC JTC 1에 제출되었고, 1998년 4월 국제 표준
ISO/IEC 16262로 승인되었습니다. 1998년 6월 Ecma 총회에서
두 번째 ECMA-262 판이 ISO/IEC 16262와 완전히 일치하도록 승인되었습니다.
1판과 2판 사이의 변화는 편집적 차이입니다.
세 번째 판은 강력한 정규 표현식, 더 좋은 문자열 처리, 새로운
제어문, try/catch 예외 처리, 엄격한 오류 정의, 숫자 출력 포맷,
미래 언어 확장을 위한 소규모 변경 사항을 도입했습니다.
ECMAScript 표준의 세 번째 판은 1999년 12월 Ecma 총회에서
채택되었으며, 2002년 6월 ISO/IEC 16262:2002로 발행되었습니다.
세 번째 판 이후 ECMAScript는 월드와이드웹과 결합해
모든 웹 브라우저가 지원하는 프로그래밍 언어가 되면서
엄청난 보급률을 달성했습니다. ECMAScript의 네 번째 판 개발
작업도 많았으나, 완성되지 않았고 정식 네 번째 판으로
출판되지 않았으며, 일부 내용이 여섯 번째 판에 반영되었습니다.
ECMAScript 다섯 번째 판(ECMA-262 5판으로 발행)은
브라우저 구현체 사이에서 널리 쓰이던 사실상 표준
언어 해석을 명문화하였고, 세 번째 판 발표 이후 등장한
신규 기능을 지원합니다. 여기에는 접근자 속성, 객체의 반영적 생성
및 검사, 속성의 제어, 추가 배열 조작 함수, JSON 객체 인코딩 지원,
더 강력한 오류 검사와 보안을 위한 엄격 모드가 포함됩니다.
다섯 번째 판은 2009년 12월 Ecma 총회에서 채택되었습니다.
다섯 번째 판은 패스트 트랙 절차로 ISO/IEC JTC 1에
제출되어 ISO/IEC 16262:2011로 승인되었습니다.
ECMAScript 5.1 판은 소소한 수정을 포함하며, ISO/IEC 16262:2011과
동일한 본문입니다. 5.1 판은 2011년 6월 Ecma 총회에서 채택되었습니다.
여섯 번째 판의 집중 개발은 2009년, 다섯 번째 판 발표
준비와 동시에 시작되었습니다. 그러나 그에 앞서 1999년
세 번째 판 공개 이후로 여러 실험과 언어 개선 설계가
지속적으로 이루어졌습니다. 실질적으로 여섯 번째 판 완성은
15년에 걸친 노력의 결실입니다. 본 판의 목표는 대규모
애플리케이션과 라이브러리 생성 지원, 그리고 다른 언어의
컴파일 타깃으로써 ECMAScript 사용을 개선하는 것이었습니다.
주요 확장은 모듈, 클래스 선언, 렉시컬 블록 스코프, 이터레이터와
제너레이터, 비동기 프로그래밍용 프로미스, 구조 분해 패턴,
꼬리 호출 최적화 등입니다. 내장 ECMAScript 라이브러리는
맵/셋/이진 수 배열 등 데이터 추상화, 문자열과 정규 표현식용
추가 유니코드 지원 등으로 확장되었습니다. 내장 객체는
서브클래싱을 통한 확장이 가능해졌습니다. 여섯 번째 판은
지속적, 점진적 언어와 라이브러리 확장 기반을 마련합니다.
여섯 번째 판은 2015년 6월 총회에서 채택되었습니다.
ECMAScript 2016은 Ecma TC39가 연간 릴리스와
오픈 개발 프로세스를 도입한 첫 ECMAScript 판입니다.
ECMAScript 2015 원본에서 일반 텍스트 문서를 만들어
GitHub에서만 개발이 진행되었습니다. 표준 개발 1년 동안
수백 건의 풀 리퀘스트와 이슈가 제출되었고 수천 건의 버그,
편집상의 수정 등 다양한 개선이 이루어졌습니다.
또한 Ecmarkup, Ecmarkdown, Grammarkdown 등 수많은
소프트웨어 도구도 개발 지원에 사용되었습니다.
ES2016에는 새 지수 연산자와 Array.prototype의
includes 메서드 지원이 포함됐습니다.
ECMAScript 2017은 Async 함수, Shared Memory,
Atomics와 더불어 여러 소규모 언어/라이브러리 개선,
버그 수정, 편집 갱신을 도입했습니다. Async 함수는
promise 반환 함수 구문을 제공해 비동기 프로그래밍 경험을 개선했고,
Shared Memory와 Atomics는 병렬 CPU 상에서도
확정적 실행 순서를 보장하는 원자적 연산을 통한 멀티 에이전트
프로그램 통신 방식을 도입했습니다. 또한
Object.values, Object.entries, Object.getOwnPropertyDescriptors
등 새 Object 정적 메서드를 포함시켰습니다.
ECMAScript 2018은 async 이터레이터 프로토콜 및
async 제너레이터를 통한 비동기 반복 지원을 도입했습니다.
또한 정규 표현식 dotAll 플래그, 명명된 캡처 그룹, 유니코드
속성 이스케이프, 후방 탐색 어설션 등 4가지 신규 기능과
객체 잔여/전개 속성도 추가했습니다.
ECMAScript 2019는 배열 평탄화를 위한 Array.prototype.flat 및
flatMap, Object.entries 반환값을 객체로 변환하는 Object.fromEntries,
널리 구현됐으나 비표준이었던 String.prototype.trimLeft와
trimRight의 더 나은 명칭인 trimStart, trimEnd를 도입했습니다.
또한 몇 가지 구문, 의미적 소규모 수정을 포함하고 있는데,
동적 catch 바인딩 매개변수, JSON 정합을 위한 문자열 리터럴의
U+2028/U+2029 허용 등이 있습니다. 또 Array.prototype.sort를
안정 정렬로 강제, JSON.stringify의 모든 입력에 대해 올바른
UTF-8 반환, Function.prototype.toString이 원본 소스 혹은
표준 자리 표시자를 반환하도록 명확화했습니다.
ECMAScript 2020, 11판은 문자열의 모든 일치 객체 이터레이터를
생성하는 matchAll 메서드, 동적 지정자로 모듈을 비동기 임포트하는
import(), 임의 정밀도 정수형인 BigInt, 단락없는 Promise.allSettled,
전역 this 접근용 globalThis, 모듈내 export * as ns from 'module' 구문,
for-in 열거 순서 표준화, 모듈 컨텍스트용 import.meta,
“nullish” 값 처리를 개선한 nullish 병합 및 옵셔널 체이닝 구문을 도입했습니다.
ECMAScript 2021, 12판은 문자열의 replaceAll, input 값이
만족되면 단락하는 Promise.any, 여러 오류를 한 번에 표현하는
AggregateError, 논리 대입 연산자(??=, &&=, ||=), 객체를 참조하나
가비지 컬렉션을 막지 않는 WeakRef, 대상 객체의 정리 작업 관리를 위한
FinalizationRegistry, 숫자 구분 기호(1_000), 그리고
구현 정의 정렬량을 줄인 배열 정렬을 도입했습니다.
ECMAScript 2022, 13판은 모듈 최상위 await,
클래스 내 공개/비공개 인스턴스 필드, 공개/비공개 정적 필드,
비공개 인스턴스 메서드와 접근자, 비공개 정적 메서드와 접근자,
정적 블록, 객체의 비공개 필드 존재 확인(#x in obj),
/d 플래그로 정규식 매칭 인덱스 제공, 에러의 cause 속성,
문자열/배열/TypedArray의 상대 인덱싱용 at 메서드,
Object.hasOwn을 도입했습니다.
ECMAScript 2023, 14판은 Array.prototype, TypedArray.prototype의
toSorted, toReversed, with, findLast, findLastIndex 및
Array.prototype.toSpliced를 추가하고, 파일 앞부분 #! 주석 지원,
약한 콜렉션에서 대부분의 Symbol을 키로 허용하도록 했습니다.
ECMAScript 2024, 15판은 ArrayBuffer와 SharedArrayBuffer의 리사이즈/전송 기능,
문자열 집합 작업을 위한 새로운 /v 정규식 플래그,
Promise 생성을 위한 편의 메서드 Promise.withResolvers, 데이터 집계용
Object.groupBy, Map.groupBy, 공유 메모리 변동 비동기 대기
Atomics.waitAsync, 문자열의 정상 유니코드 확인/보장용
String.prototype.isWellFormed, toWellFormed를 도입했습니다.
ECMAScript 2025, 16판은 이터레이터 연산용 새 글로벌 Iterator와
관련 메서드, Set 연산용 Set.prototype 메서드, JSON 모듈 임포트 지원,
가져온 모듈의 속성 선언, 정규식 안전 이스케이프용 RegExp.escape 메서드,
정규식 내 인라인 플래그 설정/해제, 항상 Promise로 결과를 보장하는
Promise.try, 새 TypedArray 종류인 Float16Array 및 관련
DataView.prototype.getFloat16, setFloat16, Math.f16round를 도입했습니다.
ECMAScript 2026, 17판은 다양한 크기의 숫자 합산
정밀 손실 최소화를 위한 Math.sumPrecise, 이터레이터 연결
Iterator.concat, 비동기 반복원/소스에서 배열을 만드는 Array.fromAsync,
오류 객체 식별용 Error.isError, Map.prototype, WeakMap.prototype의
조회 시 기본값 제공, Uint8Array의 16진수·base64 인코딩 변환,
JSON.parse reviver에서 소스 세그먼트 접근 가능, 원시값의
JSON.stringify 결과 조절용 JSON.rawJSON 등을 도입했습니다.
많은 조직을 대표하는 수십 명이 Ecma TC39 표준의 이 판과
이전 판 개발에 중요한 기여를 했습니다. 활발한 커뮤니티도
TC39 ECMAScript 활동을 뒷받침합니다. 이 커뮤니티는 여러 초안을
검토하고, 수천 건 버그를 보고하고, 구현 실험,
테스트스위트 기여, 전세계 개발자에게 ECMAScript 교육을 해왔습니다.
모든 기여자와 단체를 하나하나 밝히고 인정하는 것은 현실적으로 어렵습니다.
Allen Wirfs-Brock
ECMA-262, 프로젝트 에디터, 6판
Brian Terlson
ECMA-262, 프로젝트 에디터, 7판~10판
Jordan Harband
ECMA-262, 프로젝트 에디터, 10판~12판
Kevin Gibbons
ECMA-262, 프로젝트 에디터, 12판~17판
Shu-yu Guo
ECMA-262, 프로젝트 에디터, 12판~18판
Michael Ficarra
ECMA-262, 프로젝트 에디터, 12판~18판
Richard Gibson
ECMA-262, 프로젝트 에디터, 18판
Ron Buckton
ECMA-262, 프로젝트 에디터, 18판
Nicolò Ribaudo
ECMA-262, 프로젝트 에디터, 18판
Linus Groh
ECMA-262, 프로젝트 에디터, 18판
1 범위
이 표준은 ECMAScript 2027 범용 프로그래밍 언어를 정의한다.
2 적합성
ECMAScript의 적합한 구현은 이 명세서에 설명된 모든 타입, 값, 객체, 프로퍼티, 함수, 프로그램 구문 및 의미론을 제공하고 지원해야 한다.
ECMAScript의 적합한 구현은 최신 버전의 Unicode 표준 및 ISO/IEC 10646에 부합하도록 소스 텍스트 입력을 해석해야 한다.
서로 다른 인간 언어와 국가에서 사용되는 언어적·문화적 관례에 프로그램이 적응할 필요를 지원하는 애플리케이션 프로그래밍 인터페이스(API)를 제공하는 ECMAScript의 적합한 구현은, 이 명세서와 호환되는 최신판 ECMA-402에서 정의한 인터페이스를 구현해야 한다.
ECMAScript의 적합한 구현은 이 명세서에 설명된 것 외의 추가적인 타입, 값, 객체, 프로퍼티 및 함수를 제공할 수 있다. 특히 ECMAScript의 적합한 구현은 이 명세서에 설명된 객체에 대해, 이 명세서에 설명되지 않은 프로퍼티와 그 프로퍼티들의 값을 제공할 수 있다.
ECMAScript의 적합한 구현은 이 명세서에 설명되지 않은 프로그램 및 정규 표현식 구문을 지원할 수 있다. 특히 ECMAScript의 적합한 구현은 이 명세서의 하위 절 12.7.2에 언급된 임의의 “future reserved words”를 사용하는 프로그램 구문을 지원할 수 있다.
ECMAScript의 적합한 구현은 하위 절 17.1에 금지 확장(Forbidden Extension)으로 나열된 어떤 확장도 구현해서는 안 된다.
ECMAScript의 적합한 구현은 구현 정의, 구현 근사, 또는 호스트 정의가 아닌 어떤 기능도 재정의해서는 안 된다.
ECMAScript의 적합한 구현은, 달리 명시되지 않는 한, 규범적 선택사항(Normative Optional) 하위 절을 구현할지 여부를 선택할 수 있다. 웹 브라우저는 일반적으로 모든 규범적 선택사항 하위 절을 구현해야 한다. (부속서 B 참조.) 어떤 규범적 선택사항 동작이라도 구현된다면, 해당 규범적 선택사항 절에 포함된 모든 동작을 구현해야 한다. 규범적 선택사항 절은 아래와 같이 이 명세서에서 색상 상자 안의 "Normative Optional"이라는 단어로 표시된다.
Normative Optional
2.1 규범적 선택사항 절 제목 예시
절 내용 예시.
ECMAScript의 적합한 구현은, 동시에 규범적 선택사항으로 표시되지 않는 한, 레거시(Legacy) 하위 절을 구현해야 한다. 레거시 하위 절 내에 명세된 모든 언어 기능과 동작은 하나 이상의 바람직하지 않은 특성을 가진다. 그러나 기존 애플리케이션에서 이들이 계속 사용되고 있기 때문에 이 명세서에서 제거할 수 없다. 이러한 기능은 ECMAScript 핵심 언어의 일부로 간주되지 않는다. 프로그래머는 새로운 ECMAScript 코드를 작성할 때 이러한 기능과 동작을 사용하거나 그 존재를 가정해서는 안 된다.
Legacy
2.2 레거시 절 제목 예시
절 내용 예시.
Normative Optional, Legacy
2.3 레거시 규범적 선택사항 절 제목 예시
절 내용 예시.
3 규범적 참조
다음 참조 문서는 이 문서의 적용에 필수적이다. 날짜가 있는 참조의 경우 인용된 판만 적용된다. 날짜가 없는 참조의 경우 참조 문서의 최신판(모든 수정 사항 포함)이 적용된다.
ECMAScript는 호스트 환경 내에서 계산을 수행하고 계산 객체를 조작하기 위한 객체지향 프로그래밍 언어이다. 여기서 정의된 ECMAScript는 계산적으로 자급자족하도록 의도되지 않았다. 실제로 이 명세서에는 외부 데이터의 입력이나 계산 결과의 출력에 대한 규정이 없다. 대신 ECMAScript 프로그램의 계산 환경은 이 명세서에 설명된 객체와 기타 기능뿐 아니라, 특정 프로퍼티를 제공하여 접근될 수 있고 특정 함수를 제공하여 ECMAScript 프로그램으로부터 호출될 수 있음을 제외하면 그 설명과 동작이 이 명세서의 범위를 벗어나는, 환경 특화 객체도 제공할 것으로 예상된다.
ECMAScript는 원래 스크립트 언어로 사용되도록 설계되었으나, 현재는 범용 프로그래밍 언어로 널리 사용되고 있다. 스크립트 언어는 기존 시스템의 기능을 조작, 맞춤화, 자동화하는 데 사용되는 프로그래밍 언어이다. 이러한 시스템에서는 유용한 기능이 이미 사용자 인터페이스를 통해 제공되며, 스크립트 언어는 그러한 기능을 프로그램 제어에 노출하는 메커니즘이다. 이런 방식으로 기존 시스템은 객체와 기능으로 이루어진 호스트 환경을 제공하며, 이는 스크립트 언어의 능력을 완성한다. 스크립트 언어는 전문 프로그래머와 비전문 프로그래머 모두가 사용할 수 있도록 의도된다.
ECMAScript는 원래 웹 스크립트 언어로 설계되었으며, 브라우저에서 웹 페이지를 동적으로 만들고 웹 기반 클라이언트-서버 아키텍처의 일부로 서버 계산을 수행하는 메커니즘을 제공했다. 현재 ECMAScript는 다양한 호스트 환경에 핵심 스크립트 기능을 제공하는 데 사용된다. 따라서 핵심 언어는 특정 호스트 환경과 분리되어 이 문서에서 명세된다.
ECMAScript의 사용은 단순한 스크립팅을 넘어섰으며, 이제는 매우 다양한 환경과 규모에서 프로그래밍 작업의 전 범위에 사용된다. ECMAScript의 사용이 확장됨에 따라 그것이 제공하는 기능과 설비도 함께 확장되었다. 이제 ECMAScript는 완전한 기능을 갖춘 범용 프로그래밍 언어이다.
4.1 웹 스크립팅
웹 브라우저는 클라이언트 측 계산을 위한 ECMAScript 호스트 환경을 제공하며, 여기에는 예를 들어 창, 메뉴, 팝업, 대화 상자, 텍스트 영역, 앵커, 프레임, 기록, 쿠키 및 입출력을 나타내는 객체가 포함된다. 또한 호스트 환경은 포커스 변경, 페이지 및 이미지 로딩, 언로딩, 오류 및 중단, 선택, 폼 제출, 마우스 동작과 같은 이벤트에 스크립트 코드를 연결하는 수단을 제공한다. 스크립트 코드는 HTML 내부에 나타나며, 표시되는 페이지는 사용자 인터페이스 요소와 고정 및 계산된 텍스트와 이미지의 조합이다. 스크립트 코드는 사용자 상호작용에 반응하며, 메인 프로그램이 필요 없다.
웹 서버는 요청, 클라이언트, 파일을 나타내는 객체와 데이터를 잠그고 공유하는 메커니즘을 포함하는, 서버 측 계산을 위한 다른 호스트 환경을 제공한다. 브라우저 측 스크립팅과 서버 측 스크립팅을 함께 사용하면, 웹 기반 애플리케이션에 맞춤형 사용자 인터페이스를 제공하면서 계산을 클라이언트와 서버 사이에 분산할 수 있다.
ECMAScript를 지원하는 각 웹 브라우저와 서버는 자체 호스트 환경을 제공하여 ECMAScript 실행 환경을 완성한다.
4.2 호스트와 구현
ECMAScript를 호스트 환경에 통합하는 데 도움을 주기 위해, 이 명세서는 특정 기능(예: 추상 연산)의 정의를 전부 또는 일부에 대해 이 명세서 외부의 출처에 위임한다. 편집상, 이 명세서는 다음과 같은 종류의 위임을 구분한다.
구현은 부속서 D에 열거된 기능이나 구현 정의 또는 구현 근사로 표시된 기능을 추가로 정의하는 외부 출처이다. 비공식적으로는 특정 웹 브라우저와 같은 구체적 산출물을 구현이라고 부른다.
구현 정의(implementation-defined) 기능은 추가적인 한정 없이 그 정의를 외부 출처에 위임하는 기능이다. 이 명세서는 특정 동작에 대해 어떤 권고도 하지 않으며, 적합한 구현은 이 명세서가 제시한 제약 내에서 자유롭게 어떤 동작이든 선택할 수 있다.
구현 근사(implementation-approximated) 기능은 이상적인 동작을 권고하면서도 그 정의를 외부 출처에 위임하는 기능이다. 적합한 구현은 이 명세서가 제시한 제약 내에서 자유롭게 어떤 동작이든 선택할 수 있지만, 이상적인 동작에 근사하도록 노력하는 것이 권장된다. Math.exp와 같은 일부 수학 연산은 구현 근사이다.
호스트는 부속서 D에 나열된 기능을 추가로 정의하지만, 다른 구현 정의 또는 구현 근사 기능은 추가로 정의하지 않는 외부 출처이다. 비공식적으로는, 호스트는 부속서 D를 통해 이 명세서와 동일한 방식으로 인터페이스하는 모든 구현의 집합, 예를 들어 모든 웹 브라우저의 집합을 가리킨다. 호스트는 종종 WHATWG HTML(https://html.spec.whatwg.org/)과 같은 외부 명세이다. 다시 말해, 호스트 정의 기능은 종종 외부 명세에서 추가로 정의된다.
호스트 훅은 외부 출처에 의해 전부 또는 일부가 정의되는 추상 연산이다. 모든 호스트 훅은 부속서 D에 나열되어야 한다. 호스트 훅은 최소한 다음 요구 사항을 충족해야 한다.
반드시 정상 완료 또는 던지기 완료를 반환해야 한다.
호스트 정의(host-defined) 기능은 추가적인 한정 없이 그 정의를 외부 출처에 위임하며, 부속서 D에 나열된 기능이다. 호스트가 아닌 구현도 호스트 정의 기능에 대한 정의를 제공할 수 있다.
호스트 환경은 모든 호스트 정의 기능에 대한 특정한 정의 선택이다. 호스트 환경에는 전역 객체의 호스트 정의 프로퍼티로서 입력을 얻고 출력을 제공할 수 있게 하는 객체나 함수가 일반적으로 포함된다.
이 명세서는 항상 가장 구체적인 용어를 사용하는 편집 관례를 따른다. 예를 들어 어떤 기능이 호스트 정의라면, 그것을 구현 정의라고 불러서는 안 된다.
호스트와 구현은 모두 여기에서 정의된 언어 타입, 명세 타입, 추상 연산, 문법 생성 규칙, 내재 객체, 내재 심볼을 통해 이 명세서와 인터페이스할 수 있다.
4.3 ECMAScript 개요
다음은 ECMAScript에 대한 비공식 개요이며, 언어의 모든 부분이 설명되는 것은 아니다. 이 개요는 표준 본문 자체의 일부가 아니다.
ECMAScript는 객체 기반이다. 기본 언어 기능과 호스트 기능은 객체에 의해 제공되며, ECMAScript 프로그램은 서로 통신하는 객체들의 집합이다. ECMAScript에서 객체는 0개 이상의 프로퍼티의 집합이며, 각 프로퍼티는 그 프로퍼티가 어떻게 사용될 수 있는지를 결정하는 어트리뷰트를 가진다. 예를 들어 어떤 프로퍼티의 Writable 어트리뷰트가 false로 설정되면, 실행 중인 ECMAScript 코드가 그 프로퍼티에 다른 값을 할당하려는 시도는 실패한다. 프로퍼티는 다른 객체, 원시 값, 또는 함수를 담는 컨테이너이다. 원시 값은 다음 내장 타입 중 하나의 구성원이다: Undefined, Null, Boolean, Number, BigInt, String, 그리고 Symbol; 객체는 내장 타입 Object의 구성원이고, 함수는 호출 가능한 객체이다. 프로퍼티를 통해 객체와 연관된 함수는 메서드라고 불린다.
ECMAScript는 ECMAScript 엔티티의 정의를 완성하는 내장 객체의 집합을 정의한다. 이러한 내장 객체에는 전역 객체, Object, Function, Boolean, Symbol, 여러 Error 객체를 포함한 언어의 런타임 의미론에 기본적인 객체, Math, Number, Date를 포함한 숫자 값을 표현하고 조작하는 객체, 텍스트 처리 객체인 String과 RegExp, Array와 각 요소가 특정 숫자 데이터 표현을 갖는 아홉 가지 서로 다른 Typed Array를 포함한 값의 인덱스 컬렉션 객체, Map과 Set 객체를 포함한 키 기반 컬렉션, JSON 객체, ArrayBuffer, SharedArrayBuffer, DataView를 포함한 구조화된 데이터를 지원하는 객체, 제너레이터 함수와 Promise 객체를 포함한 제어 추상화를 지원하는 객체, 그리고 Proxy와 Reflect를 포함한 리플렉션 객체가 포함된다.
ECMAScript는 또한 내장 연산자의 집합도 정의한다. ECMAScript 연산자에는 다양한 단항 연산, 곱셈 연산자, 덧셈 연산자, 비트 시프트 연산자, 관계 연산자, 동등 연산자, 이항 비트 연산자, 이항 논리 연산자, 할당 연산자, 그리고 쉼표 연산자가 포함된다.
대규모 ECMAScript 프로그램은 프로그램을 여러 개의 문장 및 선언 시퀀스로 분할할 수 있게 하는 모듈에 의해 지원된다. 각 모듈은 다른 모듈이 제공해야 하는 자신이 사용하는 선언과, 다른 모듈이 사용할 수 있도록 제공되는 자신의 선언을 명시적으로 식별한다.
ECMAScript 문법은 의도적으로 Java 문법과 유사하다. ECMAScript 문법은 사용하기 쉬운 스크립트 언어 역할을 할 수 있도록 완화되어 있다. 예를 들어 변수는 그 타입을 선언할 필요가 없고, 타입은 프로퍼티와 연관되지 않으며, 정의된 함수는 그 선언이 해당 함수 호출보다 텍스트상 앞에 나타날 필요가 없다.
4.3.1 객체
ECMAScript는 클래스 정의를 위한 문법을 포함하지만, ECMAScript 객체는 C++, Smalltalk, Java와 같은 언어들처럼 본질적으로 클래스 기반이 아니다. 대신 객체는 리터럴 표기법이나, 객체를 생성한 다음 그 프로퍼티에 초기값을 할당하여 객체의 전체 또는 일부를 초기화하는 코드를 실행하는 생성자를 포함한 다양한 방식으로 생성될 수 있다. 각 생성자는 "prototype"이라는 이름의 프로퍼티를 가진 함수이며, 이는 프로토타입 기반 상속과 공유 프로퍼티를 구현하는 데 사용된다. 객체는 new 표현식에서 생성자를 사용하여 만들어진다. 예를 들어 new Date(2009, 11)은 새로운 Date 객체를 생성한다. new를 사용하지 않고 생성자를 호출하면, 그 결과는 생성자에 따라 달라진다. 예를 들어 Date()는 객체가 아니라 현재 날짜와 시간을 나타내는 문자열 표현을 생성한다.
생성자에 의해 생성된 모든 객체는 그 생성자의 "prototype" 프로퍼티 값에 대한 암묵적 참조(객체의 프로토타입이라 불린다)를 가진다. 또한 프로토타입은 자기 자신의 프로토타입에 대한 비-null 암묵적 참조를 가질 수 있고, 이런 식으로 계속 이어질 수 있다. 이를 프로토타입 체인이라고 한다. 객체의 어떤 프로퍼티를 참조할 때, 그 참조는 해당 이름의 프로퍼티를 포함하는 프로토타입 체인의 첫 번째 객체 안의 그 이름의 프로퍼티를 가리킨다. 다시 말해, 먼저 직접 언급된 객체를 검사하여 그런 프로퍼티가 있는지 본다. 그 객체가 그 이름의 프로퍼티를 가지고 있다면 참조는 그 프로퍼티를 가리킨다. 그 객체가 그 이름의 프로퍼티를 가지고 있지 않다면, 다음으로 그 객체의 프로토타입을 검사하며, 이런 방식으로 계속된다.
Figure 1: 객체/프로토타입 관계
클래스 기반 객체지향 언어에서는 일반적으로 상태는 인스턴스가 가지며, 메서드는 클래스가 가지며, 상속은 구조와 동작에 대해서만 이루어진다. ECMAScript에서는 상태와 메서드를 객체가 가지며, 구조, 동작, 상태가 모두 상속된다.
자신의 프로토타입이 가진 특정 프로퍼티를 직접 포함하지 않는 모든 객체는 그 프로퍼티와 그 값을 공유한다. 그림 1은 이를 보여 준다.
CF는 생성자(이자 객체)이 다. new 표현식을 사용하여 다섯 개의 객체가 생성되었다: cf1, cf2, cf3, cf4, 그리고 cf5. 이들 각각의 객체는 "q1" 및 "q2"라는 이름의 프로퍼티를 포함한다. 점선은 암묵적 프로토타입 관계를 나타낸다. 예를 들어 cf3의 프로토타입은 CFp이다. 생성자 CF는 자체적으로 "P1" 및 "P2"라는 이름의 두 프로퍼티를 가지며, 이들은 CFp, cf1, cf2, cf3, cf4, 또는 cf5에서는 보이지 않는다. CFp 안의 "CFP1"이라는 이름의 프로퍼티는 cf1, cf2, cf3, cf4, 그리고 cf5가 공유하며(CF는 제외), 마찬가지로 CFp의 암묵적 프로토타입 체인에서 "q1", "q2", 또는 "CFP1"이라는 이름이 아닌 모든 프로퍼티도 공유한다. CF와 CFp 사이에는 암묵적 프로토타입 연결이 없다는 점에 유의하라.
대부분의 클래스 기반 객체 언어와 달리, 프로퍼티는 값 할당을 통해 객체에 동적으로 추가될 수 있다. 즉, 생성자는 생성된 객체의 프로퍼티 전부 또는 일부에 이름을 붙이거나 값을 할당할 필요가 없다. 위 그림에서는 CFp의 프로퍼티에 새 값을 할당함으로써 cf1, cf2, cf3, cf4, 그리고 cf5를 위한 새로운 공유 프로퍼티를 추가할 수 있다.
ECMAScript 객체는 본질적으로 클래스 기반이 아니지만, 생성자 함수, 프로토타입 객체, 메서드의 공통 패턴에 기초한 클래스 유사 추상을 정의하는 것이 종종 편리하다. ECMAScript 내장 객체 자체도 그러한 클래스 유사 패턴을 따른다. ECMAScript 2015부터 ECMAScript 언어는 프로그래머가 내장 객체에서 사용되는 것과 동일한 클래스 유사 추상 패턴을 따르는 객체를 간결하게 정의할 수 있도록 하는 구문적 클래스 정의를 포함한다.
4.3.2 ECMAScript의 엄격 변형
ECMAScript 언어는 일부 사용자가 언어에서 사용 가능한 몇몇 기능의 사용을 제한하고 싶어 할 수 있다는 가능성을 인정한다. 그들은 보안상의 이유, 오류를 유발하기 쉽다고 여기는 기능을 피하기 위해, 더 강화된 오류 검사를 얻기 위해, 또는 그 밖에 스스로 선택한 다른 이유로 그렇게 할 수 있다. 이러한 가능성을 지원하기 위해 ECMAScript는 언어의 엄격 변형을 정의한다. 언어의 엄격 변형은 일반 ECMAScript 언어의 특정 구문 및 의미 기능 일부를 제외하고, 일부 기능의 상세 의미론을 수정한다. 또한 엄격 변형은 비엄격 형태의 언어에서는 오류로 명세되지 않은 상황에서 오류 예외를 던짐으로써 반드시 보고되어야 하는 추가 오류 조건을 명세한다.
ECMAScript의 엄격 변형은 일반적으로 언어의 엄격 모드라고 불린다. ECMAScript의 엄격 모드 선택과 엄격 모드 구문 및 의미론의 사용은 11.2.2에서 설명된 바와 같이 개별 ECMAScript 소스 텍스트 단위 수준에서 명시적으로 이루어진다. 엄격 모드는 구문적 소스 텍스트 단위 수준에서 선택되므로, 엄격 모드는 그러한 소스 텍스트 단위 내에서만 국소적 효과를 가지는 제한만 부과한다. 엄격 모드는 여러 소스 텍스트 단위에 걸쳐 일관되게 작동해야 하는 ECMAScript 의미론의 어떤 측면도 제한하거나 수정하지 않는다. 완전한 ECMAScript 프로그램은 엄격 모드와 비엄격 모드 ECMAScript 소스 텍스트 단위가 혼합되어 구성될 수 있다. 이 경우 엄격 모드는 실제로 엄격 모드 소스 텍스트 단위 안에 정의된 코드를 실행할 때에만 적용된다.
이 명세서에 부합하려면, ECMAScript 구현은 이 명세서가 정의한 완전한 비제한 ECMAScript 언어와 ECMAScript 언어의 엄격 변형을 모두 구현해야 한다. 또한 구현은 비제한 및 엄격 모드 소스 텍스트 단위를 하나의 복합 프로그램으로 결합하는 것을 지원해야 한다.
4.4 용어와 정의
이 문서의 목적상, 다음 용어와 정의를 적용한다.
4.4.1 implementation-approximated
구현 근사 기능은 외부 출처에 의해 전부 또는 일부가 정의되지만, 이 명세서에서 권장되는 이상적 동작을 가진다
객체는 프로퍼티들의 집합이며 단 하나의 프로토타입 객체를 가진다. 프로토타입은 null일 수 있다.
4.4.7 constructor
객체를 생성하고 초기화하는 함수 객체
Note
생성자의 "prototype" 프로퍼티 값은 상속 및 공유 프로퍼티를 구현하는 데 사용되는 프로토타입 객체이다.
4.4.8 prototype
다른 객체에 공유 프로퍼티를 제공하는 객체
Note
생성자가 객체를 생성할 때, 그 객체는 프로퍼티 참조를 해석하기 위해 생성자의 "prototype" 프로퍼티를 암묵적으로 참조한다. 생성자의 "prototype" 프로퍼티는 프로그램 표현식 constructor.prototype으로 참조할 수 있으며, 객체의 프로토타입에 추가된 프로퍼티는 상속을 통해 그 프로토타입을 공유하는 모든 객체에 공유된다. 또는 Object.create 내장 함수를 사용하여 명시적으로 지정된 프로토타입을 가진 새 객체를 생성할 수도 있다.
4.4.9 ordinary object
모든 객체가 지원해야 하는 필수 내부 메서드에 대해 기본 동작을 가지는 객체
4.4.10 exotic object
하나 이상의 필수 내부 메서드에 대해 기본 동작을 가지지 않는 객체
Note
보통 객체가 아닌 모든 객체는 이색 객체이다.
4.4.11 standard object
그 의미론이 이 명세서에 의해 정의되는 객체
4.4.12 built-in object
ECMAScript 구현에 의해 명세되고 제공되는 객체
Note
표준 내장 객체는 이 명세서에서 정의된다. ECMAScript 구현은 추가적인 종류의 내장 객체를 명세하고 제공할 수 있다.
String 객체는 new 표현식에서 String 생성자를 사용하고, 인수로 String 값을 제공하여 생성된다. 생성된 객체는 그 값이 String 값인 내부 슬롯을 가진다. String 객체는 String 생성자를 함수로 호출하여(22.1.1.1) String 값으로 강제 변환될 수 있다.
Number 객체는 new 표현식에서 Number 생성자를 사용하고, 인수로 Number 값을 제공하여 생성된다. 생성된 객체는 그 값이 Number 값인 내부 슬롯을 가진다. Number 객체는 Number 생성자를 함수로 호출하여(21.1.1.1) Number 값으로 강제 변환될 수 있다.
절 11부터 17까지는 구문 인코딩과 모든 언어 기능의 실행 의미론을 포함한 실제 ECMAScript 프로그래밍 언어를 정의한다.
절 18부터 28까지는 ECMAScript 표준 라이브러리를 정의한다. 여기에는 ECMAScript 프로그램이 실행될 때 사용할 수 있는 모든 표준 객체의 정의가 포함된다.
절 29는 SharedArrayBuffer가 뒷받침하는 메모리에 대한 접근과 Atomics 객체 메서드의 메모리 일관성 모델을 설명한다.
5 표기 관례
5.1 구문 및 어휘 문법
5.1.1 문맥 자유 문법
문맥 자유 문법은 여러 개의 생성 규칙으로 구성된다. 각 생성 규칙은 왼쪽 항으로 비단말이라 불리는 추상 기호를 가지며, 오른쪽 항으로 0개 이상의 비단말 및 단말 기호의 시퀀스를 가진다. 각 문법에서 단말 기호는 지정된 알파벳으로부터 취해진다.
체인 생성 규칙은 오른쪽 항에 정확히 하나의 비단말 기호와 0개 이상의 단말 기호를 함께 가지는 생성 규칙이다.
목표 기호라고 불리는 하나의 구별된 비단말로 이루어진 문장에서 시작하여, 주어진 문맥 자유 문법은 하나의 언어, 즉 시퀀스 내의 어떤 비단말이든 그 비단말이 왼쪽 항인 생성 규칙의 오른쪽 항으로 반복적으로 치환함으로써 얻을 수 있는 단말 기호 시퀀스들의 (어쩌면 무한한) 집합을 명세한다.
공백과 주석을 제외한 입력 요소는 ECMAScript 구문 문법의 단말 기호를 이루며 ECMAScript 토큰이라 불린다. 이러한 토큰은 ECMAScript 언어의 예약어, 식별자, 리터럴, 구두점이다. 또한 줄 종료자는 토큰으로 간주되지는 않지만, 입력 요소 스트림의 일부가 되어 자동 세미콜론 삽입 과정(12.10)을 안내한다. 단순 공백과 단일 행 주석은 버려지며 구문 문법을 위한 입력 요소 스트림에 나타나지 않는다. MultiLineComment(/*…*/` 형태의 주석으로, 한 줄을 넘는지 여부와 관계없음)도 줄 종료자를 포함하지 않으면 마찬가지로 단순히 버려진다. 그러나 |MultiLineComment|가 하나 이상의 줄 종료자를 포함하면, 그것은 단일 줄 종료자로 대체되며, 이는 구문 문법을 위한 입력 요소 스트림의 일부가 된다.
ECMAScript의 RegExp 문법은 22.2.1에 제시되어 있다. 이 문법 역시 SourceCharacter로 정의되는 코드 포인트를 단말 기호로 가진다. 이 문법은 목표 기호Pattern로부터 시작하는 생성 규칙 집합을 정의하며, 코드 포인트 시퀀스가 어떻게 정규 표현식 패턴으로 변환되는지를 설명한다.
어휘 문법과 RegExp 문법의 생성 규칙은 구분 구두점으로 콜론 두 개 “::”를 가진다는 점으로 구별된다. 어휘 문법과 RegExp 문법은 일부 생성 규칙을 공유한다.
숫자 문자열 문법의 생성 규칙은 구두점으로 콜론 세 개 “:::”를 가진다는 점으로 구별되며, 소스 텍스트 파싱에는 결코 사용되지 않는다.
5.1.4 구문 문법
ECMAScript의 구문 문법은 절 13부터 16까지에 제시되어 있다. 이 문법은 어휘 문법에 의해 정의되는 ECMAScript 토큰을 단말 기호로 가진다(5.1.2). 이 문법은 두 개의 대안적 목표 기호Script와 Module로부터 시작하는 생성 규칙 집합을 정의하며, 토큰 시퀀스가 어떻게 ECMAScript 프로그램의 구문적으로 올바른 독립 구성 요소를 형성하는지를 설명한다.
코드 포인트 스트림을 ECMAScript Script 또는 Module로 파싱해야 할 때, 먼저 어휘 문법을 반복 적용하여 입력 요소 스트림으로 변환하고, 그 다음 이 입력 요소 스트림을 구문 문법의 단일 적용으로 파싱한다. 입력 요소 스트림 안의 토큰들이 목표 비단말(Script 또는 Module)의 단일 인스턴스로, 남는 토큰 없이 파싱될 수 없다면 입력 스트림은 구문 오류이다.
파싱이 성공하면 파스 트리가 구성된다. 이는 각 노드가 파스 노드인 루트가 있는 트리 구조이다. 각 파스 노드는 문법의 기호 하나의 인스턴스이며, 그 기호로부터 유도될 수 있는 소스 텍스트의 범위를 나타낸다. 전체 소스 텍스트를 나타내는 파스 트리의 루트 노드는 파스의 목표 기호의 인스턴스이다. 파스 노드가 비단말의 인스턴스인 경우, 그것은 또한 그 비단말을 왼쪽 항으로 가지는 어떤 생성 규칙의 인스턴스이기도 하다. 또한 그것은 0개 이상의 자식을 가지며, 각 자식은 생성 규칙 오른쪽 항의 각 기호 하나에 대응한다. 각 자식은 대응하는 기호의 인스턴스인 파스 노드이다.
새 파스 노드는 파서가 호출될 때마다 인스턴스화되며, 동일한 소스 텍스트를 파싱하는 경우에도 파스들 사이에서 재사용되지 않는다. 파스 노드는 동일한 소스 텍스트 범위를 나타내고, 동일한 문법 기호의 인스턴스이며, 동일한 파서 호출에서 생성된 경우에만 같은 파스 노드로 간주된다.
Note 1
같은 String을 여러 번 파싱하면 서로 다른 파스 노드가 생성된다. 예를 들어 다음을 보라.
let str = "1 + 1;";
eval(str);
eval(str);
eval을 호출할 때마다 str의 값은 ECMAScript 소스 텍스트로 변환되고, 그 자체의 별도 파스 노드 트리를 생성하는 독립적인 파싱이 수행된다. 각 파스가 동일한 String 값으로부터 유도된 소스 텍스트를 대상으로 하더라도, 그 트리들은 서로 구별된다.
Note 2
파스 노드는 명세상의 인공물이며, 구현이 이에 상응하는 자료 구조를 사용할 필요는 없다.
구문 문법의 생성 규칙은 구두점으로 단 하나의 콜론 “:”만 가진다는 점으로 구별된다.
절 13부터 16까지에 제시된 구문 문법은 어떤 토큰 시퀀스가 올바른 ECMAScript Script 또는 Module로 받아들여지는지에 대한 완전한 설명은 아니다. 특정 위치(예: 줄 종료 문자 앞)에 세미콜론을 추가하기만 하면 문법으로 기술될 수 있는 추가 토큰 시퀀스도 받아들여진다. 또한 문법으로 기술되더라도 특정 “어색한” 위치에 줄 종료 문자가 나타나면 받아들여지지 않는 토큰 시퀀스도 있다.
어떤 경우에는 모호성을 피하기 위해, 구문 문법이 유효한 ECMAScript Script 또는 Module을 형성하지 않는 토큰 시퀀스를 허용하는 일반화된 생성 규칙을 사용한다. 예를 들어 이 기법은 객체 리터럴과 객체 구조 분해 패턴에 사용된다. 그러한 경우 허용 가능한 토큰 시퀀스를 추가로 제한하는 더 엄격한 보충 문법이 제공된다. 일반적으로 조기 오류 규칙은 특정 맥락에서 "p must cover an n"이라고 기술한다. 여기서 p는 파스 노드(일반화된 생성 규칙의 인스턴스)이고 n은 보충 문법의 비단말이다. 이는 다음을 의미한다.
원래 p와 일치한 토큰 시퀀스를 목표 기호로 n을 사용하여 다시 파싱한다. n이 문법 매개변수를 가진다면, p가 원래 파싱될 때 사용된 것과 같은 값으로 설정된다.
그 토큰 시퀀스가 남는 토큰 없이 n의 단일 인스턴스로 파싱될 수 있다면:
그 n의 인스턴스(주어진 p에 대해 유일한 파스 노드)를 "p에 의해 덮이는 n"이라고 부른다.
n 및 그것으로부터 유도된 생성 규칙에 대한 모든 조기 오류 규칙은 p에 의해 덮이는 n에도 적용된다.
그렇지 않으면(파싱이 실패하면), 이는 조기 Syntax Error이다.
5.1.5 문법 표기법
5.1.5.1 단말 기호
ECMAScript 문법에서 일부 단말 기호는 fixed-width 글꼴로 표시된다. 이러한 것은 소스 텍스트에 정확히 적힌 그대로 나타나야 한다. 이 방식으로 명세된 모든 단말 기호 코드 포인트는 다른 유니코드 범위의 유사하게 생긴 코드 포인트가 아니라 Basic Latin 블록의 적절한 유니코드 코드 포인트로 이해되어야 한다. 단말 기호 안의 코드 포인트는 \UnicodeEscapeSequence로 표현될 수 없다.
단말 기호가 개별 유니코드 코드 포인트인 문법(즉, 어휘, RegExp, 숫자 문자열 문법)에서는, 생성 규칙에 나타나는 여러 개의 고정 폭 코드 포인트의 연속은 그것들을 각각 독립된 단말 기호로 쓴 것과 같은 코드 포인트 시퀀스에 대한 단순한 약식 표기이다.
어휘 및 RegExp 문법에서, 관례적인 인쇄 표현이 없는 유니코드 코드 포인트는 대신 "<ABBREV>" 형식으로 표시되며, 여기서 "ABBREV"는 그 코드 포인트 또는 코드 포인트 집합을 나타내는 기억 보조어이다. 이러한 형태는 유니코드 형식 제어 문자, 공백, 그리고 줄 종결자에서 정의된다.
비단말 기호는 이탤릭체로 표시된다. 비단말의 정의(“생성 규칙”이라고도 부른다)는 정의되는 비단말의 이름 뒤에 하나 이상의 콜론이 따라오는 형태로 도입된다. (콜론의 개수는 그 생성 규칙이 어느 문법에 속하는지를 나타낸다.) 그 다음 줄들에는 해당 비단말의 하나 이상의 대체 오른쪽 항이 이어진다. 예를 들어, 구문 정의
따라서 이 예에서 비단말 ForStatement는 실제로 네 개의 대체 오른쪽 항을 가진다.
5.1.5.4 문법 매개변수
생성 규칙은 생성 규칙이 정의하는 비단말 기호의 접미사로 나타날 수 있는 “[parameters]” 형식의 아래첨자 주석으로 매개변수화될 수 있다. “parameters”는 하나의 이름일 수도 있고, 쉼표로 구분된 이름 목록일 수도 있다. 매개변수화된 생성 규칙은, 매개변수화된 비단말 기호 뒤에 밑줄이 선행된 매개변수 이름들의 모든 조합을 덧붙여 정의하는 생성 규칙 집합의 약식이다. 이는 다음이
오른쪽 항 대안 앞에 “[+parameter]”가 붙으면, 그 대안은 해당 생성 규칙의 비단말 기호를 참조할 때 지정된 매개변수가 사용된 경우에만 사용 가능하다. 오른쪽 항 대안 앞에 “[~parameter]”가 붙으면, 그 대안은 해당 매개변수가 생성 규칙의 비단말 기호를 참조할 때 사용되지 않은 경우에만 사용 가능하다. 이는 다음이
생성 규칙의 오른쪽 항으로 “[empty]”라는 구가 나타나면, 그 생성 규칙의 오른쪽 항에 단말도 비단말도 포함되지 않음을 나타낸다.
5.1.5.7 룩어헤드 제한
생성 규칙의 오른쪽 항에 “[lookahead = seq]”라는 구가 나타나면, 이는 즉시 뒤따르는 입력 토큰 시퀀스의 접두사가 토큰 시퀀스 seq일 때에만 그 생성 규칙을 사용할 수 있음을 뜻한다. 마찬가지로, set이 유한하고 비어 있지 않은 토큰 시퀀스 집합일 때 “[lookahead ∈ set]”는 즉시 뒤따르는 토큰 시퀀스의 접두사가 set의 어떤 원소일 때에만 그 생성 규칙을 사용할 수 있음을 뜻한다. 편의를 위해, 그 집합은 비단말로도 쓸 수 있으며, 이 경우 그것은 그 비단말이 확장될 수 있는 모든 토큰 시퀀스의 집합을 나타낸다. 그 비단말이 무한히 많은 서로 다른 토큰 시퀀스로 확장될 수 있다면 이는 편집 오류로 간주된다.
이러한 조건은 부정될 수 있다. “[lookahead ≠ seq]”는 포함하는 생성 규칙이 즉시 뒤따르는 입력 토큰 시퀀스의 접두사가 seq가 아닐 때에만 사용 가능함을 뜻하고, “[lookahead ∉ set]”는 즉시 뒤따르는 토큰 시퀀스의 접두사가 set의 어떤 원소도 아닐 때에만 사용 가능함을 뜻한다.
첫 번째 숫자가 짝수인 하나 이상의 십진 숫자가 뒤따르는 문자 n이거나, 또 다른 십진 숫자가 뒤따르지 않는 십진 숫자와 일치한다.
이러한 구가 구문 문법에서 사용될 때는, 나중 위치에서 어떤 어휘 목표 기호를 사용할지 알아야 나중 토큰을 결정할 수 있으므로, 즉시 뒤따르는 토큰 시퀀스를 모호성 없이 식별하는 것이 불가능할 수 있다는 점에 유의하라. 따라서 이들이 구문 문법에서 사용될 때, 룩어헤드 제한(시퀀스 집합의 일부로서 포함되는 경우도 포함)에 토큰 시퀀스 seq가 나타나는데, 사용할 어휘 목표 기호의 선택이 seq가 결과 토큰 시퀀스의 접두사인지 여부를 바꿀 수 있다면, 이는 편집 오류로 간주된다.
구문 문법의 생성 규칙 오른쪽 항에 “[no LineTerminator here]”라는 구가 나타나면, 그 생성 규칙이 제한된 생성 규칙임을 뜻한다. 즉, 표시된 위치에서 입력 스트림에 LineTerminator가 나타나면 그 생성 규칙을 사용할 수 없다. 예를 들어, 생성 규칙
이 명세서는 종종 알고리즘의 단계를 명세하기 위해 번호가 매겨진 목록을 사용한다. 이러한 알고리즘은 ECMAScript 언어 구성 요소에 요구되는 의미론을 정확하게 명세하기 위해 사용된다. 이 알고리즘들은 특정 구현 기법의 사용을 암시하려는 의도가 아니다. 실제로는 주어진 기능을 구현하기 위해 더 효율적인 알고리즘이 있을 수 있다.
알고리즘은 위치별로 전달된 인수를 참조하기 위해 알고리즘 단계 내에서 사용할 수 있는 별칭 이름의 순서 있는 쉼표 구분 시퀀스로 명시적으로 매개변수화될 수 있다. 선택 매개변수는 대괄호([ , name ])로 표시되며 알고리즘 단계 안에서는 필수 매개변수와 다르지 않다. 가변(rest) 매개변수는 매개변수 목록의 끝에 나타날 수 있으며, 앞에 생략 부호를 붙여 (, ...name) 표기한다. 가변 매개변수는 필수 및 선택 매개변수 뒤에 제공되는 모든 인수를 List로 포착한다. 그러한 추가 인수가 없다면, 그 List는 비어 있다.
알고리즘 단계는 순차적인 하위 단계로 세분될 수 있다. 하위 단계는 들여쓰기되며, 그 자체로도 더 들여쓰기된 하위 단계로 세분될 수 있다. 윤곽 번호 매기기 관례를 사용하여 하위 단계를 식별하며, 첫 번째 수준의 하위 단계는 소문자 알파벳으로, 두 번째 수준의 하위 단계는 소문자 로마 숫자로 표기한다. 세 수준보다 더 많은 수준이 필요하면, 네 번째 수준에서 숫자 레이블을 사용하는 방식으로 이 규칙이 반복된다. 예를 들면 다음과 같다.
최상위 단계
하위 단계.
하위 단계.
하위하위 단계.
하위하위하위 단계
하위하위하위하위 단계
하위하위하위하위하위 단계
어떤 단계나 하위 단계는 그 하위 단계들에 조건을 거는 “if” 술어로 작성될 수 있다. 이 경우 그 하위 단계들은 술어가 참일 때에만 적용된다. 어떤 단계나 하위 단계가 “else”라는 단어로 시작하면, 그것은 같은 수준의 바로 앞 “if” 술어 단계의 부정이다.
어떤 단계는 그 하위 단계들의 반복 적용을 명시하기 위해 "For each" 또는 "Repeat"로 시작할 수 있다.
“Assert:”로 시작하는 단계는 그 알고리즘의 불변 조건을 주장한다. 이러한 주장은 그렇지 않으면 암묵적일 알고리즘 불변식을 명시적으로 드러내는 데 사용된다. 마찬가지로 “NOTE:”로 시작하는 단계는 인근 단계들에 대한 관련 맥락을 제공한다. Assertion 단계와 note 단계는 엄격히 정보 제공용이며, 추가적인 의미론적 요구 사항을 더하지 않으므로 구현이 이를 검사할 필요는 없다.
알고리즘 단계는 “Let x be someValue” 형식을 사용하여 어떤 값에 대해서도 이름 있는 별칭을 선언할 수 있다. 이러한 별칭은 x와 someValue가 동일한 기저 데이터를 참조하고 어느 한쪽에 대한 수정이 양쪽 모두에 보인다는 점에서 참조와 유사하다. 이러한 참조 유사 동작을 피하고자 하는 알고리즘 단계는 오른쪽 항의 복사본을 명시적으로 만들어야 한다. “Let x be a copy of someValue”는 someValue의 얕은 복사본을 만든다.
한번 선언된 별칭은 이후 어떤 단계에서든 참조될 수 있으며, 그 선언 이전의 단계에서 참조되어서는 안 된다. 별칭은 “Set x to someOtherValue” 형식으로 수정될 수 있다.
5.2.1 평가 순서
복잡한 표현식이 알고리즘 단계에 나타날 때, 그것들은 왼쪽에서 오른쪽으로, 안쪽에서 바깥쪽으로 평가되는 것으로 이해해야 한다. 예를 들어 다음 단계
Return A(B(), C.[[D]]) + E(F()).
는 다음과 동등하다.
Let tmp1 be B().
Let tmp2 be C.[[D]].
Let tmp3 be A(tmp1, tmp2).
Let tmp4 be F().
Let tmp5 be E(tmp4).
Let tmp6 be tmp3 + tmp5.
Return tmp6.
여기서 다양한 tmpN 별칭은 일시적이며 이 단계들 안에서만 보인다.
5.2.2 추상 연산
이 명세서의 여러 부분에서 사용하기 쉽게 하기 위해, 추상 연산이라 불리는 일부 알고리즘은 이름이 주어지고 매개변수화된 함수 형태로 작성되어, 다른 알고리즘 안에서 이름으로 참조될 수 있다. 추상 연산은 일반적으로 OperationName(arg1, arg2)와 같은 함수 적용 스타일로 참조된다. 일부 추상 연산은 클래스 유사 명세 추상의 다형적으로 디스패치되는 메서드처럼 취급된다. 이러한 메서드형 추상 연산은 일반적으로 someValue.OperationName(arg1, arg2)와 같은 메서드 적용 스타일로 참조된다.
5.2.3 구문 지시 연산
구문 지시 연산은 정의가 알고리즘들로 이루어진 이름 있는 연산이며, 각 알고리즘은 ECMAScript 문법 중 하나의 하나 이상의 생성 규칙과 연관된다. 여러 대안 정의를 가진 생성 규칙은 일반적으로 각 대안마다 서로 다른 알고리즘을 가진다. 알고리즘이 어떤 문법 생성 규칙과 연관되면, 그 알고리즘은 생성 규칙 대안의 단말 및 비단말 기호를 마치 알고리즘의 매개변수인 것처럼 참조할 수 있다. 이렇게 사용될 때 비단말 기호는 소스 텍스트를 파싱할 때 실제로 일치한 대안 정의를 가리킨다. 문법 생성 규칙 또는 그것으로부터 유도된 파스 노드에 의해 일치한 소스 텍스트는 일치에 참여한 첫 번째 단말의 시작에서 시작하여 마지막 단말의 끝에서 끝나는 소스 텍스트의 부분이다.
알고리즘이 어떤 생성 규칙 대안과 연관될 때, 그 대안은 일반적으로 어떤 “[ ]” 문법 주석도 없이 표시된다. 그러한 주석은 대안의 구문적 인식에만 영향을 주어야 하며, 대안과 연관된 의미론에는 영향을 주지 않아야 한다.
구문 지시 연산은 다음 알고리즘의 단계 1, 3, 그리고 4의 관례를 사용하여 파스 노드와, 선택적으로 다른 매개변수와 함께 호출된다.
Let status be SyntaxDirectedOperation of SomeNonTerminal.
Let someParseNode be the parse of some source text.
Perform SyntaxDirectedOperation of someParseNode.
Perform SyntaxDirectedOperation of someParseNode with argument "value".
명시적으로 달리 지정되지 않는 한, 모든 체인 생성 규칙은 그 생성 규칙의 왼쪽 항 비단말에 적용될 수 있는 모든 연산에 대해 암묵적 정의를 가진다. 이 암묵적 정의는 단지 같은 연산을 같은 매개변수와 함께(있다면) 체인 생성 규칙의 유일한 오른쪽 항 비단말에 다시 적용하고 그 결과를 반환한다. 예를 들어 어떤 알고리즘이 “Return Evaluation of Block” 형태의 단계를 가지고 있고, 다음 생성 규칙이 있다고 가정하자.
런타임에 호출되어야 하는 의미론을 명세하는 알고리즘은 런타임 의미론이라 불린다. 런타임 의미론은 추상 연산 또는 구문 지시 연산으로 정의된다.
5.2.4.1 Completion ( completionRecord )
The abstract operation Completion takes argument completionRecord (a Completion Record) and returns a Completion Record. Completion Record가 반환되고 있음을 강조하는 데 사용된다. It performs the following steps when called:
접두사 ?와 !는 Completion Record를 언래핑하는 축약형으로 사용된다. ?는 급작 완료를 호출자에게 전파하거나, 그렇지 않으면 정상 완료를 언래핑하는 데 사용된다. !는 Completion Record가 정상임을 단정하고 이를 언래핑하는 데 사용된다. 형식적으로, 다음 단계
문맥 자유 문법은 입력 요소 스트림이 평가될 수 있는 유효한 ECMAScript Script 또는 Module을 형성하는지 여부를 정의하는 모든 규칙을 표현하기에 충분히 강력하지 않다. 어떤 상황에서는 ECMAScript 알고리즘 관례나 산문 요구 사항을 사용하여 표현할 수 있는 추가 규칙이 필요하다. 이러한 규칙은 항상 문법의 생성 규칙과 연관되며, 그 생성 규칙의 정적 의미론이라 불린다.
정적 의미론 규칙은 이름을 가지며 일반적으로 알고리즘을 사용하여 정의된다. 이름 있는 정적 의미론 규칙은 문법 생성 규칙과 연관되며, 여러 대안 정의를 가진 생성 규칙은 일반적으로 각 대안마다 적용 가능한 각 이름 있는 정적 의미론 규칙에 대해 서로 다른 알고리즘을 가진다.
이 명세서의 언어에서는 숫자 값들이 아래첨자 접미사를 사용하여 서로 다른 숫자 종류 사이에서 구별된다. 아래첨자 𝔽는 Number를, 아래첨자 ℤ는 BigInt를 가리킨다. 아래첨자 접미사가 없는 숫자 값은 수학적 값을 가리킨다. 이 명세서는 대부분의 숫자 값을 10진수로 표기하며, 또한 0x 다음에 0-9 또는 A-F가 오는 형태의 숫자 값을 16진수 값으로 사용한다.
일반적으로 이 명세서가 "the length of y" 또는 "the integer represented by the four hexadecimal digits ..."와 같은 구에서 숫자 종류를 명시적으로 지정하지 않고 숫자 값을 참조할 때, 그 구는 수학적 값을 가리킨다. Number 또는 BigInt 값을 가리키는 구는 그러한 것으로 명시적으로 주석 처리된다. 예를 들어 "the Number value for the number of code points in …" 또는 "the BigInt value for …"와 같다.
이 명세서에서 정수라는 용어가 사용될 때, 달리 명시되지 않는 한 그것은 정수 집합에 속하는 수학적 값을 가리킨다. 이 명세서에서 정수형 Number라는 용어가 사용될 때, 그것은 그 수학적 값이 정수 집합에 속하는 유한한 Number 값을 가리킨다.
+, ×, =, ≥와 같은 숫자 연산자는 피연산자의 타입에 의해 결정되는 해당 연산을 가리킨다. 수학적 값에 적용될 때, 연산자는 일반적인 수학 연산을 가리킨다. 확장 수학적 값에 적용될 때, 연산자는 확장 실수에 대한 일반적인 수학 연산을 가리킨다. 부정형은 정의되지 않으며, 이 명세서에서 그것을 사용하는 것은 편집 오류로 간주되어야 한다. Number에 적용될 때, 연산자는 IEEE 754-2019 내의 შესაბამის 연산을 가리킨다. BigInt에 적용될 때, 연산자는 BigInt의 수학적 값에 적용되는 일반적인 수학 연산을 가리킨다. 혼합 타입 피연산자(예: Number와 수학적 값)에 적용되는 숫자 연산자는 정의되지 않으며, 이 명세서에서는 편집 오류로 간주되어야 한다.
수학적 값과 Number 또는 BigInt 사이의 변환은 이 문서에서 항상 명시적이다. 수학적 값 또는 확장 수학적 값x를 Number로 변환하는 것은 "the Number value for x" 또는 𝔽(x)로 표기되며, 6.1.6.1에서 정의된다. 정수x를 BigInt로 변환하는 것은 "the BigInt value for x" 또는 ℤ(x)로 표기된다. Number 또는 BigInt x를 수학적 값으로 변환하는 것은 "the mathematical value of x" 또는 ℝ(x)로 표기된다. +0𝔽와 -0𝔽의 수학적 값은 수학적 값 0이다. 유한하지 않은 값의 수학적 값은 정의되지 않는다. x의 extended mathematical value of는 유한한 값들에 대해서는 x의 수학적 값이며, +∞𝔽와 -∞𝔽에 대해서는 각각 +∞와 -∞이다. NaN에 대해서는 정의되지 않는다.
수학 함수 abs(x)는 x의 절댓값을 생성하며, x < 0이면 -x이고 그렇지 않으면 x 자체이다.
수학 함수 ln(x)는 x의 자연 로그를 생성한다. 수학 함수 log10(x)는 x의 밑 10 로그를 생성한다. 수학 함수 log2(x)는 x의 밑 2 로그를 생성한다.
수학 함수 min(x1, x2, … , xN)는 x1부터 xN까지 중 수학적으로 가장 작은 값을 생성한다. 수학 함수 max(x1, x2, ..., xN)는 x1부터 xN까지 중 수학적으로 가장 큰 값을 생성한다. 이 수학 함수들의 정의역과 공역은 확장 수학적 값이다.
표기 “x modulo y”(y는 유한하고 0이 아니어야 함)는, y와 같은 부호를 가지는(또는 0인) 값 k를 계산하며, 어떤 정수q에 대해 abs(k) < abs(y) and x - k = q × y를 만족한다.
"the result of clamping x between lower and upper"라는 구(여기서 x는 확장 수학적 값이고 lower와 upper는 lower ≤ upper를 만족하는 수학적 값이다)는, x < lower이면 lower를 생성하고, x > upper이면 upper를 생성하며, 그렇지 않으면 x를 생성한다.
수학 함수 floor(x)는 x보다 크지 않은 가장 큰 정수(+∞에 가장 가까운)를 생성한다.
수학 함수 truncate(x)는 0 쪽으로 반올림하여 x의 소수 부분을 제거하며, x < 0이면 -floor(-x)를 생성하고 그렇지 않으면 floor(x)를 생성한다.
수학 함수 min, max, abs, floor, truncate는 Number와 BigInt에 대해 정의되지 않으며, 수학적 값이 아닌 인수를 가진 그러한 메서드 사용은 이 명세서에서 편집 오류가 된다.
하한 a에서 상한 b까지의 구간은 동일한 숫자 타입의 숫자 값들로 이루어진, 무한할 수도 있고 비어 있을 수도 있는 집합이다. 각 경계는 포함 또는 배제 중 하나로 기술되며, 둘 다로 기술되지는 않는다. 구간에는 다음 네 가지 종류가 있다.
a(포함)에서 b(포함)까지의 구간은 a에서 b까지의 포함 구간이라고도 하며, 동일한 숫자 타입의 모든 값 x 중 a ≤ x ≤ b를 만족하는 것만 포함한다.
a(포함)에서 b(배제)까지의 구간은 동일한 숫자 타입의 모든 값 x 중 a ≤ x < b를 만족하는 것만 포함한다.
a(배제)에서 b(포함)까지의 구간은 동일한 숫자 타입의 모든 값 x 중 a < x ≤ b를 만족하는 것만 포함한다.
a(배제)에서 b(배제)까지의 구간은 동일한 숫자 타입의 모든 값 x 중 a < x < b를 만족하는 것만 포함한다.
예를 들어, 1(포함)에서 2(배제)까지의 구간은 1과 2 사이의 모든 수학적 값을 포함하며, 1은 포함하고 2는 포함하지 않는다. 구간을 정의하는 목적상, -0𝔽 < +0𝔽 이므로, 예를 들어 하한이 +0𝔽인 포함 구간은 +0𝔽는 포함하지만 -0𝔽는 포함하지 않는다. NaN은 어떤 구간에도 결코 포함되지 않는다.
5.2.7 값 표기
이 명세서에서 ECMAScript 언어 값은 굵게 표시된다. 예로는 null, true, 또는 "hello"가 있다. 이는 Function.prototype.apply 또는 let n = 42;와 같은 ECMAScript 소스 텍스트와 구별된다.
5.2.8 동일성
이 명세서에서 명세 값과 ECMAScript 언어 값은 모두 동등성을 위해 비교된다. 동등성을 비교할 때 값은 두 범주 중 하나에 속한다. 동일성이 없는 값은 정수의 크기나 시퀀스의 길이와 같은 모든 고유 특성이 같다면 다른 동일성이 없는 값과 같다. 동일성이 없는 값은 그 특성을 완전히 기술함으로써 사전 참조 없이도 드러낼 수 있다. 반대로 각 동일성이 있는 값은 고유하므로 오직 자기 자신과만 같다. 동일성이 있는 값은 동일성이 없는 값과 같지만, 여기에 동일성이라고 불리는 추가적인, 추측할 수 없고 변경할 수 없으며 보편적으로 유일한 특성이 더해진 것이다. 기존 동일성이 있는 값에 대한 참조는 동일성 자체를 기술할 수 없기 때문에 그것을 설명하는 것만으로는 드러낼 수 없고, 대신 이러한 값들에 대한 참조는 한 장소에서 다른 장소로 명시적으로 전달되어야 한다. 일부 동일성이 있는 값은 가변적이어서, 그 특성(동일성 제외)을 제자리에서 변경할 수 있고, 이로 인해 그 값을 보유한 모든 이가 새로운 특성을 관찰하게 된다. 동일성이 없는 값은 동일성이 있는 값과 결코 같지 않다.
이 명세서의 관점에서, “is”라는 단어는 “If bool is true, then ...”와 같이 두 값을 동등성을 위해 비교하는 데 사용되고, “contains”라는 단어는 "If list contains a Recordr such that r.[[Foo]] is true, then ..."와 같이 리스트 내부에서 동등성 비교를 사용해 값을 찾는 데 사용된다. 값들의 명세 동일성이 이러한 비교의 결과를 결정하며, 이는 이 명세서에서 공리적이다.
ECMAScript 언어의 관점에서, 언어 값은 SameValue추상 연산과 그것이 전이적으로 호출하는 추상 연산들을 사용하여 동등성을 비교한다. 이러한 비교 추상 연산의 알고리즘이 ECMAScript 언어 값의 언어 동일성을 결정한다.
이 명세의 알고리즘은 각각 연관된 타입을 가지는 값들을 조작한다.
가능한 값 타입은 이 절에서 정의된 것들에 정확히 한정된다.
타입은 다시 ECMAScript 언어 타입과 명세 타입으로 분류된다.
6.1 ECMAScript 언어 타입
ECMAScript 언어 타입은
ECMAScript 프로그래머가 ECMAScript 언어를 사용하여 직접 조작하는 값들에
대응한다. ECMAScript 언어 타입은 Undefined, Null, Boolean, String,
Symbol, Number, BigInt, Object이다.
ECMAScript 언어 값
은 ECMAScript 언어 타입으로 특징지어지는 값이다.
6.1.1 Undefined 타입
Undefined 타입은 정확히 하나의 값, undefined라고 불리는 값을
가진다. 값이 할당되지 않은 모든 변수는 undefined 값을 가진다.
6.1.2 Null 타입
Null 타입은 정확히 하나의 값, null이라고 불리는 값을 가진다.
6.1.3 Boolean 타입
Boolean 타입은
true와 false라고 불리는 두 값을 가지는 논리적 개체를 나타낸다.
6.1.4 String 타입
String 타입은
최대 길이 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
이라고 함)에 대해 다음 규칙을 사용하여
특별 처리를 적용한다.
첫 번째 코드 유닛 c1이 leading surrogate이고 두 번째 코드 유닛
c2가 trailing surrogate인 두 코드 유닛의 시퀀스는
surrogate pair
이며, 값이 (c1 - 0xD800) × 0x400 + (c2 - 0xDC00) + 0x10000인
코드 포인트로 해석된다. (참조
11.1.3)
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까지의 str의
substring"이라는 구(str은 String 값 또는
코드 유닛 시퀀스이고 inclusiveStart와 exclusiveEnd는 정수이다)는
인덱스 inclusiveStart에서 시작하여 인덱스 exclusiveEnd 바로 앞에서
끝나는 str의 연속된 코드 유닛으로 이루어진 String 값을 뜻한다
(inclusiveStart = exclusiveEnd이면 빈 String이다). "to" 접미사가
생략되면 str의 길이가 exclusiveEnd 값으로 사용된다.
"ASCII 단어 문자들"이라는 구는
다음 String 값을 뜻하며, 이는 U+005F (LOW LINE)와 함께 Unicode
Basic Latin 블록의 모든 문자와 숫자만으로 구성된다: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_".
역사적인 이유로, 이것은 다양한 알고리즘에서 의미를 가진다.
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:
len을 string의 길이라고 하자.
searchValue가 빈 String이고 fromIndex ≤ len이면, fromIndex를 반환한다.
searchLen을 searchValue의 길이라고 하자.
fromIndex ≤ i ≤ len - searchLen을 만족하는 각 정수i에 대해, 오름차순으로 다음을 수행한다.
candidate를 string의 i부터 i + searchLen까지의 substring이라고 하자.
candidate가 searchValue이면, i를 반환한다.
not-found를 반환한다.
Note 1
searchValue가 빈 String이고 fromIndex ≤ string의 길이면,
이 알고리즘은 fromIndex를 반환한다. 빈 String은 마지막 코드 유닛
뒤를 포함하여 문자열의 모든 위치에서 사실상 발견된다.
Note 2
이 알고리즘은 fromIndex + searchValue의 길이 >
string의 길이인 경우 항상 not-found를 반환한다.
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:
0 ≤ i ≤ fromIndex를 만족하는 각 정수i에 대해, 내림차순으로 다음을 수행한다.
candidate를 string의 i부터 i + searchLen까지의 substring이라고 하자.
candidate가 searchValue이면, i를 반환한다.
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 연산자의 의미론에
의해 호출된다.
숫자 타입은 일반적으로 정밀도 손실이나 절단 없이 상호 변환될 수
없기 때문에, ECMAScript 언어는 이 타입들 사이의 암묵적 변환을
제공하지 않는다. 프로그래머는 다른 타입을 요구하는 함수를 호출할 때
타입 간 변환을 위해 Number와 BigInt 함수를 명시적으로 호출해야
한다.
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 Infinity와
negative Infinity라고 부른다. 간결함을 위해 설명 목적상 이 값들은
각각 기호 +∞𝔽와 -∞𝔽로도 지칭된다.
(이 두 개의 무한 Number 값은 프로그램 표현식 +Infinity
(또는 단순히 Infinity)와 -Infinity에 의해 생성된다는 점에
유의하라.)
나머지 18,437,736,874,454,810,624개(즉,
264 - 253)의 값은
유한 수라고 불린다. 이들 중 절반은 양수이고
절반은 음수이며, 모든 유한 양의 Number 값마다 같은 크기를 가지는
대응 음의 값이 존재한다.
positive zero와 negative 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:
x가 NaN이면, NaN을 반환한다.
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:
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. 이것은 base를 exponent 제곱한 결과를 나타내는
구현 근사 값을 반환한다. It performs the following steps when called:
ℝ(base)를 ℝ(exponent) 제곱한 결과를 나타내는 구현 근사 Number 값을 반환한다.
Note
base가 1𝔽 또는 -1𝔽이고
exponent가 +∞𝔽 또는 -∞𝔽일 때,
또는 base가 1𝔽이고 exponent가 NaN일 때
base**exponent의 결과는 IEEE 754-2019와 다르다.
ECMAScript 초판은 이 연산에 대해 NaN 결과를 명시했으나,
이후 IEEE 754 개정은 1𝔽를 명시했다.
역사적인 ECMAScript 동작은 호환성 이유로 보존된다.
6.1.6.1.4 Number::multiply ( x, y )
The abstract operation Number::multiply 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:
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:
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:
% 연산자가 계산하는 부동소수점 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:
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:
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:
lNum을 shiftCount 비트만큼 왼쪽 시프트한 결과를 반환한다. 결과의 수학적 값은 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:
lNum을 shiftCount 비트만큼 부호 확장 오른쪽 시프트한 결과를 반환한다. 최상위 비트는 전파된다. 결과의 수학적 값은 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:
lNum을 shiftCount 비트만큼 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:
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:
x가 NaN이면, false를 반환한다.
y가 NaN이면, false를 반환한다.
x가 y이면, true를 반환한다.
x가 +0𝔽이고 y가 -0𝔽이면, true를 반환한다.
x가 -0𝔽이고 y가 +0𝔽이면, true를 반환한다.
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:
x가 NaN이고 y가 NaN이면, true를 반환한다.
x가 +0𝔽이고 y가 -0𝔽이면, false를 반환한다.
x가 -0𝔽이고 y가 +0𝔽이면, false를 반환한다.
x가 y이면, true를 반환한다.
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:
x가 NaN이고 y가 NaN이면, true를 반환한다.
x가 +0𝔽이고 y가 -0𝔽이면, true를 반환한다.
x가 -0𝔽이고 y가 +0𝔽이면, true를 반환한다.
x가 y이면, true를 반환한다.
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:
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:
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:
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:
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:
x가 NaN이면, "NaN"을 반환한다.
x가 +0𝔽 또는 -0𝔽이면, "0"을 반환한다.
x < -0𝔽이면, "-"와 Number::toString(-x, radix)의 string-concatenation을 반환한다.
x가 +∞𝔽이면, "Infinity"를 반환한다.
n, k, s를 다음을 만족하는 정수라고 하자: k ≥ 1, radixk - 1 ≤ s < radixk, 𝔽(s × radixn - k)가 x이며, k는 가능한 한 작다. k는 기수 radix를 사용한 s 표현의 자릿수이고, s는 radix로 나누어떨어지지 않으며, s의 최하위 자릿수는 이 기준들만으로는 반드시 유일하게 결정되지 않는다는 점에 유의하라.
s의 최하위 자릿수는 단계
5
에 나열된 요구 사항만으로는 항상 유일하게 결정되지 않는다.
Note 2
위 규칙보다 더 정확한 변환을 제공하는 구현에 대해서는, 단계
5
의 다음 대체 버전을 지침으로 사용하는 것이 권장된다.
n, k, s를 다음을 만족하는 정수라고 하자: k ≥ 1, radixk - 1 ≤ s < radixk, 𝔽(s × radixn - k)가 x이며, k는 가능한 한 작다. s에 대해 여러 가능성이 있으면, s × radixn - k가 ℝ(x)에 가장 가까워지도록 s를 선택한다. 그런 s 값이 둘이면, 짝수인 쪽을 선택한다. k는 기수 radix를 사용한 s 표현의 자릿수이고 s는 radix로 나누어떨어지지 않는다는 점에 유의하라.
Note 3
ECMAScript 구현자는 부동소수점 수의 이진-십진 변환을 위해
David M. Gay가 작성한 논문과 코드가 유용할 수 있다.
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:
x = 0ℤ이면, 0ℤ를 반환한다.
-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:
-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:
exponent < 0ℤ이면, RangeError 예외를 던진다.
base = 0ℤ이고 exponent = 0ℤ이면, 1ℤ를 반환한다.
base의 exponent 제곱을 반환한다.
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:
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:
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:
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:
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:
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:
여기의 의미론은 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:
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:
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:
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:
x = 1이고 y = 1이면, 1을 반환한다.
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:
x = 1이거나 y = 1이면, 1을 반환한다.
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:
x = 1이고 y = 0이면, 1을 반환한다.
x = 0이고 y = 1이면, 1을 반환한다.
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:
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:
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:
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:
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:
x < 0ℤ이면, "-"와 BigInt::toString(-x, radix)의 string-concatenation을 반환한다.
기수 radix를 사용한 x의 표현으로 이루어진 String 값을 반환한다.
6.1.7 Object 타입
Object 타입의 각
인스턴스, 즉 간단히 “an Object”라고도 불리는 것은 프로퍼티들의
집합을 나타낸다. 각 프로퍼티는 데이터 프로퍼티이거나 접근자
프로퍼티이다.
모든 음이 아닌 안전 정수는 대응하는 integer index를 가진다.
232 - 1을 제외한 모든 32비트 부호 없는
정수는 대응하는 array index를 가진다. "-0"는 integer index도
array index도 아니다.
프로퍼티 키는 프로퍼티와 그 값을 접근하는 데 사용된다. 프로퍼티
접근에는 두 종류가 있다: get과 set으로, 각각 값 검색과
값 할당에 대응한다. get 및 set 접근을 통해 접근 가능한 프로퍼티에는,
객체의 직접적인 일부인 own properties와, 프로퍼티 상속 관계를
통해 다른 연관 객체가 제공하는 inherited properties가 모두
포함된다. 상속된 프로퍼티는 그 연관 객체의 own 프로퍼티일 수도 있고
상속된 프로퍼티일 수도 있다. 객체의 각 own 프로퍼티는 반드시 그 객체의
다른 own 프로퍼티의 키 값들과 구별되는 키 값을 가져야 한다.
모든 객체는 논리적으로 프로퍼티들의 집합이지만, 프로퍼티 접근과
조작의 의미론이 서로 다른 여러 형태의 객체가 존재한다. 여러 형태의
객체 정의는
6.1.7.2
를 보라.
또한 일부 객체는 호출 가능하다. 이들은 함수 또는 함수 객체라고
불리며 아래에서 더 설명된다. ECMAScript의 모든 함수는 Object 타입의
구성원이다.
6.1.7.1 프로퍼티 속성
속성은 이 명세에서
Table 3에 설명된
대로 Object 프로퍼티의 상태를 정의하고 설명하는 데 사용된다.
명시적으로 지정되지 않는 한, 각 속성의 초기 값은 그 Default Value이다.
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]]라는 이름의 내부 슬롯을 가지며,
이는 PrivateElements의 List이다. 이 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
에 정의된 것 중 하나를 사용한다.
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를 반환한다.
키가 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를 반환한다.
Table 5
는 함수처럼 호출될 수 있는 객체가 지원하는 추가적인 essential internal
methods를 요약한다.
function object는
[[Call]] 내부 메서드를 지원하는 객체이다.
constructor는
[[Construct]] 내부 메서드를 지원하는 객체이다. [[Construct]]를
지원하는 모든 객체는 [[Call]]도 지원해야 한다. 즉, 모든 constructor는
function object여야 한다. 따라서 constructor는
constructor function 또는
constructorfunction object라고도 불릴 수 있다.
Table 5: Additional Essential Internal Methods of Function Objects
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
프로퍼티로 존재하지 않는 프로퍼티이다.
[[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]] 호출은 proto와
SameValue인 값을 반환해야 한다.
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로 간주된다.
propertyKey가 non-configurable이고 non-writable인 own 데이터
프로퍼티로 기술되었다면, 이후의 모든 [[GetOwnProperty]]
( propertyKey ) 호출은 [[Value]]가 propertyKey의 [[Value]]
속성과 SameValue인 Property 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를
반환해야 한다. 단, 다음 경우는 예외이다.
propertyKey가 writable 데이터 프로퍼티인 경우.
non-configurable writable 데이터 프로퍼티는
non-configurable non-writable 데이터 프로퍼티로 변경될 수 있다.
target이 non-extensible이고 propertyKey가 non-existent own
프로퍼티이면, [[DefineOwnProperty]] (propertyKey, desc)는
반드시 false를 반환해야 한다. 즉, non-extensible target 객체는
새로운 프로퍼티로 확장될 수 없다.
[[HasProperty]] ( propertyKey )
정상 반환 타입은 Boolean이다.
propertyKey가 이전에 target의 non-configurable own 데이터
또는 접근자 프로퍼티로 관찰된 적이 있다면, [[HasProperty]]는
반드시 true를 반환해야 한다.
propertyKey가 이전에 값이 value인 target의 non-configurable,
non-writable own 데이터 프로퍼티로 관찰된 적이 있다면, [[Get]]은
반드시 value와 SameValue인 값을 반환해야 한다.
propertyKey가 이전에 [[Get]] 속성이 undefined인 target의
non-configurable own 접근자 프로퍼티로 관찰된 적이 있다면,
[[Get]] 연산은 반드시 undefined를 반환해야 한다.
[[Set]] ( propertyKey, value, receiver )
정상 반환 타입은 Boolean이다.
propertyKey가 이전에 target의 non-configurable, non-writable own
데이터 프로퍼티로 관찰된 적이 있다면, [[Set]]은 value가
propertyKey의 [[Value]] 속성과 SameValue인 경우를 제외하고
반드시 false를 반환해야 한다.
propertyKey가 이전에 [[Set]] 속성이 undefined인 target의
non-configurable own 접근자 프로퍼티로 관찰된 적이 있다면,
[[Set]] 연산은 반드시 false를 반환해야 한다.
[[Delete]] ( propertyKey )
정상 반환 타입은 Boolean이다.
propertyKey가 이전에 target의 non-configurable own 데이터 또는
접근자 프로퍼티로 관찰된 적이 있다면, [[Delete]]는 반드시 false를
반환해야 한다.
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에
나열되어 있다.
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 R과 R의 값 영역 안의
두 값 a, b에 대해, aRb는 순서쌍 (a, b)가 R의
원소임을 말하는 축약 표현이다. 어떤 조건들에 대한
least Relation은 그 조건들을 만족하는
가장 작은 Relation이다.
strict partial order는
다음을 만족하는 Relation 값 R이다.
R의 영역에 있는 모든 a, b, c에 대해:
aRa인 경우는 아니고,
aRb이고 bRc이면, aRc이다.
Note 1
위 두 성질은 각각 irreflexivity와 transitivity라고 불린다.
strict total order는 다음을
만족하는 Relation 값 R이다.
R의 영역에 있는 모든 a, b, c에 대해:
a is b 또는 aRb 또는 bRa이고,
aRa인 경우는 아니며,
aRb이고 bRc이면, aRc이다.
Note 2
위 세 성질은 각각 totality, irreflexivity, transitivity라고
불린다.
6.2.4 Completion Record 명세 타입
Completion Record 명세 타입은
값과 제어 흐름의 런타임 전파를 설명하는 데 사용되며, 여기에는 비국소적인
제어 이전을 수행하는 문장(break, continue, return, throw)의
동작이 포함된다.
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:
The abstract operation ThrowCompletion takes argument value (an ECMAScript language value) and returns a throw completion. It performs the following steps when called:
The abstract operation ReturnCompletion takes argument value (an ECMAScript language value) and returns a return completion. It performs the following steps when called:
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:
다음 추상 연산들은 이 명세에서 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:
The abstract operation IsUnresolvableReference takes argument referenceRecord (a Reference Record) and returns a Boolean. It performs the following steps when called:
The abstract operation IsSuperReference takes argument referenceRecord (a Reference Record) and returns a Boolean. It performs the following steps when called:
The abstract operation IsPrivateReference takes argument referenceRecord (a Reference Record) and returns a Boolean. It performs the following steps when called:
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:
단계 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:
단계 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:
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:
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:
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:
desc가 [[Get]] 필드를 가지면, true를 반환한다.
desc가 [[Set]] 필드를 가지면, true를 반환한다.
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:
desc가 [[Value]] 필드를 가지면, true를 반환한다.
desc가 [[Writable]] 필드를 가지면, true를 반환한다.
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:
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:
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:
desc가 [[Value]] 필드 또는 [[Writable]] 필드를 가지면, TypeError 예외를 던진다.
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:
like를 Record { [[Value]]: undefined, [[Writable]]: false, [[Get]]: undefined, [[Set]]: undefined, [[Enumerable]]: false, [[Configurable]]: false }라고 하자.
desc가 [[Value]] 필드를 가지지 않으면, desc.[[Value]]를 like.[[Value]]로 설정한다.
desc가 [[Writable]] 필드를 가지지 않으면, desc.[[Writable]]를 like.[[Writable]]로 설정한다.
그렇지 않으면,
desc가 [[Get]] 필드를 가지지 않으면, desc.[[Get]]을 like.[[Get]]으로 설정한다.
desc가 [[Set]] 필드를 가지지 않으면, desc.[[Set]]을 like.[[Set]]으로 설정한다.
desc가 [[Enumerable]] 필드를 가지지 않으면, desc.[[Enumerable]]을 like.[[Enumerable]]로 설정한다.
desc가 [[Configurable]] 필드를 가지지 않으면, desc.[[Configurable]]을 like.[[Configurable]]로 설정한다.
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로 참조된다.
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로 모델링된다.
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:
size > 253 - 1이면, RangeError 예외를 던진다.
size 바이트로 이루어진 새로운 Data Block 값 db를 생성한다. 그런 Data Block을 생성할 수 없으면, RangeError 예외를 던진다.
db의 모든 바이트를 0으로 설정한다.
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:
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:
Private Name 명세 타입은 private
class element(field, method, accessor)의 키를 나타내는, 전역적으로
고유한 값(다른 모든 Private Name과 구별되는 값으로, 다른 점에서 구별되지
않더라도 다름)을 설명하는 데 사용된다. 각 Private Name은 String인
불변의 [[Description]] 내부 슬롯을 가진다. Private Name은
PrivateFieldAdd 또는 PrivateMethodOrAccessorAdd를 사용하여 어떤
ECMAScript 객체에도 설치될 수 있고, 이후 PrivateGet과 PrivateSet을
사용하여 읽거나 쓸 수 있다.
6.2.13 ClassStaticBlockDefinition Record 명세 타입
ClassStaticBlockDefinition Record
는 class static initialization block의 실행 가능한 코드를 캡슐화하는 데
사용되는 Record 값이다.
ClassStaticBlockDefinition Record는
Table 11
에 나열된 필드를 가진다.
이 연산들은 ECMAScript 언어의 일부가 아니다. 이들은 오직 ECMAScript
언어의 의미론 명세를 돕기 위해 여기서 정의된다. 더 특수화된 다른 추상
연산들은 이 명세 전반에 걸쳐 정의된다.
7.1 타입 변환
ECMAScript 언어는 필요에 따라 암묵적으로 자동 타입 변환을 수행한다.
특정 구성요소의 의미론을 명확히 하기 위해 변환 추상 연산들의 집합을
정의하는 것이 유용하다. 변환 추상 연산은 다형적이다. 즉, 어떤
ECMAScript 언어 타입의 값도 받아들일 수 있다. 그러나 다른 명세 타입은
이 연산들과 함께 사용되지 않는다.
BigInt 타입은 ECMAScript 언어에서 암묵적 변환을 가지지 않는다.
프로그래머는 다른 타입의 값을 변환하기 위해 BigInt를 명시적으로 호출해야
한다.
7.1.1 ToPrimitive ( input [ , preferredType ] )
The abstract operation ToPrimitive takes argument input (an ECMAScript language value) and optional argument preferredType (string or number) and returns either a normal completion containing an ECMAScript language value or a throw completion. 이것은 input 인수를 비-Object 타입으로 변환한다. 어떤 객체가
둘 이상의 원시 타입으로 변환될 수 있다면, 선택적 힌트
preferredType을 사용해 그 타입을 선호할 수 있다. It performs the following steps when called:
ToPrimitive가 힌트 없이 호출되면, 일반적으로 힌트가 number인
것처럼 동작한다. 그러나 객체는 %Symbol.toPrimitive% 메서드를
정의함으로써 이 동작을 재정의할 수 있다. 이 명세에서 정의된 객체 중
기본 ToPrimitive 동작을 재정의하는 것은 Date(참조
21.4.4.45)
와 Symbol 객체(참조
20.4.3.5)
뿐이다. Date는 힌트가 없는 경우를 힌트가 string인 것처럼 취급한다.
7.1.1.1 OrdinaryToPrimitive ( obj, hint )
The abstract operation OrdinaryToPrimitive takes arguments obj (an Object) and hint (string or number) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:
The abstract operation ToBoolean takes argument argument (an ECMAScript language value) and returns a Boolean. 이것은 argument를 Boolean 타입의 값으로 변환한다. It performs the following steps when called:
argument가 Boolean이면, argument를 반환한다.
argument가 undefined, null, +0𝔽, -0𝔽, NaN, 0ℤ, 또는 빈 String 중 하나이면, false를 반환한다.
argument가 Object이고 [[IsHTMLDDA]] 내부 슬롯을 가지면, false를 반환한다.
true를 반환한다.
7.1.3 ToNumeric ( value )
The abstract operation ToNumeric takes argument value (an ECMAScript language value) and returns either a normal completion containing either a Number or a BigInt, or a throw completion. 이것은 value를 Number 또는 BigInt로 변환해 반환한다. It performs the following steps when called:
The abstract operation ToNumber takes argument argument (an ECMAScript language value) and returns either a normal completion containing a Number or a throw completion. 이것은 argument를 Number 타입의 값으로 변환한다. It performs the following steps when called:
The abstract operation RoundMVResult takes argument n (a mathematical value) and returns a Number. 이것은 n을 구현 정의 방식으로 Number로 변환한다.
이 추상 연산의 목적상, 어떤 자릿수는 그것이 0이 아니거나,
또는 그 왼쪽에 0이 아닌 자릿수가 있고 오른쪽에도 0이 아닌
자릿수가 있으면 유효하다. 또한 이 추상 연산의 목적상,
수학적 값의 한 표현이 “나타내는 수학적 값”은 수학적 값의
“십진 표현”의 역이다. It performs the following steps when called:
The abstract operation ToIntegerOrInfinity takes argument argument (an ECMAScript language value) and returns either a normal completion containing either an integer, +∞, or -∞, or a throw completion. 이것은 argument를 소수 부분이 절단된 Number 값을 나타내는
정수로 변환하거나, 그 Number 값이 무한이면 +∞ 또는 -∞로 변환한다. It performs the following steps when called:
The abstract operation ToFixedSizeInteger takes arguments int (an integer, +∞, or -∞), signed (unsigned or signed), and bitWidth (a positive integer) and returns an integer. 이는 int를 0부터 2bitWidth - 1까지의 포함 구간에 있는 2bitWidth개의 정수 중 하나로(unsigned인 경우), 또는 -2bitWidth - 1부터 2bitWidth - 1 - 1까지의 포함 구간에 있는 정수 중 하나로(signed인 경우) 매핑한다. It performs the following steps when called:
ToFixedSizeInteger는 멱등적이다. 즉, 임의의 ECMAScript 언어 값 x에 대해 ToFixedSizeInteger(ToFixedSizeInteger(x, signed, bitWidth), signed, bitWidth)는 ToFixedSizeInteger(x, signed, bitWidth)와 같다. 실제로 +∞와 -∞는 0으로 매핑되므로, 이 불변성은 signed의 반전에서도 유지된다(예: ToFixedSizeInteger(ToFixedSizeInteger(x, signed, 32), unsigned, 32)는 ToFixedSizeInteger(x, unsigned, 32)와 같다).
7.1.7 ToInt32 ( argument )
The abstract operation ToInt32 takes argument argument (ECMAScript 언어 값) and returns 정수 Number를 포함하는 정상 완료 또는 throw 완료. 이는 argument를 𝔽(-231)부터 𝔽(231 - 1)까지의 포함 구간에 있는 232개의 정수 Number 값 중 하나로 변환하며, -0𝔽는 제외한다. It performs the following steps when called:
The abstract operation ToUint32 takes argument argument (ECMAScript 언어 값) and returns 정수 Number를 포함하는 정상 완료 또는 throw 완료. 이는 argument를 +0𝔽부터 𝔽(232 - 1)까지의 포함 구간에 있는 232개의 정수 Number 값 중 하나로 변환한다. It performs the following steps when called:
The abstract operation ToInt16 takes argument argument (ECMAScript 언어 값) and returns 정수 Number를 포함하는 정상 완료 또는 throw 완료. 이는 argument를 𝔽(-215)부터 𝔽(215 - 1)까지의 포함 구간에 있는 216개의 정수 Number 값 중 하나로 변환하며, -0𝔽는 제외한다. It performs the following steps when called:
The abstract operation ToUint16 takes argument argument (ECMAScript 언어 값) and returns 정수 Number를 포함하는 정상 완료 또는 throw 완료. 이는 argument를 +0𝔽부터 𝔽(216 - 1)까지의 포함 구간에 있는 216개의 정수 Number 값 중 하나로 변환한다. It performs the following steps when called:
The abstract operation ToInt8 takes argument argument (ECMAScript 언어 값) and returns 정수 Number를 포함하는 정상 완료 또는 throw 완료. 이는 argument를 -128𝔽부터 127𝔽까지의 포함 구간에 있는 28개의 정수 Number 값 중 하나로 변환하며, -0𝔽는 제외한다. It performs the following steps when called:
The abstract operation ToUint8 takes argument argument (ECMAScript 언어 값) and returns 정수 Number를 포함하는 정상 완료 또는 throw 완료. 이는 argument를 +0𝔽부터 255𝔽까지의 포함 구간에 있는 28개의 정수 Number 값 중 하나로 변환한다. It performs the following steps when called:
The abstract operation ToUint8Clamp takes argument argument (ECMAScript 언어 값) and returns 정수 Number를 포함하는 정상 완료 또는 throw 완료. 이는 argument를 0부터 255까지의 포함 구간에 있는 28개의 정수 Number 값 중 하나로 클램프하고 반올림한다. It performs the following steps when called:
대부분의 다른 ECMAScript 정수 변환 연산과 달리, ToUint8Clamp는 비정수 값을 자르지 않고 반올림한다. 또한 “절반은 짝수로 반올림” 동률 처리 방식을 사용하는데, 이는 Math.round의 “절반 올림” 동률 처리 방식과 다르다.
7.1.14 ToBigInt ( argument )
The abstract operation ToBigInt takes argument argument (ECMAScript 언어 값) and returns BigInt를 포함하는 정상 완료 또는 throw 완료. 이는 argument를 BigInt 값으로 변환하거나, Number에서의 암시적 변환이 필요한 경우 던진다. It performs the following steps when called:
The abstract operation ToBigInt64 takes argument argument (ECMAScript 언어 값) and returns BigInt를 포함하는 정상 완료 또는 throw 완료. 이는 argument를 ℤ(-263)부터 ℤ(263 - 1)까지의 포함 구간에 있는 264개의 BigInt 값 중 하나로 변환한다. It performs the following steps when called:
The abstract operation ToBigUint64 takes argument argument (ECMAScript 언어 값) and returns BigInt를 포함하는 정상 완료 또는 throw 완료. 이는 argument를 0ℤ부터 ℤ(264 - 1)까지의 포함 구간에 있는 264개의 BigInt 값 중 하나로 변환한다. It performs the following steps when called:
The abstract operation ToString takes argument argument (ECMAScript 언어 값) and returns String을 포함하는 정상 완료 또는 throw 완료. 이는 argument를 String 타입의 값으로 변환한다. It performs the following steps when called:
The abstract operation ToObject takes argument argument (ECMAScript 언어 값) and returns Object를 포함하는 정상 완료 또는 throw 완료. 이는 argument를 Object 타입의 값으로 변환한다. It performs the following steps when called:
argument가 undefined 또는 null이면, TypeError 예외를 던진다.
argument가 Boolean이면, [[BooleanData]] 내부 슬롯이 argument로 설정된 새로운 Boolean 객체를 반환한다. Boolean 객체에 대한 설명은 20.3를 보라.
argument가 Number이면, [[NumberData]] 내부 슬롯이 argument로 설정된 새로운 Number 객체를 반환한다. Number 객체에 대한 설명은 21.1를 보라.
argument가 String이면, [[StringData]] 내부 슬롯이 argument로 설정된 새로운 String 객체를 반환한다. String 객체에 대한 설명은 22.1를 보라.
argument가 Symbol이면, [[SymbolData]] 내부 슬롯이 argument로 설정된 새로운 Symbol 객체를 반환한다. Symbol 객체에 대한 설명은 20.4를 보라.
argument가 BigInt이면, [[BigIntData]] 내부 슬롯이 argument로 설정된 새로운 BigInt 객체를 반환한다. BigInt 객체에 대한 설명은 21.2를 보라.
The abstract operation ToPropertyKey takes argument argument (ECMAScript 언어 값) and returns 속성 키를 포함하는 정상 완료 또는 throw 완료. 이는 argument를 속성 키로 사용할 수 있는 값으로 변환한다. It performs the following steps when called:
The abstract operation ToLength takes argument argument (ECMAScript 언어 값) and returns 음이 아닌 정수 Number를 포함하는 정상 완료 또는 throw 완료. 이는 argument를 배열 유사 객체의 길이로 사용하기에 적합한 음이 아닌 정수 Number로 클램프하고 자른다. It performs the following steps when called:
The abstract operation CanonicalNumericIndexString takes argument argument (String) and returns Number 또는 undefined. argument가 "-0"이거나 어떤 Number 값 n에 대해 ToString(n)과 정확히 일치하면, 해당 Number 값을 반환한다. 그렇지 않으면 undefined를 반환한다. It performs the following steps when called:
표준 숫자 문자열은 CanonicalNumericIndexString 추상 연산이 undefined를 반환하지 않는 모든 String이다.
7.1.23 ToIndex ( value )
The abstract operation ToIndex takes argument value (an ECMAScript language value) and returns either a normal completion containing a non-negative integer or a throw completion. 이것은 value를 정수로 변환하고, 그 정수가 음이 아니며 integer
index에 대응하면 그 정수를 반환한다. 그렇지 않으면 예외를 던진다. It performs the following steps when called:
integer가 0부터 253 - 1까지의 포함 구간 안에 있지 않으면, RangeError 예외를 던진다.
integer를 반환한다.
7.2 테스트 및 비교 연산
7.2.1 RequireObjectCoercible ( argument )
The abstract operation RequireObjectCoercible takes argument argument (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. 이것은 argument가 ToObject를 사용해 Object로 변환될 수 없는
값이면 오류를 던진다. It performs the following steps when called:
argument가 undefined 또는 null이면, TypeError 예외를 던진다.
unused를 반환한다.
7.2.2 IsArray ( argument )
The abstract operation IsArray takes argument argument (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
The abstract operation IsCallable takes argument argument (an ECMAScript language value) and returns a Boolean. 이것은 argument가 [[Call]] 내부 메서드를 가진 호출 가능한
함수인지 결정한다. It performs the following steps when called:
argument가 Object가 아니면, false를 반환한다.
argument가 [[Call]] 내부 메서드를 가지면, true를 반환한다.
false를 반환한다.
7.2.4 IsConstructor ( argument )
The abstract operation IsConstructor takes argument argument (an ECMAScript language value) and returns a Boolean. 이것은 argument가 [[Construct]] 내부 메서드를 가진 함수 객체인지
결정한다. It performs the following steps when called:
argument가 Object가 아니면, false를 반환한다.
argument가 [[Construct]] 내부 메서드를 가지면, true를 반환한다.
false를 반환한다.
7.2.5 IsExtensible ( obj )
The abstract operation IsExtensible takes argument obj (an Object) and returns either a normal completion containing a Boolean or a throw completion. 이것은 obj에 추가 프로퍼티를 더할 수 있는지 결정하는 데
사용된다. It performs the following steps when called:
? obj.[[IsExtensible]]()를 반환한다.
7.2.6 IsRegExp ( argument )
The abstract operation IsRegExp takes argument argument (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
The abstract operation IsStringWellFormedUnicode takes argument string (a String) and returns a Boolean. 이것은 string을
6.1.4
에 설명된 대로 UTF-16으로 인코딩된 code point 시퀀스로 해석하고,
그것이 well formed
UTF-16 시퀀스인지 결정한다. It performs the following steps when called:
The abstract operation SameType takes arguments x (an ECMAScript language value) and y (an ECMAScript language value) and returns a Boolean. 이것은 두 인수가 같은 타입인지 아닌지를 결정한다. It performs the following steps when called:
x가 undefined이고 y가 undefined이면, true를 반환한다.
x가 null이고 y가 null이면, true를 반환한다.
x가 Boolean이고 y가 Boolean이면, true를 반환한다.
x가 Number이고 y가 Number이면, true를 반환한다.
x가 BigInt이고 y가 BigInt이면, true를 반환한다.
x가 Symbol이고 y가 Symbol이면, true를 반환한다.
x가 String이고 y가 String이면, true를 반환한다.
x가 Object이고 y가 Object이면, true를 반환한다.
false를 반환한다.
7.2.9 SameValue ( x, y )
The abstract operation SameValue takes arguments x (an ECMAScript language value) and y (an ECMAScript language value) and returns a Boolean. 이것은 두 인수가 같은 값인지 아닌지를 결정한다. It performs the following steps when called:
이 알고리즘은 모든 NaN 값을 동등하게 취급하고,
+0𝔽와 -0𝔽를 구별한다는 점에서
IsStrictlyEqual 알고리즘과 다르다.
7.2.10 SameValueZero ( x, y )
The abstract operation SameValueZero takes arguments x (an ECMAScript language value) and y (an ECMAScript language value) and returns a Boolean. 이것은 두 인수가 같은 값인지 아닌지를 결정한다
(+0𝔽와 -0𝔽의 차이는 무시한다). It performs the following steps when called:
SameValueZero는 +0𝔽와 -0𝔽를 동등하게
취급한다는 점에서만 SameValue와 다르다.
7.2.11 SameValueNonNumber ( x, y )
The abstract operation SameValueNonNumber takes arguments x (an ECMAScript language value, but not a Number) and y (an ECMAScript language value, but not a Number) and returns a Boolean. It performs the following steps when called:
The abstract operation IsLessThan takes arguments x (an ECMAScript language value), y (an ECMAScript language value), and leftFirst (a Boolean) and returns either a normal completion containing either a Boolean or undefined, or a throw completion. x < y 비교에 대한 의미론을 제공하며, true, false 또는 undefined를 반환한다(undefined는 피연산자를 동일한 수치 타입의 비교 가능한 값으로 강제 변환할 수 없음을 나타낸다). leftFirst 플래그는 x와 y에 대해 잠재적으로 관찰 가능한 부수 효과가 있는 연산이 수행되는 순서를 제어하는 데 사용된다. ECMAScript는 표현식의 왼쪽에서 오른쪽으로의 평가를 명시하므로 이것이 필요하다. leftFirst가 true이면, x 매개변수는 y 매개변수에 대응하는 표현식의 왼쪽에 나타나는 표현식에 대응한다. leftFirst가 false이면 그 반대의 경우이며, 연산은 x보다 y에 대해 먼저 수행되어야 한다. It performs the following steps when called:
단계 3는, 덧셈
연산자 +를 처리하는 알고리즘
(13.15.3)
의 단계 1.c와
달리 논리합이 아니라 논리곱 연산을 사용한다는 점에서 다르다.
Note 2
String 비교는 UTF-16 code unit 값들의 시퀀스에 대한 단순한
사전식 순서를 사용한다. Unicode 명세에 정의된 문자 또는 문자열
동등성과 정렬 순서의 더 복잡하고 의미 지향적인 정의를 사용하려는
시도는 하지 않는다. 따라서 Unicode 표준에 따라 정준적으로 같지만
같은 정규화 형식이 아닌 String 값은 서로 같지 않은 것으로 테스트될 수
있다. 또한 surrogate pair를 포함한 String에 대해
code unit에 의한 사전식 순서가 code point에 의한
순서와 다르다는 점도 유의하라.
7.2.13 IsLooselyEqual ( x, y )
The abstract operation IsLooselyEqual takes arguments x (an ECMAScript language value) and y (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. 이것은 == 연산자의 의미론을 제공한다. It performs the following steps when called:
The abstract operation IsStrictlyEqual takes arguments x (an ECMAScript language value) and y (an ECMAScript language value) and returns a Boolean. 이것은 === 연산자의 의미론을 제공한다. It performs the following steps when called:
이 알고리즘은 signed zero와 NaN을 처리하는 방식에서 SameValue
알고리즘과 다르다.
7.3 객체에 대한 연산
7.3.1 MakeBasicObject ( internalSlotsList )
The abstract operation MakeBasicObject takes argument internalSlotsList (a List of internal slot names) and returns an Object. 이것은 ordinary object와 exotic object를 포함하여 알고리즘적으로
생성되는 모든 ECMAScript 객체의 원천이다. 이것은 모든 객체 생성에
사용되는 공통 단계를 분리해내고, 객체 생성을 중앙화한다. It performs the following steps when called:
The abstract operation Get takes arguments obj (an Object) and propertyKey (a property key) and returns either a normal completion containing an ECMAScript language value or a throw completion. 이것은 객체의 특정 프로퍼티 값을 검색하는 데 사용된다. It performs the following steps when called:
? obj.[[Get]](propertyKey, obj)를 반환한다.
7.3.3 GetV ( value, propertyKey )
The abstract operation GetV takes arguments value (an ECMAScript language value) and propertyKey (a property key) and returns either a normal completion containing an ECMAScript language value or a throw completion. 이것은 ECMAScript 언어 값의 특정 프로퍼티 값을 검색하는 데
사용된다. 값이 객체가 아니면, 프로퍼티 조회는 그 값의 타입에 적합한
래퍼 객체를 사용하여 수행된다. It performs the following steps when called:
The abstract operation Set takes arguments obj (an Object), propertyKey (a property key), value (an ECMAScript language value), and throw (a Boolean) and returns either a normal completion containing unused or a throw completion. 이것은 객체의 특정 프로퍼티 값을 설정하는 데 사용된다.
value는 그 프로퍼티의 새 값이다. It performs the following steps when called:
success를 ? obj.[[Set]](propertyKey, value, obj)라고 하자.
7.3.5 CreateDataProperty ( obj, propertyKey, value )
The abstract operation CreateDataProperty takes arguments obj (an Object), propertyKey (a property key), and value (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. 이것은 객체의 새로운 own 프로퍼티를 생성하는 데 사용된다. It performs the following steps when called:
이 추상 연산은 ECMAScript 언어 할당 연산자가 생성하는 프로퍼티에
사용되는 것과 동일한 기본 속성을 가진 프로퍼티를 생성한다. 일반적으로
그 프로퍼티는 아직 존재하지 않을 것이다. 만약 이미 존재하고
configurable이 아니거나 obj가 extensible하지 않다면,
[[DefineOwnProperty]]는 false를 반환할 것이다.
7.3.6 CreateDataPropertyOrThrow ( obj, propertyKey, value )
The abstract operation CreateDataPropertyOrThrow takes arguments obj (an Object), propertyKey (a property key), and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. 이것은 객체의 새로운 own 프로퍼티를 생성하는 데 사용된다.
요청된 프로퍼티 갱신을 수행할 수 없으면 TypeError 예외를 던진다. It performs the following steps when called:
이 추상 연산은 ECMAScript 언어 할당 연산자가 생성하는 프로퍼티에
사용되는 것과 동일한 기본 속성을 가진 프로퍼티를 생성한다. 일반적으로
그 프로퍼티는 아직 존재하지 않을 것이다. 만약 이미 존재하고
configurable이 아니거나 obj가 extensible하지 않다면,
[[DefineOwnProperty]]는 false를 반환하여 이 연산이 TypeError
예외를 던지게 한다.
7.3.7 CreateNonEnumerableDataPropertyOrThrow ( obj, propertyKey, value )
The abstract operation CreateNonEnumerableDataPropertyOrThrow takes arguments obj (an Object), propertyKey (a property key), and value (an ECMAScript language value) and returns unused. 이것은 ordinary object의 새로운 non-enumerable own 프로퍼티를
생성하는 데 사용된다. It performs the following steps when called:
Assert: obj는 ordinary하고 extensible하며 non-configurable 프로퍼티를 가지지 않는 객체이다.
이 추상 연산은 ECMAScript 언어 할당 연산자가 생성하는 프로퍼티에
사용되는 것과 동일한 기본 속성을 가지되 enumerable하지 않은 프로퍼티를
생성한다. 일반적으로 그 프로퍼티는 아직 존재하지 않을 것이다.
만약 존재하더라도, DefinePropertyOrThrow는 정상적으로 완료됨이
보장된다.
The abstract operation DefinePropertyOrThrow takes arguments obj (an Object), propertyKey (a property key), and desc (a Property Descriptor) and returns either a normal completion containing unused or a throw completion. 이것은 객체의 [[DefineOwnProperty]] 내부 메서드를, 요청된
프로퍼티 갱신을 수행할 수 없으면 TypeError 예외를 던지는 방식으로
호출하는 데 사용된다. It performs the following steps when called:
success를 ? obj.[[DefineOwnProperty]](propertyKey, desc)라고 하자.
success가 false이면, TypeError 예외를 던진다.
unused를 반환한다.
7.3.9 DeletePropertyOrThrow ( obj, propertyKey )
The abstract operation DeletePropertyOrThrow takes arguments obj (an Object) and propertyKey (a property key) and returns either a normal completion containing unused or a throw completion. 이것은 객체의 특정 own 프로퍼티를 제거하는 데 사용된다.
프로퍼티가 configurable하지 않으면 예외를 던진다. It performs the following steps when called:
success를 ? obj.[[Delete]](propertyKey)라고 하자.
success가 false이면, TypeError 예외를 던진다.
unused를 반환한다.
7.3.10 GetMethod ( value, propertyKey )
The abstract operation GetMethod takes arguments value (an ECMAScript language value) and propertyKey (a property key) and returns either a normal completion containing either a function object or undefined, or a throw completion. 이것은 ECMAScript 언어 값의 특정 프로퍼티 값을 얻는 데
사용되며, 그 프로퍼티 값은 함수일 것으로 기대된다. It performs the following steps when called:
The abstract operation HasProperty takes arguments obj (an Object) and propertyKey (a property key) and returns either a normal completion containing a Boolean or a throw completion. 이것은 객체가 지정된 property key를 가진 프로퍼티를 가지는지
결정하는 데 사용된다. 그 프로퍼티는 own일 수도 있고 상속된 것일 수도
있다. It performs the following steps when called:
? obj.[[HasProperty]](propertyKey)를 반환한다.
7.3.12 HasOwnProperty ( obj, propertyKey )
The abstract operation HasOwnProperty takes arguments obj (an Object) and propertyKey (a property key) and returns either a normal completion containing a Boolean or a throw completion. 이것은 객체가 지정된 property key를 가진 own 프로퍼티를 가지는지
결정하는 데 사용된다. It performs the following steps when called:
The abstract operation Call takes arguments func (an ECMAScript language value) and thisValue (an ECMAScript language value) and optional argument argumentsList (a List of ECMAScript language values) and returns either a normal completion containing an ECMAScript language value or a throw completion. 이것은 함수 객체의 [[Call]] 내부 메서드를 호출하는 데 사용된다.
func는 함수 객체이고, thisValue는 [[Call]]의 this 값이 되는
ECMAScript 언어 값이며, argumentsList는 내부 메서드의 대응 인수에
전달되는 값이다. argumentsList가 존재하지 않으면, 새로운 빈 List가
그 값으로 사용된다. It performs the following steps when called:
argumentsList가 존재하지 않으면, argumentsList를 새로운 빈 List로 설정한다.
The abstract operation Construct takes argument constructor (a constructor) and optional arguments argumentsList (a List of ECMAScript language values) and newTarget (a constructor) and returns either a normal completion containing an Object or a throw completion. 이것은 함수 객체의 [[Construct]] 내부 메서드를 호출하는 데
사용된다. argumentsList와 newTarget은 내부 메서드의 대응 인수로
전달될 값들이다. argumentsList가 존재하지 않으면, 새로운 빈 List가
그 값으로 사용된다. newTarget이 존재하지 않으면, constructor가
그 값으로 사용된다. It performs the following steps when called:
newTarget이 존재하지 않으면, newTarget을 constructor로 설정한다.
argumentsList가 존재하지 않으면, argumentsList를 새로운 빈 List로 설정한다.
newTarget이 존재하지 않으면, 이 연산은 new F(...argumentsList)와
동등하다.
7.3.15 SetIntegrityLevel ( obj, level )
The abstract operation SetIntegrityLevel takes arguments obj (an Object) and level (sealed or frozen) and returns either a normal completion containing a Boolean or a throw completion. 이것은 객체의 own 프로퍼티 집합을 고정하는 데 사용된다. It performs the following steps when called:
status를 ? obj.[[PreventExtensions]]()라고 하자.
status가 false이면, false를 반환한다.
keys를 ? obj.[[OwnPropertyKeys]]()라고 하자.
level이 sealed이면,
keys의 각 요소 key에 대해, 다음을 수행한다.
? DefinePropertyOrThrow(obj, key, PropertyDescriptor { [[Configurable]]: false })를 수행한다.
The abstract operation TestIntegrityLevel takes arguments obj (an Object) and level (sealed or frozen) and returns either a normal completion containing a Boolean or a throw completion. 이것은 객체의 own 프로퍼티 집합이 고정되어 있는지 결정하는 데
사용된다. It performs the following steps when called:
The abstract operation CreateArrayFromList takes argument elements (a List of ECMAScript language values) and returns an Array. 이것은 elements가 제공하는 요소들을 가진 Array를 생성하는 데
사용된다. It performs the following steps when called:
The abstract operation LengthOfArrayLike takes argument obj (an Object) and returns either a normal completion containing a non-negative integer or a throw completion. 이것은 배열 유사 객체의 "length" 프로퍼티 값을 반환한다. It performs the following steps when called:
The abstract operation CreateListFromArrayLike takes argument obj (an ECMAScript language value) and optional argument validElementTypes (all or property-key) and returns either a normal completion containing a List of ECMAScript language values or a throw completion. 이것은 obj의 인덱스된 프로퍼티들이 제공하는 요소들로 구성된
List 값을 생성하는 데 사용된다. validElementTypes는 요소로 허용되는
값의 타입들을 나타낸다. It performs the following steps when called:
validElementTypes가 존재하지 않으면, validElementTypes를 all로 설정한다.
The abstract operation Invoke takes arguments value (an ECMAScript language value) and propertyKey (a property key) and optional argument argumentsList (a List of ECMAScript language values) and returns either a normal completion containing an ECMAScript language value or a throw completion. 이것은 ECMAScript 언어 값의 메서드 프로퍼티를 호출하는 데
사용된다. value는 프로퍼티 조회 지점이자 호출의 this 값 역할을
모두 한다. argumentsList는 메서드에 전달되는 인수 값들의 목록이다.
argumentsList가 존재하지 않으면, 새로운 빈 List가 그 값으로
사용된다. It performs the following steps when called:
argumentsList가 존재하지 않으면, argumentsList를 새로운 빈 List로 설정한다.
The abstract operation OrdinaryHasInstance takes arguments constructor (an ECMAScript language value) and instance (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. 이것은 instance가 constructor가 제공하는 인스턴스 객체 상속
경로를 상속하는지를 결정하는 기본 알고리즘을 구현한다. It performs the following steps when called:
The abstract operation SpeciesConstructor takes arguments obj (an Object) and defaultConstructor (a constructor) and returns either a normal completion containing a constructor or a throw completion. 이것은 obj에서 파생되는 새 객체를 생성하는 데 사용되어야 할
생성자를 검색하는 데 사용된다. defaultConstructor는 obj에서부터
시작해 생성자 %Symbol.species% 프로퍼티를 찾을 수 없을 때 사용할
생성자이다. It performs the following steps when called:
The abstract operation EnumerableOwnProperties takes arguments obj (an Object) and kind (key, value, or key+value) and returns either a normal completion containing a List of ECMAScript language values or a throw completion. It performs the following steps when called:
The abstract operation CopyDataProperties takes arguments target (an Object), source (an ECMAScript language value), and excludedItems (a List of property keys) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:
여기에 전달되는 target은 항상 새로 생성된 객체이며, 오류가 던져지는
경우 직접 접근할 수 없다.
7.3.26 PrivateElementFind ( obj, privateName )
The abstract operation PrivateElementFind takes arguments obj (an Object) and privateName (a Private Name) and returns a PrivateElement or empty. It performs the following steps when called:
7.3.27 PrivateFieldAdd ( obj, privateName, value )
The abstract operation PrivateFieldAdd takes arguments obj (an Object), privateName (a Private Name), and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:
The abstract operation PrivateMethodOrAccessorAdd takes arguments obj (an Object) and method (a PrivateElement) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:
Assert: method.[[Kind]]는 method 또는 accessor 중 하나이다.
private method와 accessor의 값은 인스턴스 간에 공유된다.
이 연산은 method나 accessor의 새 복사본을 생성하지 않는다.
7.3.29 HostEnsureCanAddPrivateElement ( obj )
The host-defined abstract operation HostEnsureCanAddPrivateElement takes argument obj (an Object) and returns either a normal completion containing unused or a throw completion. 이것은 호스트 환경이 특정 호스트 정의exotic object에 private
element를 추가하는 것을 막을 수 있게 한다.
HostEnsureCanAddPrivateElement의 구현은 다음 요구 사항을 준수해야 한다.
The abstract operation PrivateGet takes arguments obj (an Object) and privateName (a Private Name) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:
The abstract operation PrivateSet takes arguments obj (an Object), privateName (a Private Name), and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:
The abstract operation DefineField takes arguments receiver (an Object) and fieldRecord (a ClassFieldDefinition Record) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:
The abstract operation InitializeInstanceElements takes arguments obj (an Object) and constructor (an ECMAScript function object or a built-in function object) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:
7.3.34 AddValueToKeyedGroup ( groups, key, value )
The abstract operation AddValueToKeyedGroup takes arguments groups (a List of Records with fields [[Key]] (an ECMAScript language value) and [[Elements]] (a List of ECMAScript language values)), key (an ECMAScript language value), and value (an ECMAScript language value) and returns unused. It performs the following steps when called:
groups의 각 Record { [[Key]], [[Elements]] } group에 대해, 다음을 수행한다.
group을 Record { [[Key]]: key, [[Elements]]: « value » }라고 하자.
group을 groups에 추가한다.
unused를 반환한다.
7.3.35 GroupBy ( items, callback, keyCoercion )
The abstract operation GroupBy takes arguments items (an ECMAScript language value), callback (an ECMAScript language value), and keyCoercion (property or collection) and returns either a normal completion containing a List of Records with fields [[Key]] (an ECMAScript language value) and [[Elements]] (a List of ECMAScript language values), or a throw completion. It performs the following steps when called:
The abstract operation GetOptionsObject takes argument options (an ECMAScript language value) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:
7.3.37 SetterThatIgnoresPrototypeProperties ( thisValue, home, propertyKey, value )
The abstract operation SetterThatIgnoresPrototypeProperties takes arguments thisValue (an ECMAScript language value), home (an Object), propertyKey (a property key), and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:
The abstract operation GetIteratorDirect takes argument obj (an Object) and returns either a normal completion containing an Iterator Record or a throw completion. It performs the following steps when called:
iteratorRecord를 Iterator Record { [[Iterator]]: obj, [[NextMethod]]: nextMethod, [[Done]]: false }라고 하자.
iteratorRecord를 반환한다.
7.4.3 GetIteratorFromMethod ( obj, method )
The abstract operation GetIteratorFromMethod takes arguments obj (an ECMAScript language value) and method (a function object) and returns either a normal completion containing an Iterator Record or a throw completion. It performs the following steps when called:
The abstract operation GetIterator takes arguments obj (an ECMAScript language value) and kind (sync or async) and returns either a normal completion containing an Iterator Record or a throw completion. It performs the following steps when called:
The abstract operation GetIteratorFlattenable takes arguments obj (an ECMAScript language value) and primitiveHandling (iterate-string-primitives or reject-primitives) and returns either a normal completion containing an Iterator Record or a throw completion. It performs the following steps when called:
The abstract operation IteratorNext takes argument iteratorRecord (an Iterator Record) and optional argument value (an ECMAScript language value) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:
value가 존재하지 않으면,
result를 Completion(Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]]))라고 하자.
그렇지 않으면,
result를 Completion(Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]], « value »))라고 하자.
The abstract operation IteratorComplete takes argument iteratorResult (an Object) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
The abstract operation IteratorValue takes argument iteratorResult (an Object) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:
The abstract operation IteratorStep takes argument iteratorRecord (an Iterator Record) and returns either a normal completion containing either an Object or done, or a throw completion. 이것은 iteratorRecord.[[Iterator]]로부터 다음 값을 요청하기 위해
iteratorRecord.[[NextMethod]]를 호출하고, iterator가 끝에 도달했음을
나타내는 done 또는 다음 값이 사용 가능하다면 IteratorResult 객체를
반환한다. It performs the following steps when called:
The abstract operation IteratorStepValue takes argument iteratorRecord (an Iterator Record) and returns either a normal completion containing either an ECMAScript language value or done, or a throw completion. 이것은 iteratorRecord.[[Iterator]]로부터 다음 값을 요청하기 위해
iteratorRecord.[[NextMethod]]를 호출하고, iterator가 끝에 도달했음을
나타내는 done 또는 다음 값이 사용 가능하다면 IteratorResult 객체의
값을 반환한다. It performs the following steps when called:
The abstract operation IteratorClose takes arguments iteratorRecord (an Iterator Record) and completion (a Completion Record) and returns a Completion Record. 이것은 iterator에게, 완료 상태에 도달했을 때 통상 수행했을
동작을 수행해야 함을 알리는 데 사용된다. It performs the following steps when called:
The abstract operation AsyncIteratorClose takes arguments iteratorRecord (an Iterator Record) and completion (a Completion Record) and returns a Completion Record. 이것은 async iterator에게, 완료 상태에 도달했을 때 통상 수행했을
동작을 수행해야 함을 알리는 데 사용된다. It performs the following steps when called:
The abstract operation CreateIteratorResultObject takes arguments value (an ECMAScript language value) and done (a Boolean) and returns an Object that conforms to the IteratorResult interface. 이것은 IteratorResult 인터페이스에 부합하는 객체를 생성한다. It performs the following steps when called:
The abstract operation CreateListIteratorRecord takes argument list (a List of ECMAScript language values) and returns an Iterator Record. 이것은 [[NextMethod]]가 list의 연속된 요소를 반환하는 Iterator
Record를 생성한다. It performs the following steps when called:
closure를, 매개변수가 없고 list를 캡처하며 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure라고 하자.
"*default*"는 이 명세에서, 모듈의 기본 export가 다른 이름을
가지지 않을 때 그 기본 export를 위한 합성 이름으로 사용된다.
모듈의 [[Environment]] 안에는 그 이름으로 엔트리가 생성되어 대응하는
값을 보관하며, 그 모듈에 대해
ResolveExport ( exportName [ , resolveSet ] )를 호출하여
"default"라는 이름의 export를 해석하면 [[BindingName]]이
"*default*"인 ResolvedBinding Record를 반환하게 되고, 이는 다시
모듈의 [[Environment]] 안에서 위에서 언급한 값으로 해석된다.
이것은 익명 기본 export도 다른 export와 마찬가지로 해석될 수 있게
하기 위한, 순전히 명세 편의상의 처리이다. 이 "*default*" 문자열은
ECMAScript 코드나 모듈 링크 알고리즘에서 결코 접근할 수 없다.
It is defined piecewise over the following productions:
export defaultAssignmentExpression을 상수 선언으로 취급할
필요는 없다. 왜냐하면 모듈의 기본 객체를 참조하는 데 사용되는 내부
바운드 이름에 할당을 허용하는 구문이 없기 때문이다.
8.2.4 Static Semantics: LexicallyDeclaredNames
The syntax-directed operation LexicallyDeclaredNames takes no arguments and returns a List of Strings. It is defined piecewise over the following productions:
The syntax-directed operation LexicallyScopedDeclarations takes no arguments and returns a List of Parse Nodes. It is defined piecewise over the following productions:
The syntax-directed operation VarDeclaredNames takes no arguments and returns a List of Strings. It is defined piecewise over the following productions:
The syntax-directed operation VarScopedDeclarations takes no arguments and returns a List of Parse Nodes. It is defined piecewise over the following productions:
The syntax-directed operation TopLevelLexicallyDeclaredNames takes no arguments and returns a List of Strings. It is defined piecewise over the following productions:
The syntax-directed operation TopLevelLexicallyScopedDeclarations takes no arguments and returns a List of Parse Nodes. It is defined piecewise over the following productions:
The syntax-directed operation TopLevelVarDeclaredNames takes no arguments and returns a List of Strings. It is defined piecewise over the following productions:
The syntax-directed operation TopLevelVarScopedDeclarations takes no arguments and returns a List of Parse Nodes. It is defined piecewise over the following productions:
The syntax-directed operation ContainsDuplicateLabels takes argument labelSet (a List of Strings) and returns a Boolean. It is defined piecewise over the following productions:
The syntax-directed operation ContainsUndefinedBreakTarget takes argument labelSet (a List of Strings) and returns a Boolean. It is defined piecewise over the following productions:
The syntax-directed operation ContainsUndefinedContinueTarget takes arguments iterationSet (a List of Strings) and labelSet (a List of Strings) and returns a Boolean. It is defined piecewise over the following productions:
The abstract operation IsAnonymousFunctionDefinition takes argument expr (an AssignmentExpression Parse Node, an Initializer Parse Node, or an Expression Parse Node) and returns a Boolean. 이것은 자신의 인수가 이름을 바인딩하지 않는 함수 정의인지
결정한다. It performs the following steps when called:
The syntax-directed operation ComputedPropertyContains takes argument symbol (a grammar symbol) and returns a Boolean. It is defined piecewise over the following productions:
The syntax-directed operation InstantiateFunctionObject takes arguments env (an Environment Record) and privateEnv (a PrivateEnvironment Record or null) and returns an ECMAScript function object. It is defined piecewise over the following productions:
The syntax-directed operation BindingInitialization takes arguments value (an ECMAScript language value) and environment (an Environment Record or undefined) and returns either a normal completion containing unused or an abrupt completion.
Note
environment에 undefined가 전달되면, 초기화 값을 할당하기 위해
PutValue 연산을 사용해야 함을 나타낸다. 이는 var 문과 일부 non-strict
함수의 형식 매개변수 목록의 경우이다
(참조 10.2.11).
이런 경우에는 lexical binding이 hoist되고, initializer 평가 전에
사전 초기화된다.
It is defined piecewise over the following productions:
The abstract operation InitializeBoundName takes arguments name (a String), value (an ECMAScript language value), and environment (an Environment Record or undefined) and returns either a normal completion containing unused or an abrupt completion. It performs the following steps when called:
environment에 undefined가 전달되면, 초기화 값을 할당하기 위해
PutValue 연산을 사용해야 함을 나타낸다. 이는 non-strict 함수의 형식
매개변수 목록의 경우이다. 이 경우에는 같은 이름의 매개변수가 여러 개
있을 가능성을 처리하기 위해 형식 매개변수 바인딩이 사전 초기화된다.
It is defined piecewise over the following productions:
The syntax-directed operation AssignmentTargetType takes no arguments and returns simple, web-compat, or invalid. It is defined piecewise over the following productions:
Environment Record는 ECMAScript 코드의 어휘적 중첩 구조를 바탕으로 Identifier를 특정 변수 및 함수와 연관시키는 것을 정의하는 데 사용되는 명세 타입이다. 보통 Environment Record는 FunctionDeclaration, BlockStatement, 또는 TryStatement의 Catch 절과 같은 ECMAScript 코드의 특정 구문 구조와 연관된다. 이러한 코드가 평가될 때마다, 해당 코드에 의해 생성되는 식별자 바인딩을 기록하기 위해 새로운 Environment Record가 생성된다.
모든 Environment Record는 [[OuterEnv]] 필드를 가지며, 그 값은 null 또는 바깥쪽 Environment Record에 대한 참조이다. 이것은 Environment Record 값들의 논리적 중첩을 모델링하는 데 사용된다. 어떤 (안쪽) Environment Record의 outer reference는 그 안쪽 Environment Record를 논리적으로 둘러싸는 Environment Record에 대한 참조이다. 바깥쪽 Environment Record는 물론 자기 자신의 바깥쪽 Environment Record를 가질 수 있다. 하나의 Environment Record는 여러 안쪽 Environment Record의 outer environment 역할을 할 수 있다. 예를 들어, FunctionDeclaration이 두 개의 중첩된 FunctionDeclaration을 포함한다면, 각 중첩 함수의 Environment Record는 둘러싸고 있는 함수의 현재 평가에 대한 Environment Record를 자신의 outer Environment Record로 가진다.
Environment Record는 순전히 명세 메커니즘이며, ECMAScript 구현의 어떤 특정 산출물과 대응할 필요는 없다. ECMAScript 프로그램이 이러한 값에 직접 접근하거나 조작하는 것은 불가능하다.
Function Environment Record는 ECMAScript 함수 객체의 호출에 대응하며, 그 함수 내부의 최상위 선언에 대한 바인딩을 포함한다. 이는 새로운 this 바인딩을 설정할 수 있다. 또한 super 메서드 호출을 지원하는 데 필요한 상태도 포착한다.
Global Environment Record는 Script의 전역 선언에 사용된다. 이것은 바깥 환경을 가지지 않으며, 그 [[OuterEnv]]는 null이다. 식별자 바인딩으로 미리 채워질 수 있으며, 그 프로퍼티가 전역 환경의 일부 식별자 바인딩을 제공하는 연관된 전역 객체를 포함한다. ECMAScript 코드가 실행됨에 따라 추가 프로퍼티가 전역 객체에 추가될 수 있고 초기 프로퍼티가 수정될 수 있다.
Environment Record 추상 클래스는 Table 14에 정의된 추상 명세 메서드를 포함한다. 이 추상 메서드들은 각 구체적 서브클래스에 대해 서로 다른 구체 알고리즘을 가진다.
The abstract method CreateMutableBinding takes arguments name (a String) and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion.
이것은 Environment Record 안에 초기화되지 않은 새로운 가변 바인딩을 생성한다. name은 바인딩된 이름의 텍스트이다. deletable이 true이면 그 바인딩은 이후 삭제될 수 있다.
The abstract method CreateImmutableBinding takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing unused or a throw completion.
이것은 Environment Record 안에 초기화되지 않은 새로운 불변 바인딩을 생성한다. name은 바인딩된 이름의 텍스트이다. strict이 true이면, 그것이 초기화된 후 값을 설정하려는 시도는 그 바인딩을 참조하는 연산의 strict mode 설정과 관계없이 항상 예외를 던진다.
The abstract method InitializeBinding takes arguments name (a String) and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion.
이것은 Environment Record 안에 이미 존재하지만 아직 초기화되지 않은 바인딩의 값을 설정한다. name은 바인딩된 이름의 텍스트이다. value는 그 바인딩에 대한 값이다.
The abstract method SetMutableBinding takes arguments name (a String), value (an ECMAScript language value), and strict (a Boolean) and returns either a normal completion containing unused or a throw completion.
이것은 Environment Record 안에 이미 존재하는 가변 바인딩의 값을 설정한다. name은 바인딩된 이름의 텍스트이다. value는 그 바인딩에 대한 값이다. strict이 true이고 바인딩을 설정할 수 없으면, 이것은 TypeError 예외를 던진다.
The abstract method GetBindingValue takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion.
이것은 Environment Record에서 이미 존재하는 바인딩의 값을 반환한다. name은 바인딩된 이름의 텍스트이다. strict은 strict mode 코드에서 유래한 참조이거나 그 밖에 strict mode 참조 의미론을 요구하는 참조를 식별하는 데 사용된다. strict이 true이고 바인딩이 존재하지 않으면, 이것은 ReferenceError 예외를 던진다. 바인딩이 존재하지만 초기화되지 않았다면, strict의 값과 관계없이 ReferenceError가 던져진다.
The abstract method DeleteBinding takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion.
이것은 Environment Record에서 바인딩을 삭제한다. name은 바인딩된 이름의 텍스트이다. name에 대한 바인딩이 존재하면, 이것은 그 바인딩을 제거하고 true를 반환한다. 바인딩이 존재하지만 제거할 수 없으면, 이것은 false를 반환한다. 바인딩이 존재하지 않으면, 이것은 true를 반환한다.
The abstract method GetThisBinding takes no arguments and returns either a normal completion containing an ECMAScript language value or a throw completion.
이것은 이 Environment Record의 this 바인딩 값을 반환한다. this 바인딩이 초기화되지 않았다면 ReferenceError를 던진다.
각 Declarative Environment Record는 변수, 상수, let, class, module, import 및/또는 함수 선언을 포함하는 ECMAScript 프로그램 스코프와 연관된다. Declarative Environment Record는 그 스코프 안에 포함된 선언들이 정의하는 식별자 집합을 바인딩한다.
9.1.1.1.1 HasBinding ( name )
The HasBinding concrete method of a Declarative Environment RecordenvRec takes argument name (a String) and returns a normal completion containing a Boolean. 이것은 인수 식별자가 record에 의해 바인딩된 식별자들 중 하나인지 결정한다. It performs the following steps when called:
The CreateMutableBinding concrete method of a Declarative Environment RecordenvRec takes arguments name (a String) and deletable (a Boolean) and returns a normal completion containing unused. 이것은 name이라는 이름에 대해 초기화되지 않은 새로운 가변 바인딩을 생성한다. 이 Environment Record 안에는 name에 대한 바인딩이 이미 존재해서는 안 된다. deletable이 true이면, 새 바인딩은 삭제 가능 대상으로 표시된다. It performs the following steps when called:
envRec 안에 name에 대한 가변 바인딩을 생성하고, 그것이 초기화되지 않았음을 기록한다. deletable이 true이면, 새로 생성된 바인딩이 이후 DeleteBinding 호출에 의해 삭제될 수 있음을 기록한다.
unused를 반환한다.
9.1.1.1.3 CreateImmutableBinding ( name, strict )
The CreateImmutableBinding concrete method of a Declarative Environment RecordenvRec takes arguments name (a String) and strict (a Boolean) and returns a normal completion containing unused. 이것은 name이라는 이름에 대해 초기화되지 않은 새로운 불변 바인딩을 생성한다. 이 Environment Record 안에는 name에 대한 바인딩이 이미 존재해서는 안 된다. strict이 true이면, 새 바인딩은 strict 바인딩으로 표시된다. It performs the following steps when called:
envRec 안에 name에 대한 불변 바인딩을 생성하고, 그것이 초기화되지 않았음을 기록한다. strict이 true이면, 새로 생성된 바인딩이 strict 바인딩임을 기록한다.
unused를 반환한다.
9.1.1.1.4 InitializeBinding ( name, value )
The InitializeBinding concrete method of a Declarative Environment RecordenvRec takes arguments name (a String) and value (an ECMAScript language value) and returns a normal completion containing unused. 이것은 이름이 name인 식별자의 현재 바인딩 값으로 value를 설정하는 데 사용된다. name에 대한 초기화되지 않은 바인딩이 이미 존재해야 한다. It performs the following steps when called:
Assert: envRec는 name에 대한 초기화되지 않은 바인딩을 가지고 있어야 한다.
The SetMutableBinding concrete method of a Declarative Environment RecordenvRec takes arguments name (a String), value (an ECMAScript language value), and strict (a Boolean) and returns either a normal completion containing unused or a throw completion. 이것은 이름이 name인 식별자의 현재 바인딩 값을 value로 바꾸려 시도한다. 보통 name에 대한 바인딩은 이미 존재하지만, 드물게는 존재하지 않을 수도 있다. 바인딩이 불변 바인딩이면, strict이 true일 때 TypeError가 던져진다. It performs the following steps when called:
functionf() { eval("var x; x = (delete x, 0);"); }
9.1.1.1.6 GetBindingValue ( name, strict )
The GetBindingValue concrete method of a Declarative Environment RecordenvRec takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion. 이것은 이름이 name인 바인딩된 식별자의 값을 반환한다. 바인딩이 존재하지만 초기화되지 않았다면, strict의 값과 관계없이 ReferenceError가 던져진다. It performs the following steps when called:
envRec 안의 name에 대한 바인딩이 초기화되지 않은 바인딩이면, ReferenceError 예외를 던진다.
envRec 안에서 현재 name에 바인딩된 값을 반환한다.
9.1.1.1.7 DeleteBinding ( name )
The DeleteBinding concrete method of a Declarative Environment RecordenvRec takes argument name (a String) and returns a normal completion containing a Boolean. 이것은 명시적으로 삭제 가능 대상으로 지정된 바인딩만 삭제할 수 있다. It performs the following steps when called:
각 Object Environment Record는 자신의 binding object라고 불리는 객체와 연관된다. Object Environment Record는 자신의 binding object의 프로퍼티 이름과 직접 대응하는 문자열 식별자 이름들의 집합을 바인딩한다. IdentifierName 형태의 문자열이 아닌 프로퍼티 키는 바인딩된 식별자 집합에 포함되지 않는다. own 프로퍼티와 상속된 프로퍼티는 [[Enumerable]] 속성의 설정과 관계없이 모두 집합에 포함된다. 객체에는 프로퍼티가 동적으로 추가되거나 삭제될 수 있으므로, Object Environment Record에 의해 바인딩되는 식별자 집합은 프로퍼티를 추가하거나 삭제하는 어떤 연산의 부작용으로 잠재적으로 변할 수 있다. 그러한 부작용의 결과로 생성되는 모든 바인딩은, 대응하는 프로퍼티의 Writable 속성이 false이더라도, 가변 바인딩으로 간주된다. 불변 바인딩은 Object Environment Record에는 존재하지 않는다.
with 문(14.11)을 위해 생성된 Object Environment Record는 함수 호출에 사용될 암묵적 this 값으로 자신의 binding object를 제공할 수 있다. 이 기능은 Boolean [[IsWithEnvironment]] 필드로 제어된다.
Object Environment Record는 Table 15에 나열된 추가 상태 필드를 가진다.
The HasBinding concrete method of an Object Environment RecordenvRec takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion. 이것은 연관된 binding object가 이름이 name인 프로퍼티를 가지는지 결정한다. It performs the following steps when called:
bindingObject를 envRec.[[BindingObject]]라고 하자.
foundBinding을 ? HasProperty(bindingObject, name)이라고 하자.
The CreateMutableBinding concrete method of an Object Environment RecordenvRec takes arguments name (a String) and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion. 이것은 Environment Record와 연관된 binding object에 이름이 name인 프로퍼티를 만들고 그 값을 undefined로 초기화한다. deletable이 true이면 새 프로퍼티의 [[Configurable]] 속성은 true로 설정되고, 그렇지 않으면 false로 설정된다. It performs the following steps when called:
The InitializeBinding concrete method of an Object Environment RecordenvRec takes arguments name (a String) and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. 이것은 이름이 name인 식별자의 현재 바인딩 값을 value로 설정하는 데 사용된다. It performs the following steps when called:
The SetMutableBinding concrete method of an Object Environment RecordenvRec takes arguments name (a String), value (an ECMAScript language value), and strict (a Boolean) and returns either a normal completion containing unused or a throw completion. 이것은 Environment Record와 연관된 binding object에서 이름이 name인 프로퍼티의 값을 value로 설정하려 시도한다. 이름이 name인 프로퍼티는 보통 이미 존재하지만, 존재하지 않거나 현재 writable하지 않은 경우 오류 처리는 strict에 의해 결정된다. It performs the following steps when called:
bindingObject를 envRec.[[BindingObject]]라고 하자.
stillExists를 ? HasProperty(bindingObject, name)라고 하자.
The GetBindingValue concrete method of an Object Environment RecordenvRec takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion. 이것은 연관된 binding object에서 이름이 name인 프로퍼티의 값을 반환한다. 그 프로퍼티는 보통 이미 존재해야 하지만, 존재하지 않는 경우 결과는 strict에 따라 달라진다. It performs the following steps when called:
The DeleteBinding concrete method of an Object Environment RecordenvRec takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion. 이것은 환경 객체의 [[Configurable]] 속성이 true인 프로퍼티에 대응하는 바인딩만 삭제할 수 있다. It performs the following steps when called:
The WithBaseObject concrete method of an Object Environment RecordenvRec takes no arguments and returns an Object or undefined. It performs the following steps when called:
Function Environment Record는 함수의 최상위 스코프를 나타내는 데 사용되는 Declarative Environment Record이며, 함수가 ArrowFunction이 아니면 this 바인딩을 제공한다. 함수가 ArrowFunction 함수가 아니고 super를 참조하면, 그 Function Environment Record는 함수 내부에서 super 메서드 호출을 수행하는 데 사용되는 상태도 포함한다.
Function Environment Record는 Table 16에 나열된 추가 상태 필드를 가진다.
The abstract operation BindThisValue takes arguments envRec (a Function Environment Record) and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. 이것은 envRec.[[ThisValue]]를 설정하고 그것이 초기화되었음을 기록한다. It performs the following steps when called:
Assert: envRec.[[ThisBindingStatus]]는 lexical이 아니다.
The abstract operation GetSuperBase takes argument envRec (a Function Environment Record) and returns an Object, null, or undefined. 이것은 envRec 안에 바인딩된 super 프로퍼티 접근의 기반 객체를 반환한다. 값 undefined는 그러한 접근이 런타임 오류를 발생시킬 것임을 나타낸다. It performs the following steps when called:
home을 envRec.[[FunctionObject]].[[HomeObject]]라고 하자.
Global Environment Record는 공통 realm에서 처리되는 모든 ECMAScript Script 요소가 공유하는 가장 바깥쪽 스코프를 나타내는 데 사용된다. Global Environment Record는 내장 전역(clause 19), 전역 객체의 프로퍼티, 그리고 Script 내부에 나타나는 모든 최상위 선언(8.2.9, 8.2.11)에 대한 바인딩을 제공한다.
The HasBinding concrete method of a Global Environment RecordenvRec takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion. 이것은 인수 식별자가 record에 의해 바인딩된 식별자들 중 하나인지 결정한다. It performs the following steps when called:
declarativeRecord를 envRec.[[DeclarativeRecord]]라고 하자.
The CreateMutableBinding concrete method of a Global Environment RecordenvRec takes arguments name (a String) and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion. 이것은 name이라는 이름에 대해 초기화되지 않은 새로운 가변 바인딩을 생성한다. 그 바인딩은 연관된 DeclarativeRecord 안에 생성된다. DeclarativeRecord 안에는 name에 대한 바인딩이 이미 존재해서는 안 된다. deletable이 true이면, 새 바인딩은 삭제 가능 대상으로 표시된다. It performs the following steps when called:
declarativeRecord를 envRec.[[DeclarativeRecord]]라고 하자.
The CreateImmutableBinding concrete method of a Global Environment RecordenvRec takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing unused or a throw completion. 이것은 name이라는 이름에 대해 초기화되지 않은 새로운 불변 바인딩을 생성한다. 이 Environment Record 안에는 name에 대한 바인딩이 이미 존재해서는 안 된다. strict이 true이면, 새 바인딩은 strict 바인딩으로 표시된다. It performs the following steps when called:
declarativeRecord를 envRec.[[DeclarativeRecord]]라고 하자.
The InitializeBinding concrete method of a Global Environment RecordenvRec takes arguments name (a String) and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. 이것은 이름이 name인 식별자의 현재 바인딩 값을 value로 설정하는 데 사용된다. name에 대한 초기화되지 않은 바인딩이 이미 존재해야 한다. It performs the following steps when called:
declarativeRecord를 envRec.[[DeclarativeRecord]]라고 하자.
The SetMutableBinding concrete method of a Global Environment RecordenvRec takes arguments name (a String), value (an ECMAScript language value), and strict (a Boolean) and returns either a normal completion containing unused or a throw completion. 이것은 이름이 name인 식별자의 현재 바인딩 값을 value로 바꾸려 시도한다. 바인딩이 불변 바인딩이고 strict이 true이면, TypeError가 던져진다. 이름이 name인 바인딩은 보통 이미 존재하지만, 존재하지 않거나 현재 writable하지 않은 경우 오류 처리는 strict에 의해 결정된다. It performs the following steps when called:
declarativeRecord를 envRec.[[DeclarativeRecord]]라고 하자.
The GetBindingValue concrete method of a Global Environment RecordenvRec takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion. 이것은 이름이 name인 바인딩된 식별자의 값을 반환한다. 바인딩이 초기화되지 않은 바인딩이면, ReferenceError 예외를 던진다. 이름이 name인 바인딩은 보통 이미 존재하지만, 존재하지 않거나 현재 writable하지 않은 경우 오류 처리는 strict에 의해 결정된다. It performs the following steps when called:
declarativeRecord를 envRec.[[DeclarativeRecord]]라고 하자.
The WithBaseObject concrete method of a Global Environment RecordenvRec takes no arguments and returns undefined. It performs the following steps when called:
undefined를 반환한다.
9.1.1.4.12 HasLexicalDeclaration ( envRec, name )
The abstract operation HasLexicalDeclaration takes arguments envRec (a Global Environment Record) and name (a String) and returns a Boolean. 이것은 인수 식별자가 LexicalDeclaration이나 ClassDeclaration과 같은 lexical declaration을 사용해 envRec 안에 생성된 바인딩을 가지는지 결정한다. It performs the following steps when called:
declarativeRecord를 envRec.[[DeclarativeRecord]]라고 하자.
9.1.1.4.13 HasRestrictedGlobalProperty ( envRec, name )
The abstract operation HasRestrictedGlobalProperty takes arguments envRec (a Global Environment Record) and name (a String) and returns either a normal completion containing a Boolean or a throw completion. 이것은 인수 식별자가 전역 lexical 바인딩에 의해 가려져서는 안 되는 전역 객체의 프로퍼티 이름인지 결정한다. It performs the following steps when called:
objectRecord를 envRec.[[ObjectRecord]]라고 하자.
globalObject를 objectRecord.[[BindingObject]]라고 하자.
existingProp를 ? globalObject.[[GetOwnProperty]](name)라고 하자.
전역 객체에는 var 또는 함수 선언을 사용해 선언된 것이 아니라 직접 생성된 프로퍼티가 존재할 수 있다. 전역 lexical 바인딩은 전역 객체의 non-configurable 프로퍼티와 같은 이름으로 생성될 수 없다. 전역 프로퍼티 "undefined"는 그러한 프로퍼티의 예이다.
9.1.1.4.14 CanDeclareGlobalVar ( envRec, name )
The abstract operation CanDeclareGlobalVar takes arguments envRec (a Global Environment Record) and name (a String) and returns either a normal completion containing a Boolean or a throw completion. 이것은 동일한 인수 name에 대해 대응하는 CreateGlobalVarBinding 호출이 수행된다면 성공할지를 결정한다. 중복 var 선언과 기존 전역 객체 프로퍼티에 대한 var 선언은 허용된다. It performs the following steps when called:
objectRecord를 envRec.[[ObjectRecord]]라고 하자.
globalObject를 objectRecord.[[BindingObject]]라고 하자.
The abstract operation CreateGlobalVarBinding takes arguments envRec (a Global Environment Record), name (a String), and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion. 이것은 연관된 Object Environment Record 안에 가변 바인딩을 생성하고 초기화한다. 바인딩이 이미 존재하면, 그것을 재사용하며 이미 초기화된 것으로 간주한다. It performs the following steps when called:
objectRecord를 envRec.[[ObjectRecord]]라고 하자.
globalObject를 objectRecord.[[BindingObject]]라고 하자.
The abstract operation CreateGlobalFunctionBinding takes arguments envRec (a Global Environment Record), name (a String), value (an ECMAScript function object), and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion. 이것은 연관된 Object Environment Record 안에 가변 바인딩을 생성하고 초기화한다. 바인딩이 이미 존재하면, 그것을 교체한다. It performs the following steps when called:
objectRecord를 envRec.[[ObjectRecord]]라고 하자.
globalObject를 objectRecord.[[BindingObject]]라고 하자.
existingProp를 ? globalObject.[[GetOwnProperty]](name)라고 하자.
전역 함수 선언은 항상 전역 객체의 own 프로퍼티로 표현된다. 가능하다면 기존 own 프로퍼티는 표준 속성 값 집합을 가지도록 재구성된다. 단계 7는 InitializeBinding 구체 메서드를 호출했을 때 하는 일과 동등하며, globalObject가 Proxy라면 같은 순서의 Proxy trap 호출을 발생시킨다.
9.1.1.5 Module Environment Record
Module Environment Record는 ECMAScript Module의 바깥 스코프를 나타내는 데 사용되는 Declarative Environment Record이다. 일반적인 가변 및 불변 바인딩에 더해, Module Environment Record는 불변 import 바인딩도 제공하는데, 이것은 다른 Environment Record에 존재하는 대상 바인딩에 대한 간접 접근을 제공하는 바인딩이다.
The GetBindingValue concrete method of a Module Environment RecordenvRec takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion. 이것은 이름이 name인 바인딩된 식별자의 값을 반환한다. 그러나 바인딩이 간접 바인딩이면, 대상 바인딩의 값을 반환한다. 바인딩이 존재하지만 초기화되지 않았다면 ReferenceError가 던져진다. It performs the following steps when called:
The abstract operation CreateImportBinding takes arguments envRec (a Module Environment Record), name (a String), targetModule (a Module Record), and targetName (a String) and returns unused. 이것은 이름 name에 대해 초기화된 새로운 불변 간접 바인딩을 생성한다. envRec 안에는 name에 대한 바인딩이 이미 존재해서는 안 된다. targetName은 targetModule의 Module Environment Record 안에 존재하는 바인딩의 이름이다. 새 바인딩 값에 대한 접근은 대상 바인딩의 바인딩된 값에 간접적으로 접근하게 된다. It performs the following steps when called:
The abstract operation GetIdentifierReference takes arguments env (an Environment Record or null), name (a String), and strict (a Boolean) and returns either a normal completion containing a Reference Record or a throw completion. It performs the following steps when called:
The abstract operation NewDeclarativeEnvironment takes argument outerEnv (an Environment Record or null) and returns a Declarative Environment Record. It performs the following steps when called:
The abstract operation NewObjectEnvironment takes arguments obj (an Object), isWithEnvironment (a Boolean), and outerEnv (an Environment Record or null) and returns an Object Environment Record. It performs the following steps when called:
The abstract operation NewFunctionEnvironment takes arguments func (an ECMAScript function object) and newTarget (an Object or undefined) and returns a Function Environment Record. It performs the following steps when called:
그렇지 않으면, env.[[ThisBindingStatus]]를 uninitialized로 설정한다.
env.[[NewTarget]]를 newTarget으로 설정한다.
env.[[OuterEnv]]를 func.[[Environment]]로 설정한다.
env를 반환한다.
9.1.2.5 NewGlobalEnvironment ( obj, thisValue )
The abstract operation NewGlobalEnvironment takes arguments obj (an Object) and thisValue (an Object) and returns a Global Environment Record. It performs the following steps when called:
The abstract operation ResolvePrivateIdentifier takes arguments privateEnv (a PrivateEnvironment Record) and identifier (a String) and returns a Private Name. It performs the following steps when called:
평가되기 전에, 모든 ECMAScript 코드는 반드시 realm과 연관되어야 한다. 개념적으로 realm은 intrinsic object들의 집합, ECMAScript 전역 환경, 그 전역 환경의 범위 안에서 로드된 모든 ECMAScript 코드, 그리고 다른 연관된 상태 및 자원으로 구성된다.
realm은 이 명세에서 Table 19에 명시된 필드를 가진 Realm Record로 표현된다:
템플릿 객체는 각 realm의 Realm Record의 [[TemplateMap]]을 사용해 별도로 canonicalize된다. 각 [[Site]] 값은 TemplateLiteral인 Parse Node이다. 연관된 [[Array]] 값은 tag 함수에 전달되는 대응 템플릿 객체이다.
Note 1
어떤 Parse Node가 도달 불가능해지면, 대응하는 [[Array]]도 역시 도달 불가능해지며, 구현이 그 쌍을 [[TemplateMap]] 리스트에서 제거하더라도 관찰 불가능하다.
The abstract operation InitializeHostDefinedRealm takes no arguments and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:
Table 6에 나열된 값으로 realmRec.[[Intrinsics]]의 필드를 설정한다. 필드 이름은 표의 “Intrinsic Name” 열에 나열된 이름들이다. 각 필드의 값은 19부터 28까지의 절에서 각 객체의 명세에 따라 완전하고 재귀적으로 프로퍼티 값이 채워진 새로운 객체 값이다. 모든 객체 프로퍼티 값은 새로 생성된 객체 값이다. 내장 함수 객체인 모든 값은, steps가 이 명세에 제공된 그 함수의 정의이고, name이 함수의 "name" 프로퍼티의 초기값이며, length가 함수의 "length" 프로퍼티의 초기값이고, slots가 함수의 명시된 internal slot 이름들의 리스트(있다면)이며, prototype이 함수의 [[Prototype]] internal slot의 명시된 값이고, async가 함수가 “async”로 설명되는 경우 true 아니면 false일 때, CreateBuiltinFunction(steps, length, name, slots, realmRec, prototype, async)를 수행함으로써 생성된다. intrinsic 및 그 프로퍼티의 생성은 아직 생성되지 않은 객체에 대한 의존성을 피할 수 있도록 순서가 정해져야 한다.
The abstract operation SetDefaultGlobalBindings takes argument realmRec (a Realm Record) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:
desc를 그 프로퍼티에 대해 명시된 속성을 포함하는, 완전히 채워진 데이터 Property Descriptor라고 하자. 19.2, 19.3, 또는 19.4에 나열된 프로퍼티들에 대해서는 [[Value]] 속성의 값이 realmRec의 대응 intrinsic object이다.
execution context는 ECMAScript 구현에 의한 코드의 런타임 평가를 추적하는 데 사용되는 명세 장치이다. 어떤 시점에도 실제로 코드를 실행 중인 execution context는 agent당 최대 하나뿐이다. 이것을 그 agent의 running execution context라고 한다. 이 명세에서 running execution context에 대한 모든 참조는 주변 agent의 running execution context를 의미한다.
execution context는 순전히 명세 메커니즘이며, ECMAScript 구현의 어떤 특정 산출물과 대응할 필요는 없다. ECMAScript 코드가 execution context에 직접 접근하거나 관찰하는 것은 불가능하다.
9.4.1 GetActiveScriptOrModule ( )
The abstract operation GetActiveScriptOrModule takes no arguments and returns a Script Record, a Module Record, or null. 이것은 running execution context를 바탕으로 현재 실행 중인 script 또는 module을 결정하는 데 사용된다. It performs the following steps when called:
The abstract operation ResolveBinding takes argument name (a String) and optional argument env (an Environment Record or undefined) and returns either a normal completion containing a Reference Record or a throw completion. 이것은 name의 바인딩을 결정하는 데 사용된다. env는 바인딩을 검색할 Environment Record를 명시적으로 제공하는 데 사용될 수 있다. It performs the following steps when called:
ResolveBinding의 결과는 항상 [[ReferencedName]] 필드가 name인 Reference Record이다.
9.4.3 GetThisEnvironment ( )
The abstract operation GetThisEnvironment takes no arguments and returns an Environment Record. 이것은 현재 키워드this의 바인딩을 제공하는 Environment Record를 찾는다. It performs the following steps when called:
단계 2의 반복은 항상 종료된다. 왜냐하면 환경 리스트는 언제나 this 바인딩을 가지는 전역 환경에서 끝나기 때문이다.
9.4.4 ResolveThisBinding ( )
The abstract operation ResolveThisBinding takes no arguments and returns either a normal completion containing an ECMAScript language value or a throw completion. 이것은 running execution context의 LexicalEnvironment를 사용해 키워드this의 바인딩을 결정한다. It performs the following steps when called:
The abstract operation GetNewTarget takes no arguments and returns an Object or undefined. 이것은 running execution context의 LexicalEnvironment를 사용해 NewTarget 값을 결정한다. It performs the following steps when called:
The abstract operation GetGlobalObject takes no arguments and returns an Object. 이것은 현재 running execution context가 사용하는 전역 객체를 반환한다. It performs the following steps when called:
The abstract operation RunSuspendedContext takes arguments context (an execution context) and completionRecord (a Completion Record) and returns either a normal completion containing either an ECMAScript language value or unused, or an abrupt completion. 이는 context를 재개하고(completionRecord를 재개 값으로 전송), 그 결과를 기다린다. It performs the following steps when called:
callerContext를 실행 중인 실행 컨텍스트라 하자.
callerContext를 일시 중단한다.
context를 실행 컨텍스트 스택에 푸시한다. 이제 context가 실행 중인 실행 컨텍스트이다.
context의 일시 중단된 평가를 재개한다. 이때 completionRecord를 그것을 일시 중단한 연산의 결과로 사용한다. 재개된 계산이 반환한 Completion Record를 result라 하자.
Assert: 이 단계에 도달했을 때, context는 이미 실행 컨텍스트 스택에서 제거되었고 callerContext가 다시 실행 중인 실행 컨텍스트이다.
JobCallback Record { [[Callback]]: callback, [[HostDefined]]: empty }를 반환한다.
웹 브라우저가 아닌 ECMAScript 호스트는 HostMakeJobCallback의 기본 구현을 사용해야 한다.
Note
이것은 callback이 결국 스케줄되고 실행되도록 책임지는 함수에 전달되는 시점에 호출된다. 예를 들어, promise.then(thenAction)은 reaction Job이 스케줄되는 시점이 아니라 Promise.prototype.then 호출 시점에 thenAction에 대해 MakeJobCallback을 호출한다.
웹 브라우저가 아닌 ECMAScript 호스트는 HostCallJobCallback의 기본 구현을 사용해야 한다.
9.5.4 HostEnqueueGenericJob ( job, realm )
The host-defined abstract operation HostEnqueueGenericJob takes arguments job (a JobAbstract Closure) and realm (a Realm Record) and returns unused. 이것은 realm.[[AgentSignifier]]로 표시되는 agent 안의 realmrealm에서 job이 미래의 어느 시점에 수행되도록 스케줄한다. 이 알고리즘과 함께 사용되는 Abstract Closure는 우선순위나 순서 같은 추가 제약 없이 스케줄되도록 의도된다.
The host-defined abstract operation HostEnqueuePromiseJob takes arguments job (a JobAbstract Closure) and realm (a Realm Record or null) and returns unused. 이것은 job이 미래의 어느 시점에 수행되도록 스케줄한다. 이 알고리즘과 함께 사용되는 Abstract Closure는 Promise 처리와 관련되거나, 또는 Promise 처리 연산과 동등한 우선순위로 스케줄되도록 의도된다.
HostEnqueuePromiseJob의 구현은 9.5의 요구 사항뿐 아니라 다음도 준수해야 한다:
realm이 null이 아니면, job이 호출될 때마다 구현은 job 호출 시점에 execution이 ECMAScript 코드를 평가할 준비가 되어 있도록 구현 정의 단계를 수행해야 한다.
HostEnqueuePromiseJob이 호출되는 시점의 GetActiveScriptOrModule()을 scriptOrModule이라 하자. realm이 null이 아니면, job이 호출될 때마다 구현은 job 호출 시점에 scriptOrModule이 active script 또는 module이 되도록 구현 정의 단계를 수행해야 한다.
Job은 그것들을 스케줄한 HostEnqueuePromiseJob 호출과 같은 순서로 실행되어야 한다.
The host-defined abstract operation HostEnqueueTimeoutJob takes arguments timeoutJob (a JobAbstract Closure), realm (a Realm Record), and milliseconds (a non-negative finite Number) and returns unused. 이것은 realm.[[AgentSignifier]]로 표시되는 agent 안의 realmrealm에서 timeoutJob이 적어도 milliseconds 밀리초 이후에 수행되도록 스케줄한다.
예를 들어, 일부 웹 브라우저는 브라우저 창의 서로 관련 없는 여러 탭 사이에서 하나의 실행 스레드를 공유한다.
에이전트의 실행 스레드가 알고리즘 단계를 실행하고 있는 동안, 그 단계들에 대해 해당 에이전트는 주변 에이전트이다. 그 단계들은 주변 에이전트를 사용하여 에이전트 내부에 보관된 명세 수준 실행 객체들, 즉 실행 중인 실행 컨텍스트, 실행 컨텍스트 스택, 그리고 에이전트 레코드의 필드들에 접근한다.
초기값은 새로운 빈 List이며, 현재 Job이 끝날 때까지 살아 있도록 유지해야 하는 객체 및/또는 심벌들의 목록을 나타낸다
[[ModuleAsyncEvaluationCount]]
an integer
초기값은 0이며, 비동기적이거나 비동기 의존성을 가진 모듈의 [[AsyncEvaluationOrder]] 필드에 고유하게 증가하는 값을 할당하는 데 사용된다.
[[LittleEndian]], [[Signifier]], [[IsLockFree1]], [[IsLockFree2]], 그리고 [[IsLockFree8]]의 값은 변경될 수 없다.
Note 2
[[IsLockFree1]], [[IsLockFree2]], 그리고 [[IsLockFree8]]의 값은 반드시 하드웨어에 의해 결정되는 것은 아니며, ECMAScript 구현마다 그리고 시간에 따라 달라질 수 있는 구현 선택을 반영할 수도 있다.
[[IsLockFree4]] 필드는 없다: 4바이트 원자적 연산은 항상 lock-free이다.
실제로, 원자적 연산이 어떤 종류의 락으로 구현된다면 그 연산은 lock-free가 아니다. Lock-free는 wait-free를 의미하지 않는다: lock-free 원자적 연산을 완료하는 데 얼마나 많은 머신 단계가 필요할지에 대한 상한은 없다.
크기 n의 원자적 접근이 lock-free라는 사실은 크기 n의 비원자적 접근의 (인지된) 원자성에 대해 아무것도 의미하지 않는다. 특히 비원자적 접근은 여전히 여러 개의 개별 메모리 접근 시퀀스로 수행될 수 있다. 자세한 내용은 ReadSharedMemory와 WriteSharedMemory를 보라.
Note 3
에이전트는 명세 메커니즘이며, ECMAScript 구현의 어떤 특정 산출물과 대응할 필요는 없다.
9.6.1 AgentSignifier ( )
The abstract operation AgentSignifier takes no arguments and returns an agent signifier. It performs the following steps when called:
일부 환경에서는 특정 에이전트가 중단될 수 있도록 하는 것이 합리적이지 않을 수 있다. 예를 들어 웹 브라우저 환경에서는 문서의 메인 이벤트 처리 스레드의 중단을 허용하지 않는 것이 합리적일 수 있지만, 워커의 이벤트 처리 스레드는 여전히 중단을 허용할 수 있다.
9.6.3 IncrementModuleAsyncEvaluationCount ( )
The abstract operation IncrementModuleAsyncEvaluationCount takes no arguments and returns a non-negative integer. It performs the following steps when called:
클러스터에 속한 에이전트들이 어떤 특정 시점에 모두 살아 있을 필요는 없다. 에이전트A가 다른 에이전트B를 생성하고, 그 후 A가 종료되며 B가 에이전트C를 생성하는 경우, A가 B와 어떤 메모리를 공유할 수 있었고 B가 C와 어떤 메모리를 공유할 수 있었다면 이 세 에이전트는 같은 클러스터에 속한다.
클러스터 내의 모든 에이전트는 각자의 에이전트 레코드에서 [[LittleEndian]] 필드에 대해 같은 값을 가져야 한다.
Note 3
에이전트 클러스터 내의 서로 다른 에이전트들이 [[LittleEndian]]의 서로 다른 값을 가지면 다중 바이트 데이터에 공유 메모리를 사용하는 것이 어려워진다.
클러스터 내의 모든 에이전트는 각자의 에이전트 레코드에서 [[IsLockFree1]] 필드에 대해 같은 값을 가져야 하며, [[IsLockFree2]] 및 [[IsLockFree8]] 필드도 마찬가지이다.
클러스터 내의 모든 에이전트는 각자의 에이전트 레코드에서 [[Signifier]] 필드에 대해 서로 다른 값을 가져야 한다.
임베딩은 에이전트의 지식이나 협조 없이 에이전트를 비활성화(전진 진행 중지)하거나 활성화(전진 진행 재개)할 수 있다. 임베딩이 그렇게 하는 경우, 클러스터 내 일부 에이전트는 활성 상태로 두면서 다른 에이전트들은 무기한 비활성화된 상태로 남겨두어서는 안 된다.
Note 4
앞선 제한의 목적은 다른 에이전트가 비활성화되었기 때문에 어떤 에이전트가 교착 상태에 빠지거나 기아 상태에 빠지는 상황을 피하는 것이다. 예를 들어, 어떤 창의 문서들과 독립된 수명을 가진 HTML 공유 워커가, 그러한 독립 문서의 전용 워커와 메모리를 공유하는 것이 허용되었고, 문서와 그 전용 워커가 전용 워커가 락을 쥔 상태에서 비활성화된다면(예를 들어 문서가 자신의 창 기록으로 밀려나는 경우), 그 후 공유 워커가 그 락을 획득하려고 하면 공유 워커는 전용 워커가 다시 활성화될 때까지, 혹은 영원히, 블록될 것이다. 그 사이 다른 창에서 공유 워커에 접근하려는 다른 워커들은 기아 상태에 빠질 것이다.
이 제한의 함의는, 임베딩 내에서 같은 suspend/wake 집합에 속하지 않는 에이전트들 사이에서는 메모리를 공유하는 것이 불가능하다는 점이다.
임베딩은 클러스터의 다른 에이전트들의 사전 지식이나 협조 없이 에이전트를 종료할 수 있다. 에이전트가 자기 자신이나 클러스터 내 다른 에이전트의 프로그램적 동작이 아니라 클러스터 외부의 힘에 의해 종료되는 경우, 임베딩은 두 가지 전략 중 하나를 선택해야 한다: 클러스터의 모든 에이전트를 종료하거나, 또는 클러스터 내 에이전트들이 조정할 수 있도록 신뢰할 수 있는 API를 제공하여 적어도 하나의 남아 있는 클러스터 구성원이 종료를 감지할 수 있게 해야 하며, 종료 데이터는 종료된 에이전트를 식별하기에 충분한 정보를 포함해야 한다.
Note 5
그러한 유형의 종료 예시는 다음과 같다: 별도 프로세스에서 실행 중인 에이전트를 운영체제나 사용자가 종료하는 경우; 또는 임베딩 자체가 다른 에이전트들과 같은 프로세스 내에서 실행 중인 에이전트를 종료하는 경우로, 에이전트별 자원 회계 결과 그 에이전트가 폭주 중이라고 나타나는 경우이다.
다음 명세 값 각각과, 그것들로부터 전이적으로 도달 가능한 값들은 정확히 하나의 에이전트 클러스터에 속한다.
에이전트의 실행 중인 실행 컨텍스트가 외부 이벤트를 동기적으로 그리고 무기한 기다릴 때, 그 에이전트는 블록된다. 이러한 의미에서 블록될 수 있는 것은 에이전트 레코드의 [[CanBlock]] 필드가 true인 에이전트뿐이다. 블록되지 않은에이전트는 블록되지 않은 에이전트이다.
에이전트는 명시적으로 블로킹을 제공하는 API를 통해서만 다른 에이전트를 블록되게 할 수 있다.
Note
이것은 메모리 모델의 liveness 보장과 함께, 모든 seq-cst 쓰기가 결국 모든 에이전트에서 관찰 가능해짐을 보장한다.
9.9 WeakRef 및 FinalizationRegistry 대상의 처리 모델
9.9.1 목표
이 명세는 어떤 객체나 심벌이 가비지 컬렉션될 것이라는 어떠한 보장도 하지 않는다. 살아 있지 않은 객체나 심벌은 오랜 시간이 지난 뒤에 해제될 수도 있고, 아예 해제되지 않을 수도 있다. 이러한 이유로, 이 명세는 가비지 컬렉션에 의해 유발되는 동작을 설명할 때 "may"라는 용어를 사용한다.
WeakRef.prototype.deref가 호출되면, referent는(undefined가 반환되지 않는다면) 이후의 동기적 접근도 같은 값을 반환하도록 살아 있게 유지된다. 이 목록은 ClearKeptObjects추상 연산을 사용하여 동기 작업이 끝날 때 재설정된다.
일부 ECMAScript 구현은 ECMAScript가 유휴 상태일 때를 포함해 백그라운드에서 실행되는 가비지 컬렉터 구현을 포함한다. 호스트 환경이 CleanupFinalizationRegistry를 스케줄할 수 있게 하면, finalizer 작업을 실행하기 위해 ECMAScript 실행을 재개할 수 있고, 이로 인해 held value를 해제하여 전체 메모리 사용량을 줄일 수 있다.
9.9.2 Liveness
어떤 객체 및/또는 심벌들의 집합 objectSet에 대해, objectSet에 관한 가정적 WeakRef-무시 실행이란, referent가 objectSet의 원소인 WeakRef의 추상 연산WeakRefDeref가 항상 undefined를 반환하는 실행을 말한다.
Note 1
WeakRef-무시성과 liveness는 함께 두 가지 개념을 포착한다. 첫째, WeakRef 자체는 referent를 살아 있게 유지하지 않는다는 점이다. 둘째, liveness의 순환이 어떤 값이 살아 있음을 의미하지는 않는다는 점이다. 구체적으로 말하면, v의 liveness를 결정하는 일이 WeakRef referent인 r의 liveness를 결정하는 데 의존한다면, r의 liveness는 v의 liveness를 가정할 수 없는데, 이는 순환 논법이 되기 때문이다.
Note 2
WeakRef-무시성은 순환을 고려하기 위해 개별 값이 아니라 객체나 심벌의 집합에 대해 정의된다. 만약 개별 값에 대해 정의된다면, 순환 안에 있는 WeakRef referent는 그 정체성이 오직 순환 안의 다른 WeakRef referent를 통해서만 관찰되더라도 살아 있는 것으로 간주될 것이다.
Note 3
구어적으로, 어떤 개별 객체 또는 심벌을 포함하는 모든 집합이 live라면 그 객체 또는 심벌은 live하다고 말한다.
평가 중 어느 시점에서든, 객체 및/또는 심벌들의 집합 objectSet은 다음 조건 중 하나라도 만족하면 live하다고 간주된다:
objectSet의 어떤 원소든 임의의 에이전트의 [[KeptAlive]]List에 포함된다.
objectSet에 관해 유효한 미래의 가정적 WeakRef-무시 실행이 존재하며, 그 실행이 objectSet 안의 어떤 값의 정체성을 관찰한다.
Note 4
위의 두 번째 조건은 어떤 값의 정체성이 비-WeakRef 수단으로 관찰 가능하다면 그 값이 live하다는 직관을 포착하려는 것이다. 값의 정체성은 strict equality 비교를 관찰하거나, 그 값이 Map의 key로 사용되는 것을 관찰함으로써 관찰될 수 있다.
Note 5
객체나 심벌이 어떤 필드, 내부 슬롯, 또는 프로퍼티 안에 존재한다고 해서 그 값이 live하다는 뜻은 아니다. 예를 들어 해당 값이 결코 프로그램으로 다시 전달되지 않는다면, 그 값은 관찰될 수 없다.
이는 WeakMap의 key, WeakSet의 member, 그리고 FinalizationRegistry Cell record의 [[WeakRefTarget]] 및 [[UnregisterToken]] 필드의 경우에 해당한다.
위 정의는, WeakMap의 key가 live하지 않다면 그에 대응하는 value도 반드시 live한 것은 아니라는 점을 함의한다.
Note 6
Liveness는 엔진이 비워서는 안 되는 WeakRef를 보장하는 하한이다. 여기서 정의된 liveness는 결정 불가능하다. 실제로 엔진은 도달 가능성과 같은 보수적 근사를 사용한다. 구현에는 상당한 재량이 기대된다.
9.9.3 실행
어느 시점에서든, 객체 및/또는 심벌들의 집합 objectSet이 live하지 않다면, ECMAScript 구현은 다음 단계를 원자적으로 수행할 수 있다:
objectSet의 각 원소 value에 대해, 다음을 수행한다
ref.[[WeakRefTarget]]이 value인 각 WeakRefref에 대해, 다음을 수행한다
map.[[WeakMapData]]가 r.[[Key]]가 value인 Recordr을 포함하는 각 WeakMap map에 대해, 다음을 수행한다
r.[[Key]]를 empty로 설정한다.
r.[[Value]]를 empty로 설정한다.
set.[[WeakSetData]]가 value를 포함하는 각 WeakSet set에 대해, 다음을 수행한다.
set.[[WeakSetData]]에서 값이 value인 원소를 값이 empty인 원소로 교체한다.
Note 1
liveness의 정의와 함께, 이 절은 구현이 WeakRef와 관련하여 적용할 수 있는 최적화를 규정한다.
객체의 정체성을 관찰하지 않고도 객체에 접근하는 것은 가능하다. 정체성이 관찰되지 않는 비탈출 객체의 프로퍼티에 대한 dead variable elimination이나 scalar replacement 같은 최적화는 허용된다. 따라서 이러한 최적화는 그러한 객체를 가리키는 WeakRef를 관찰 가능하게 비우는 것도 허용된다.
반면에 어떤 객체의 정체성이 관찰 가능하고, 그 객체가 WeakRef의 [[WeakRefTarget]] 내부 슬롯 안에 있다면, WeakRef를 관찰 가능하게 비우는 rematerialization 같은 최적화는 금지된다.
구현은 live하지 않은 객체나 심벌의 최대 집합에 대해 WeakRef를 비울 의무가 없다.
구현이 WeakRef를 비울 live하지 않은 집합 objectSet을 선택한다면, 이 정의는 objectSet 안의 모든 값에 대한 WeakRef를 동시에 비워야 함을 요구한다. 즉, 구현이 어떤 값 v를 가리키는 WeakRef를 비우면서, 비워지지 않을 경우 v의 값을 관찰하는 실행이 가능해질 수 있는 다른 WeakRef는 비우지 않는 것은 적합하지 않다.
The host-defined abstract operation HostEnqueueFinalizationRegistryCleanupJob takes argument finalizationRegistry (a FinalizationRegistry) and returns unused.
finalizationRegistry를 캡처하고, 호출될 때 다음 단계를 수행하는 매개변수 없는 새로운 JobAbstract Closure를 cleanupJob이라고 하자:
HostEnqueueFinalizationRegistryCleanupJob의 구현은 가능하다면 cleanupJob이 미래의 어느 시점에 수행되도록 스케줄한다. 또한 9.5의 요구 사항도 준수해야 한다.
9.10 ClearKeptObjects ( )
The abstract operation ClearKeptObjects takes no arguments and returns unused. ECMAScript 구현은 동기적인 ECMAScript 실행 시퀀스가 완료될 때 ClearKeptObjects를 호출할 것으로 기대된다. It performs the following steps when called:
The abstract operation CleanupFinalizationRegistry takes argument finalizationRegistry (a FinalizationRegistry) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:
Assert: finalizationRegistry는 [[Cells]] 및 [[CleanupCallback]] 내부 슬롯을 가진다.
callback을 finalizationRegistry.[[CleanupCallback]]이라고 하자.
finalizationRegistry.[[Cells]]가 cell.[[WeakRefTarget]]이 empty인 Recordcell을 포함하는 동안, 구현은 다음 단계를 수행할 수 있다:
The abstract operation CanBeHeldWeakly takes argument v (an ECMAScript language value) and returns a Boolean. 이것은 v가 약한 참조로 사용되기에 적합한 경우에만 true를 반환한다. 약한 참조로 사용되기에 적합한 값만이 WeakMap의 키, WeakSet의 원소, WeakRef의 대상, 또는 FinalizationRegistry의 대상들 중 하나가 될 수 있다. It performs the following steps when called:
언어적 동일성이 없는 언어 값은 사전 참조 없이도 나타날 수 있으며, 약한 참조로 사용되기에 부적합하다. Symbol.for에 의해 생성된 Symbol 값은 다른 Symbol 값과 달리 언어적 동일성을 가지지 않으며, 약한 참조로 사용되기에 부적합하다. well-known symbol은 수집되지 않을 가능성이 높지만, 개수가 제한되어 있어 다양한 구현 접근법으로 관리 가능하므로 여전히 약한 참조로 사용되기에 적합한 것으로 취급된다. 그러나 live한 WeakMap 안에서 well-known symbol에 연관된 어떤 값이든 수집되지 않을 가능성이 높으며, 구현에서 메모리 자원을 “누수”시킬 수 있다.
10 일반 객체 및 이색 객체 동작
10.1 일반 객체 내부 메서드와 내부 슬롯
모든 일반 객체는 [[Prototype]]이라는 내부 슬롯을 가진다. 이 내부 슬롯의 값은 null 또는 객체이며 상속을 구현하는 데 사용된다. propertyKey라는 이름의 프로퍼티가 일반 객체 obj에는 없지만 그 [[Prototype]] 객체에는 존재한다고 가정하자. propertyKey가 [[Prototype]] 객체의 데이터 프로퍼티를 가리키면, obj는 get 접근에 대해 그것을 상속받아 propertyKey가 obj의 프로퍼티인 것처럼 동작한다. propertyKey가 [[Prototype]] 객체의 쓰기 가능한 데이터 프로퍼티를 가리키면, obj에서 propertyKey에 대한 set 접근은 obj에 propertyKey라는 이름의 새로운 데이터 프로퍼티를 생성한다. propertyKey가 [[Prototype]] 객체의 쓰기 불가능한 데이터 프로퍼티를 가리키면, obj에서 propertyKey에 대한 set 접근은 실패한다. propertyKey가 [[Prototype]] 객체의 접근자 프로퍼티를 가리키면, 그 접근자는 get 접근과 set 접근 모두에 대해 obj에 상속된다.
모든 일반 객체는 Boolean 값의 [[Extensible]] 내부 슬롯을 가지며, 이는 6.1.7.3에 명시된 확장 가능성과 관련된 내부 메서드 불변식을 충족하는 데 사용된다. 즉, 객체의 [[Extensible]] 내부 슬롯 값이 한 번 false로 설정되면, 더 이상 그 객체에 프로퍼티를 추가하거나, 객체의 [[Prototype]] 내부 슬롯 값을 수정하거나, 이후 [[Extensible]]의 값을 true로 다시 변경하는 것은 불가능하다.
다음 알고리즘 설명에서, obj는 일반 객체이고, propertyKey는 프로퍼티 키 값이며, value는 임의의 ECMAScript 언어 값이고, desc는 Property Descriptor 레코드라고 가정한다.
각 일반 객체 내부 메서드는 유사한 이름의 추상 연산에 위임한다. 그러한 추상 연산이 다른 내부 메서드에 의존한다면, 유사한 이름의 추상 연산을 직접 호출하는 대신 그 내부 메서드가 obj에 대해 호출된다. 이러한 의미론은 일반 객체 내부 메서드가 이색 객체에 적용될 때, 이색 객체가 재정의한 내부 메서드가 호출되도록 보장한다.
10.1.1[[GetPrototypeOf]] ( )
The [[GetPrototypeOf]] internal method of 일반 객체 obj takes no arguments and returns a normal completion containing either an Object or null. It performs the following steps when called:
The abstract operation OrdinaryGetPrototypeOf takes argument obj (an Object) and returns an Object or null. It performs the following steps when called:
obj.[[Prototype]]를 반환한다.
10.1.2[[SetPrototypeOf]] ( proto )
The [[SetPrototypeOf]] internal method of 일반 객체 obj takes argument proto (an Object or null) and returns a normal completion containing a Boolean. It performs the following steps when called:
The abstract operation OrdinarySetPrototypeOf takes arguments obj (an Object) and proto (an Object or null) and returns a Boolean. It performs the following steps when called:
cursor.[[GetPrototypeOf]]가 10.1.1에 정의된 일반 객체 내부 메서드가 아니면, done을 true로 설정한다.
그렇지 않으면, cursor를 cursor.[[Prototype]]로 설정한다.
obj.[[Prototype]]를 proto로 설정한다.
true를 반환한다.
Note
단계 7의 반복은 [[GetPrototypeOf]] 및 [[SetPrototypeOf]]에 대해 일반 객체 정의를 사용하는 객체만 포함하는 모든 프로토타입 체인에 순환이 없음을 보장한다.
10.1.3[[IsExtensible]] ( )
The [[IsExtensible]] internal method of 일반 객체 obj takes no arguments and returns a normal completion containing a Boolean. It performs the following steps when called:
The abstract operation OrdinaryIsExtensible takes argument obj (an Object) and returns a Boolean. It performs the following steps when called:
obj.[[Extensible]]를 반환한다.
10.1.4[[PreventExtensions]] ( )
The [[PreventExtensions]] internal method of 일반 객체 obj takes no arguments and returns a normal completion containing true. It performs the following steps when called:
The abstract operation OrdinaryPreventExtensions takes argument obj (an Object) and returns true. It performs the following steps when called:
obj.[[Extensible]]를 false로 설정한다.
true를 반환한다.
10.1.5[[GetOwnProperty]] ( propertyKey )
The [[GetOwnProperty]] internal method of 일반 객체 obj takes argument propertyKey (a property key) and returns a normal completion containing either a Property Descriptor or undefined. It performs the following steps when called:
The abstract operation OrdinaryGetOwnProperty takes arguments obj (an Object) and propertyKey (a property key) and returns a Property Descriptor or undefined. It performs the following steps when called:
obj가 키가 propertyKey인 자체 프로퍼티를 가지지 않으면, undefined를 반환한다.
The [[DefineOwnProperty]] internal method of 일반 객체 obj takes arguments propertyKey (a property key) and desc (a Property Descriptor) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
The abstract operation OrdinaryDefineOwnProperty takes arguments obj (an Object), propertyKey (a property key), and desc (a Property Descriptor) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
current를 ? obj.[[GetOwnProperty]](propertyKey)라고 하자.
10.1.6.2 IsCompatiblePropertyDescriptor ( extensible, desc, current )
The abstract operation IsCompatiblePropertyDescriptor takes arguments extensible (a Boolean), desc (a Property Descriptor), and current (a Property Descriptor or undefined) and returns a Boolean. It performs the following steps when called:
10.1.6.3 ValidateAndApplyPropertyDescriptor ( obj, propertyKey, extensible, desc, current )
The abstract operation ValidateAndApplyPropertyDescriptor takes arguments obj (an Object or undefined), propertyKey (a property key), extensible (a Boolean), desc (a Property Descriptor), and current (a Property Descriptor or undefined) and returns a Boolean. 이것은 desc를, 명시된 extensibility와 현재 프로퍼티 current를 가진 객체의 프로퍼티로 적용하면서 불변식을 유지할 수 있는 경우에만 true를 반환한다. 그러한 적용이 가능하고 obj가 undefined가 아니면, propertyKey라는 이름의 프로퍼티에 대해 그 적용이 수행된다(필요하면 생성된다). It performs the following steps when called:
desc에 해당 필드가 있으면 그 값으로, 없으면 해당 속성의 기본값으로 [[Get]], [[Set]], [[Enumerable]], [[Configurable]] 속성이 설정된 propertyKey라는 이름의 자체 접근자 프로퍼티를 객체 obj에 생성한다.
그렇지 않으면,
desc에 해당 필드가 있으면 그 값으로, 없으면 해당 속성의 기본값으로 [[Value]], [[Writable]], [[Enumerable]], [[Configurable]] 속성이 설정된 propertyKey라는 이름의 자체 데이터 프로퍼티를 객체 obj에 생성한다.
desc가 [[Configurable]] 필드를 가지면 configurable을 desc.[[Configurable]]라고 하자; 그렇지 않으면 configurable을 current.[[Configurable]]라고 하자.
desc가 [[Enumerable]] 필드를 가지면 enumerable을 desc.[[Enumerable]]라고 하자; 그렇지 않으면 enumerable을 current.[[Enumerable]]라고 하자.
객체 obj의 propertyKey라는 이름의 프로퍼티를, [[Configurable]]과 [[Enumerable]] 속성은 각각 configurable과 enumerable로 설정하고, [[Get]]과 [[Set]] 속성은 desc에 해당 필드가 있으면 그 값으로, 없으면 해당 속성의 기본값으로 설정한 접근자 프로퍼티로 교체한다.
desc가 [[Configurable]] 필드를 가지면 configurable을 desc.[[Configurable]]라고 하자; 그렇지 않으면 configurable을 current.[[Configurable]]라고 하자.
desc가 [[Enumerable]] 필드를 가지면 enumerable을 desc.[[Enumerable]]라고 하자; 그렇지 않으면 enumerable을 current.[[Enumerable]]라고 하자.
객체 obj의 propertyKey라는 이름의 프로퍼티를, [[Configurable]]과 [[Enumerable]] 속성은 각각 configurable과 enumerable로 설정하고, [[Value]]와 [[Writable]] 속성은 desc에 해당 필드가 있으면 그 값으로, 없으면 해당 속성의 기본값으로 설정한 데이터 프로퍼티로 교체한다.
그렇지 않으면,
desc의 각 필드 이름 fieldName에 대해, 객체 obj의 propertyKey라는 이름의 프로퍼티에서 fieldName이라는 속성을 desc의 fieldName 필드 값으로 설정한다.
true를 반환한다.
10.1.7[[HasProperty]] ( propertyKey )
The [[HasProperty]] internal method of 일반 객체 obj takes argument propertyKey (a property key) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
The abstract operation OrdinaryHasProperty takes arguments obj (an Object) and propertyKey (a property key) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
hasOwn을 ? obj.[[GetOwnProperty]](propertyKey)라고 하자.
hasOwn이 undefined가 아니면, true를 반환한다.
parent를 ? obj.[[GetPrototypeOf]]()라고 하자.
parent가 null이 아니면,
? parent.[[HasProperty]](propertyKey)를 반환한다.
false를 반환한다.
10.1.8[[Get]] ( propertyKey, receiver )
The [[Get]] internal method of 일반 객체 obj takes arguments propertyKey (a property key) and receiver (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:
The abstract operation OrdinaryGet takes arguments obj (an Object), propertyKey (a property key), and receiver (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:
The [[Set]] internal method of 일반 객체 obj takes arguments propertyKey (a property key), value (an ECMAScript language value), and receiver (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
The abstract operation OrdinarySet takes arguments obj (an Object), propertyKey (a property key), value (an ECMAScript language value), and receiver (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
ownDesc를 ? obj.[[GetOwnProperty]](propertyKey)라고 하자.
The abstract operation OrdinarySetWithOwnDescriptor takes arguments obj (an Object), propertyKey (a property key), value (an ECMAScript language value), receiver (an ECMAScript language value), and ownDesc (a Property Descriptor or undefined) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
The [[Delete]] internal method of 일반 객체 obj takes argument propertyKey (a property key) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
The abstract operation OrdinaryDelete takes arguments obj (an Object) and propertyKey (a property key) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
desc를 ? obj.[[GetOwnProperty]](propertyKey)라고 하자.
desc가 undefined이면, true를 반환한다.
desc.[[Configurable]]가 true이면,
obj에서 이름이 propertyKey인 자체 프로퍼티를 제거한다.
true를 반환한다.
false를 반환한다.
10.1.11[[OwnPropertyKeys]] ( )
The [[OwnPropertyKeys]] internal method of 일반 객체 obj takes no arguments and returns a normal completion containing a List of property keys. It performs the following steps when called:
The abstract operation OrdinaryOwnPropertyKeys takes argument obj (an Object) and returns a List of property keys. It performs the following steps when called:
obj의 각 자체 프로퍼티 키 propertyKey 중 propertyKey가 배열 인덱스인 것에 대해, 숫자 인덱스 오름차순으로, 다음을 수행한다
propertyKey를 keys에 추가한다.
obj의 각 자체 프로퍼티 키 propertyKey 중 propertyKey가 String이고 배열 인덱스가 아닌 것에 대해, 프로퍼티 생성의 시간순 오름차순으로, 다음을 수행한다
propertyKey를 keys에 추가한다.
obj의 각 자체 프로퍼티 키 propertyKey 중 propertyKey가 Symbol인 것에 대해, 프로퍼티 생성의 시간순 오름차순으로, 다음을 수행한다
propertyKey를 keys에 추가한다.
keys를 반환한다.
10.1.12 OrdinaryObjectCreate ( proto [ , additionalInternalSlotsList ] )
The abstract operation OrdinaryObjectCreate takes argument proto (an Object or null) and optional argument additionalInternalSlotsList (a List of names of internal slots) and returns an Object. 이것은 새로운 일반 객체의 런타임 생성을 명세하는 데 사용된다. additionalInternalSlotsList는 [[Prototype]]과 [[Extensible]] 외에, 객체의 일부로 정의되어야 하는 추가 내부 슬롯들의 이름을 담고 있다. additionalInternalSlotsList가 제공되지 않으면, 새로운 빈 List가 사용된다. It performs the following steps when called:
internalSlotsList를 « [[Prototype]], [[Extensible]] »라고 하자.
OrdinaryObjectCreate는 MakeBasicObject를 호출하는 것 외에 거의 하는 일이 없지만, 그 사용은 이색 객체가 아닌 일반 객체를 생성하려는 의도를 전달한다. 따라서 이 명세 안에서, 결과를 비일반적으로 만드는 방식으로 객체의 내부 메서드를 이후 수정하는 어떤 알고리즘도 이것을 호출하지 않는다. 이색 객체를 생성하는 연산은 MakeBasicObject를 직접 호출한다.
The abstract operation OrdinaryCreateFromConstructor takes arguments constructor (a function object) and intrinsicDefaultProto (a String) and optional argument internalSlotsList (a List of names of internal slots) and returns either a normal completion containing an Object or a throw completion. 이것은 [[Prototype]] 값이 생성자의 "prototype" 프로퍼티에서 존재하면 거기서 가져와지는 일반 객체를 생성한다. 그렇지 않으면 intrinsicDefaultProto로 명명된 intrinsic이 [[Prototype]]에 사용된다. internalSlotsList는 객체의 일부로 정의되어야 하는 추가 내부 슬롯들의 이름을 담고 있다. internalSlotsList가 제공되지 않으면, 새로운 빈 List가 사용된다. It performs the following steps when called:
Assert: intrinsicDefaultProto는 이 명세에서 intrinsic 객체의 이름이다. 대응하는 객체는 객체의 [[Prototype]] 값으로 사용되도록 의도된 intrinsic이어야 한다.
The abstract operation GetPrototypeFromConstructor takes arguments constructor (a function object) and intrinsicDefaultProto (a String) and returns either a normal completion containing an Object or a throw completion. 이것은 특정 생성자에 대응하는 객체를 만들 때 사용해야 하는 [[Prototype]] 값을 결정한다. 그 값은 생성자의 "prototype" 프로퍼티가 존재하면 거기서 가져온다. 그렇지 않으면 intrinsicDefaultProto로 명명된 intrinsic이 [[Prototype]]에 사용된다. It performs the following steps when called:
Assert: intrinsicDefaultProto는 이 명세에서 intrinsic 객체의 이름이다. 대응하는 객체는 객체의 [[Prototype]] 값으로 사용되도록 의도된 intrinsic이어야 한다.
proto를 realm의 intrinsicDefaultProto라는 이름의 intrinsic 객체로 설정한다.
proto를 반환한다.
Note
constructor가 [[Prototype]] 값을 제공하지 않으면, 사용되는 기본값은 실행 중인 실행 컨텍스트가 아니라 constructor 함수의 realm에서 가져온다.
10.1.15 RequireInternalSlot ( obj, internalSlot )
The abstract operation RequireInternalSlot takes arguments obj (an ECMAScript language value) and internalSlot (an internal slot name) and returns either a normal completion containing unused or a throw completion. 이것은 obj가 Object이고 주어진 내부 슬롯을 가지는 경우가 아니면 예외를 던진다. It performs the following steps when called:
obj가 Object가 아니면, TypeError 예외를 던진다.
obj가 internalSlot 내부 슬롯을 가지지 않으면, TypeError 예외를 던진다.
unused를 반환한다.
10.2 ECMAScript 함수 객체
ECMAScript 함수 객체는 어휘 환경에 대해 닫힌 매개변수화된
ECMAScript 코드를 캡슐화하며, 그 코드의 동적 평가를 지원한다.
ECMAScript 함수 객체는 일반 객체이며, 다른 일반 객체와 동일한 내부 슬롯과
동일한 내부 메서드를 가진다. ECMAScript 함수 객체의 코드는 strict mode
코드(11.2.2)이거나 non-strict
코드일 수 있다. 코드가 strict mode 코드인 ECMAScript 함수 객체는
strict function
이라고 한다. 코드가 strict mode 코드가 아닌 것은
non-strict
function이라고 한다.
[[Extensible]]과 [[Prototype]] 외에도, ECMAScript 함수 객체는
Table 25
에 나열된 내부 슬롯도 가진다.
Table 25: Internal Slots of ECMAScript Function Objects
함수의 형식 매개변수와 코드 본문 안에서 this 참조가 어떻게
해석되는지를 정의한다. lexical은 this가 어휘적으로 둘러싼
함수의 this 값을 가리킨다는 뜻이다. strict는 this 값이
함수 호출 시 제공된 그대로 사용된다는 뜻이다. global은 this
값이 undefined 또는 null이면 전역 객체에 대한 참조로
해석되고, 그 외의 this 값은 먼저 ToObject에 전달된다는 뜻이다.
함수가 클래스 필드의 initializer로 생성된 경우, 필드의
NamedEvaluation에 사용할 이름이며, 그렇지 않으면 empty이다.
[[IsClassConstructor]]
a Boolean
함수가 클래스 생성자인지 여부를 나타낸다. (true이면, 함수의
[[Call]]을 호출할 때 즉시 TypeError 예외를 던진다.)
모든 ECMAScript 함수 객체는 여기 정의된 [[Call]] 내부 메서드를 가진다.
추가로 생성자이기도 한 ECMAScript 함수는 [[Construct]] 내부 메서드도
가진다.
10.2.1[[Call]] ( thisArgument, argumentsList )
The [[Call]] internal method of an ECMAScript function objectfunc takes arguments thisArgument (an ECMAScript language value) and argumentsList (a List of ECMAScript language values) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:
The abstract operation PrepareForOrdinaryCall takes arguments func (an ECMAScript function object) and newTarget (an Object or undefined) and returns an execution context. It performs the following steps when called:
The abstract operation OrdinaryCallBindThis takes arguments func (an ECMAScript function object), calleeContext (an execution context), and thisArgument (an ECMAScript language value) and returns unused. It performs the following steps when called:
The abstract operation OrdinaryFunctionCreate takes arguments functionPrototype (an Object), sourceText (a sequence of Unicode code points), parameterList (a Parse Node), body (a Parse Node), thisMode (lexical-this or non-lexical-this), env (an Environment Record), and privateEnv (a PrivateEnvironment Record or null) and returns an ECMAScript function object. 이것은 기본 [[Call]] 내부 메서드를 가지고 [[Construct]] 내부
메서드는 가지지 않는 새로운 함수의 런타임 생성을 명세하는 데
사용된다(다만 MakeConstructor 같은 연산에 의해 이후 추가될 수는
있다). sourceText는 생성될 함수의 구문 정의에 대한 source
text이다. It performs the following steps when called:
The abstract operation AddRestrictedFunctionProperties takes arguments func (a function object) and realm (a Realm Record) and returns unused. It performs the following steps when called:
The abstract operation MakeConstructor takes argument func (an ECMAScript function object or a built-in function object) and optional arguments writablePrototype (a Boolean) and prototype (an Object) and returns unused. 이것은 func를 생성자로 변환한다. It performs the following steps when called:
The abstract operation MakeClassConstructor takes argument func (an ECMAScript function object) and returns unused. It performs the following steps when called:
The abstract operation MakeMethod takes arguments func (an ECMAScript function object) and homeObject (an Object) and returns unused. 이것은 func를 메서드로 구성한다. It performs the following steps when called:
10.2.9 SetFunctionName ( func, name [ , prefix ] )
The abstract operation SetFunctionName takes arguments func (a function object) and name (a property key or Private Name) and optional argument prefix (a String) and returns unused. 이것은 func에 "name" 프로퍼티를 추가한다. It performs the following steps when called:
The abstract operation SetFunctionLength takes arguments func (a function object) and length (a non-negative integer or +∞) and returns unused. 이것은 func에 "length" 프로퍼티를 추가한다. It performs the following steps when called:
Assert: func는 "length" 자체 프로퍼티를 가지지 않는 확장 가능한
객체이다.
ECMAScript 함수를 평가하기 위한 execution context가 설정될 때,
새로운 Function Environment Record가 생성되고 각 형식 매개변수에 대한
바인딩이 그 Environment Record 안에 instantiate된다. 함수 본문 안의
각 선언도 역시 instantiate된다. 함수의 형식 매개변수에 기본값
initializer가 포함되어 있지 않다면, 본문 선언은 매개변수와 같은
Environment Record 안에 instantiate된다. 기본값 매개변수 initializer가
존재하면, 본문 선언을 위해 두 번째 Environment Record가 생성된다.
형식 매개변수와 함수는 FunctionDeclarationInstantiation의 일부로
초기화된다. 다른 모든 바인딩은 함수 본문 평가 중에 초기화된다.
NOTE: non-strict 함수는 최상위 lexical declaration을 위해 별도의 Environment Record를 사용하는데, 이는 direct eval이 eval 코드에 의해 도입된 var 스코프 선언이 기존 최상위 lexical 스코프 선언과 충돌하는지를 판별할 수 있도록 하기 위함이다. strict 함수에는 이것이 필요하지 않은데, strict direct eval은 항상 모든 선언을 새로운 Environment Record에 배치하기 때문이다.
내장 함수 객체는
10.3.1
의 정의에 부합하는 [[Call]] 내부 메서드를 가져야 한다.
내장 함수 객체는 그것이 “constructor”로 설명되거나, 또는 이 명세의 어떤
알고리즘이 그 [[Construct]] 내부 메서드를 명시적으로 설정하는 경우에만
[[Construct]] 내부 메서드를 가진다. 그러한 [[Construct]] 내부 메서드는
10.3.2
의 정의에 부합해야 한다.
구현은 이 명세에 정의되지 않은 추가적인 내장 함수 객체를 제공할 수
있다.
10.3.1[[Call]] ( thisArgument, argumentsList )
The [[Call]] internal method of 내장 함수 객체 func takes arguments thisArgument (an ECMAScript language value) and argumentsList (a List of ECMAScript language values) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:
The abstract operation BuiltinCallOrConstruct takes arguments func (a built-in function object), thisArgument (an ECMAScript language value or uninitialized), argumentsList (a List of ECMAScript language values), and newTarget (a constructor or undefined) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:
func, thisArgument, argumentsList, newTarget을 캡처하고,
호출될 때 다음 단계를 수행하는 매개변수 없는 새로운 Abstract
Closure를 resultsClosure라고 하자:
result를, func의 명세에 부합하는 방식으로 func를
평가한 결과인
Completion Record라고 하자. thisArgument가 uninitialized이면
this 값은 초기화되지 않은 상태이고; 그렇지 않으면
thisArgument가 this 값을 제공한다. argumentsList는 이름 있는
매개변수를 제공한다. newTarget은 NewTarget 값을 제공한다.
NOTE: func가 이 문서에 정의되어 있다면, “func의 명세”는
알고리즘 단계나 다른 수단을 통해 명시된 그 동작이다.
result를, func의 명세에
부합하는 방식으로 func를
평가한 결과인 Completion
Record라고 하자. thisArgument가 uninitialized이면 this 값은
초기화되지 않은 상태이고; 그렇지 않으면 thisArgument가 this 값을
제공한다. argumentsList는 이름 있는 매개변수를 제공한다.
newTarget은 NewTarget 값을 제공한다.
NOTE: func가 이 문서에 정의되어 있다면, “func의 명세”는
알고리즘 단계나 다른 수단을 통해 명시된 그 동작이다.
The abstract operation CreateBuiltinFunction takes arguments behaviour (an Abstract Closure, a set of algorithm steps, or some other definition of a function's behaviour provided in this specification), length (a non-negative integer or +∞), name (a property key or a Private Name), and additionalInternalSlotsList (a List of names of internal slots) and optional arguments realm (a Realm Record), prototype (an Object or null), prefix (a String), and async (a Boolean) and returns a built-in function object. additionalInternalSlotsList는 객체의 일부로 정의되어야 하는 추가
내부 슬롯의 이름들을 담고 있다. 이 연산은 내장 함수 객체를
생성한다. It performs the following steps when called:
func를, 호출되었을 때 제공된 인수들을 behaviour가 명시하는
대응 매개변수의 값으로 사용하여 behaviour가 설명하는 동작을
수행하는 새로운 내장 함수 객체라고 하자. 이 새로운 함수 객체는
이름이 internalSlotsList의 요소인 내부 슬롯들과 [[InitialName]]
내부 슬롯을 가진다.
이 명세에 정의된 각 내장 함수는 CreateBuiltinFunction 추상 연산을
호출하여 생성된다.
10.4 내장 이색 객체 내부 메서드와 슬롯
이 명세는 여러 종류의 내장 이색 객체를 정의한다. 이 객체들은 일반적으로
몇몇 특정 상황을 제외하면 일반 객체와 유사하게 동작한다. 다음 이색 객체들은,
아래에서 명시적으로 달리 규정된 경우를 제외하고는, 일반 객체 내부 메서드를
사용한다:
10.4.1 바인드 함수 이색 객체
바인드 함수 이색 객체는 다른 함수 객체를 감싸는 이색 객체이다. 바인드
함수 이색 객체는 호출 가능하다([[Call]] 내부 메서드를 가지며,
[[Construct]] 내부 메서드를 가질 수도 있다). 바인드 함수 이색 객체를
호출하면 일반적으로 그것이 감싸고 있는 함수가 호출된다.
객체는 그 [[Call]] 및 (해당하는 경우) [[Construct]] 내부 메서드가
다음 구현을 사용하고, 다른 essential 내부 메서드는
10.1
에서 찾을 수 있는 정의를 사용할 때
바인드 함수 이색 객체
이다. 이 메서드들은 BoundFunctionCreate에서 설치된다.
바인드 함수 이색 객체는
Table 25
에 나열된 ECMAScript 함수 객체의 내부 슬롯을 가지지 않는다. 대신
[[Prototype]] 및 [[Extensible]] 외에
Table 26
에 나열된 내부 슬롯을 가진다.
Table 26: Internal Slots of Bound Function Exotic Objects
그 요소들이 감싸고 있는 함수에 대한 모든 호출의 첫 번째 인수들로
사용되는 값들의 리스트.
10.4.1.1[[Call]] ( thisArgument, argumentsList )
The [[Call]] internal method of 바인드 함수 이색 객체func takes arguments thisArgument (an ECMAScript language value) and argumentsList (a List of ECMAScript language values) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:
Array는 배열 인덱스 프로퍼티 키를 특별하게 처리하는 이색 객체이다
(참조: 6.1.7). 프로퍼티 이름이
배열 인덱스인 프로퍼티는 element라고도 불린다. 모든 Array는
non-configurable한 "length" 프로퍼티를 가지며, 그 값은 수학적 값이
엄격히 232보다 작은, 항상 음이 아닌 정수 Number이다.
"length" 프로퍼티의 값은 이름이 배열 인덱스인 모든 자체 프로퍼티의
이름보다 수치적으로 더 크며; Array의 자체 프로퍼티가 생성되거나 변경될
때마다, 이 불변식을 유지하기 위해 다른 프로퍼티들이 필요에 따라 조정된다.
구체적으로, 이름이 배열 인덱스인 자체 프로퍼티가 추가될 때마다,
"length" 프로퍼티의 값은 필요하면 그 배열 인덱스의 수치값보다 1 큰
값으로 변경된다; 그리고 "length" 프로퍼티의 값이 변경될 때마다, 값이
새로운 length보다 작지 않은 이름의 배열 인덱스인 모든 자체 프로퍼티는
삭제된다. 이 제약은 Array의 자체 프로퍼티에만 적용되며, 그 프로토타입으로부터
상속될 수 있는 "length" 또는 배열 인덱스 프로퍼티의 영향을 받지
않는다.
객체는 그 [[DefineOwnProperty]] 내부 메서드가 다음 구현을 사용하고,
다른 essential 내부 메서드는
10.1
에서 찾을 수 있는 정의를 사용할 때
Array
이색 객체(또는 단순히 Array)이다. 이 메서드들은 ArrayCreate에서
설치된다.
The [[DefineOwnProperty]] internal method of Array 이색 객체array takes arguments propertyKey (a property key) and desc (a Property Descriptor) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
The abstract operation ArrayCreate takes argument length (a non-negative integer) and optional argument proto (an Object) and returns either a normal completion containing an Array exotic object or a throw completion. 이것은 새로운 Array의 생성을 명세하는 데 사용된다. It performs the following steps when called:
The abstract operation ArraySpeciesCreate takes arguments originalArray (an Object) and length (a non-negative integer) and returns either a normal completion containing an Object or a throw completion. 이것은 originalArray로부터 파생된 생성자 함수를 사용하여 새로운
Array 또는 유사 객체를 생성하는 것을 명세하는 데 사용된다. 이
연산은 생성자 함수가 Array를 반환해야 한다고 강제하지는 않는다. It performs the following steps when called:
originalArray가 현재 실행 중인 execution context의 realm이 아닌
realm에 대한 표준 내장 Array 생성자를 사용하여 생성되었다면, 새로운
Array는 현재 실행 중인 execution context의 realm을 사용하여
생성된다. 이것은 현재 ArraySpeciesCreate를 사용하여 정의되는
Array.prototype 메서드들에 대해 역사적으로 그러한 동작을 가져온
웹 브라우저와의 호환성을 유지한다.
10.4.2.4 ArraySetLength ( array, desc )
The abstract operation ArraySetLength takes arguments array (an Array) and desc (a Property Descriptor) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
단계 3 및
4에서,
desc.[[Value]]가 객체라면 그 valueOf 메서드는 두 번 호출된다.
이것은 이 명세 제2판부터 이러한 효과를 갖도록 명시된 legacy
동작이다.
10.4.3 문자열 이색 객체
String 객체는 String 값을 캡슐화하고, 그 String 값의 개별 코드 유닛
요소에 대응하는 가상 정수 인덱스 데이터 프로퍼티를 노출하는 이색
객체이다. 문자열 이색 객체는 항상 "length"라는 데이터 프로퍼티를
가지며, 그 값은 캡슐화된 String 값의 길이이다. 코드 유닛 데이터
프로퍼티와 "length" 프로퍼티는 모두 non-writable이고
non-configurable이다.
객체는 그 [[GetOwnProperty]], [[DefineOwnProperty]], 그리고
[[OwnPropertyKeys]] 내부 메서드가 다음 구현을 사용하고, 다른 essential
내부 메서드는
10.1
에서 찾을 수 있는 정의를 사용할 때
문자열
이색 객체(또는 단순히 String 객체)이다. 이 메서드들은
StringCreate에서 설치된다.
문자열 이색 객체는 일반 객체와 동일한 내부 슬롯을 가진다. 또한
[[StringData]] 내부 슬롯도 가진다.
10.4.3.1[[GetOwnProperty]] ( propertyKey )
The [[GetOwnProperty]] internal method of 문자열 이색 객체str takes argument propertyKey (a property key) and returns a normal completion containing either a Property Descriptor or undefined. It performs the following steps when called:
The [[DefineOwnProperty]] internal method of 문자열 이색 객체str takes arguments propertyKey (a property key) and desc (a Property Descriptor) and returns a normal completion containing a Boolean. It performs the following steps when called:
The [[OwnPropertyKeys]] internal method of 문자열 이색 객체obj takes no arguments and returns a normal completion containing a List of property keys. It performs the following steps when called:
obj의 각 자체 프로퍼티 키 propertyKey 중, propertyKey가
배열 인덱스이고 ! ToIntegerOrInfinity(propertyKey) ≥ len인
것에 대해, 숫자 인덱스 오름차순으로, 다음을 수행한다
propertyKey를 keys에 추가한다.
obj의 각 자체 프로퍼티 키 propertyKey 중, propertyKey가
String이고 배열 인덱스가 아닌 것에 대해, 프로퍼티 생성의 시간순
오름차순으로, 다음을 수행한다
propertyKey를 keys에 추가한다.
obj의 각 자체 프로퍼티 키 propertyKey 중, propertyKey가
Symbol인 것에 대해, 프로퍼티 생성의 시간순 오름차순으로, 다음을
수행한다
propertyKey를 keys에 추가한다.
keys를 반환한다.
10.4.3.4 StringCreate ( value, prototype )
The abstract operation StringCreate takes arguments value (a String) and prototype (an Object) and returns a String exotic object. 이것은 새로운 문자열 이색 객체의 생성을 명세하는 데
사용된다. It performs the following steps when called:
str를 MakeBasicObject(« [[Prototype]], [[Extensible]],
[[StringData]] »)라고 하자.
The abstract operation StringGetOwnProperty takes arguments str (an Object that has a [[StringData]] internal slot) and propertyKey (a property key) and returns a Property Descriptor or undefined. It performs the following steps when called:
대부분의 ECMAScript 함수는 자신의 코드에서 arguments 객체를 사용할 수
있게 한다. 함수 정의의 특성에 따라, 그 arguments 객체는 일반 객체이거나
arguments 이색 객체이다. arguments 이색 객체는 그 배열 인덱스
프로퍼티들이 연관된 ECMAScript 함수의 호출에 대한 형식 매개변수
바인딩에 매핑되는 이색 객체이다.
객체는, 여기에서 명시되지 않은 내부 메서드는
10.1
에 있는 정의를 사용하면서, 그 내부 메서드가 다음 구현을 사용할 때
arguments 이색 객체
이다. 이 메서드들은 CreateMappedArgumentsObject에서 설치된다.
arguments 이색 객체는 일반 객체와 동일한 내부 슬롯을 가진다. 또한
[[ParameterMap]] 내부 슬롯도 가진다. 일반 arguments 객체도
[[ParameterMap]] 내부 슬롯을 가지며, 그 값은 항상 undefined이다.
일반 arguments 객체의 경우 [[ParameterMap]] 내부 슬롯은
Object.prototype.toString
(20.1.3.6)에서
그것들을 그러한 것으로 식별하기 위해서만 사용된다.
Note 2
숫자 이름 값이 해당 함수 객체의 형식 매개변수 개수보다 작은
arguments 이색 객체의 정수 인덱스 데이터 프로퍼티는 처음에는 함수의
execution context 안의 대응 인수 바인딩과 그 값을 공유한다. 이는
프로퍼티를 변경하면 대응하는 인수 바인딩의 값도 바뀌고 그 반대도
마찬가지임을 뜻한다. 그러한 프로퍼티가 삭제된 뒤 다시 정의되거나,
그 프로퍼티가 접근자 프로퍼티로 변경되면 이 대응 관계는 깨진다.
arguments 객체가 일반 객체인 경우, 그 프로퍼티 값은 단순히 함수에
전달된 인수의 복사본이며, 프로퍼티 값과 형식 매개변수 값 사이에 동적
연결은 없다.
Note 3
ParameterMap 객체와 그 프로퍼티 값은 arguments 객체와 인수 바인딩
사이의 대응을 명세하기 위한 장치로 사용된다. ParameterMap 객체와 그
프로퍼티 값인 객체들은 ECMAScript 코드로부터 직접 관찰될 수 없다.
ECMAScript 구현은 명시된 의미론을 구현하기 위해 실제로 그러한 객체를
생성하거나 사용할 필요가 없다.
Note 4
일반 arguments 객체는 "callee"라는 이름의 non-configurable
접근자 프로퍼티를 정의하며, 이에 접근하면 TypeError 예외를 던진다.
"callee" 프로퍼티는 오직 일부 non-strict 함수들에 대해서만 생성되는
arguments 이색 객체에서는 더 구체적인 의미를 가진다. 일반 변형에서
이 프로퍼티를 이렇게 정의하는 것은, ECMAScript 적합 구현이 그것을
다른 방식으로 정의하지 않도록 보장하기 위해 존재한다.
Note 5
ECMAScript 구현의 arguments 이색 객체는 역사적으로 "caller"라는
이름의 접근자 프로퍼티를 포함해 왔다. ECMAScript 2017 이전에는, 이
명세는 일반 arguments 객체에 대해 예외를 던지는 "caller" 프로퍼티를
정의하고 있었다. 구현들이 더 이상 이 확장을 포함하지 않기 때문에,
ECMAScript 2017은 예외를 던지는 "caller" 접근자 요구사항을
제거했다.
10.4.4.1[[GetOwnProperty]] ( propertyKey )
The [[GetOwnProperty]] internal method of arguments 이색 객체args takes argument propertyKey (a property key) and returns a normal completion containing either a Property Descriptor or undefined. It performs the following steps when called:
The [[DefineOwnProperty]] internal method of arguments 이색 객체args takes arguments propertyKey (a property key) and desc (a Property Descriptor) and returns a normal completion containing a Boolean. It performs the following steps when called:
Assert: 다음 Set은 성공할 것인데, arguments 객체에 의해
매핑되는 형식 매개변수는 항상 쓰기 가능하기 때문이다.
! Set(map, propertyKey, desc.[[Value]], false)
를 수행한다.
desc가 [[Writable]] 필드를 가지고
desc.[[Writable]]가 false이면,
! map.[[Delete]](propertyKey)를 수행한다.
true를 반환한다.
10.4.4.3[[Get]] ( propertyKey, receiver )
The [[Get]] internal method of arguments 이색 객체args takes arguments propertyKey (a property key) and receiver (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:
The [[Set]] internal method of arguments 이색 객체args takes arguments propertyKey (a property key), value (an ECMAScript language value), and receiver (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
The [[Delete]] internal method of arguments 이색 객체args takes argument propertyKey (a property key) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
The abstract operation CreateUnmappedArgumentsObject takes argument argumentsList (a List of ECMAScript language values) and returns an ordinary object. It performs the following steps when called:
The abstract operation MakeArgGetter takes arguments name (a String) and env (an Environment Record) and returns a function object. 이것은 실행되었을 때 env 안에서 name에 바인딩된 값을
반환하는 built-in 함수 객체를 생성한다. It performs the following steps when called:
name과 env를 캡처하고, 호출될 때 다음 단계를 수행하는
매개변수 없는 새로운 Abstract Closure를 getterClosure라고
하자:
The abstract operation MakeArgSetter takes arguments name (a String) and env (an Environment Record) and returns a function object. 이것은 실행되었을 때 env 안에서 name에 바인딩된 값을
설정하는 built-in 함수 객체를 생성한다. It performs the following steps when called:
name과 env를 캡처하고, (value) 매개변수를 가지며 호출될
때 다음 단계를 수행하는 새로운 Abstract Closure를
setterClosure라고 하자:
TypedArray는 canonical numeric string인 프로퍼티 키를 특별하게
처리하는 이색 객체이며, 그 중 경계 내 정수 인덱스인 부분집합을 사용해
균일한 타입의 element에 인덱싱하고, 나머지는 프로토타입 체인 탐색을
발생시키지 않고 존재하지 않음을 보장하는 불변식을 강제한다.
Note
임의의 Number n에 대한 ToString(n)은 canonical numeric
string이므로, 구현은 TypedArray의 프로퍼티 키로 Number를 실제 문자열
변환 없이 취급할 수 있다.
TypedArray는 일반 객체와 동일한 내부 슬롯을 가지며, 추가로
[[ViewedArrayBuffer]], [[TypedArrayName]], [[ContentType]],
[[ByteLength]], [[ByteOffset]], [[ArrayLength]] 내부 슬롯을 가진다.
객체는 그 [[PreventExtensions]], [[GetOwnProperty]],
[[HasProperty]], [[DefineOwnProperty]], [[Get]], [[Set]], [[Delete]],
[[OwnPropertyKeys]] 내부 메서드가 이 절의 정의를 사용하고, 다른
essential 내부 메서드는
10.1
에서 찾을 수 있는 정의를 사용할 때
TypedArray
이다. 이 메서드들은 TypedArrayCreate에 의해 설치된다.
10.4.5.1[[PreventExtensions]] ( )
The [[PreventExtensions]] internal method of TypedArrayobj takes no arguments and returns a normal completion containing a Boolean. It performs the following steps when called:
NOTE: 6.1.7.3
에 명시된 확장 가능성과 관련된 불변식은, obj가 프로퍼티를 얻을
수 있거나(또는 잃었다가 다시 얻을 수 있거나), 이는 그 기반
버퍼가 리사이즈될 때 정수 인덱스 이름을 가진 프로퍼티에서 발생할
수 있는데, 그 경우 이 메서드가 true를 반환하는 것을 허용하지
않는다.
The [[GetOwnProperty]] internal method of TypedArrayobj takes argument propertyKey (a property key) and returns a normal completion containing either a Property Descriptor or undefined. It performs the following steps when called:
The [[HasProperty]] internal method of TypedArrayobj takes argument propertyKey (a property key) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
The [[DefineOwnProperty]] internal method of TypedArrayobj takes arguments propertyKey (a property key) and desc (a Property Descriptor) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
The [[Get]] internal method of TypedArrayobj takes arguments propertyKey (a property key) and receiver (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:
The [[Set]] internal method of TypedArrayobj takes arguments propertyKey (a property key), value (an ECMAScript language value), and receiver (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
The [[Delete]] internal method of TypedArrayobj takes argument propertyKey (a property key) and returns a normal completion containing a Boolean. It performs the following steps when called:
The [[OwnPropertyKeys]] internal method of TypedArrayobj takes no arguments and returns a normal completion containing a List of property keys. It performs the following steps when called:
obj의 각 자체 프로퍼티 키 propertyKey 중, propertyKey가
String이고 정수 인덱스가 아닌 것에 대해, 프로퍼티 생성의 시간순
오름차순으로, 다음을 수행한다
propertyKey를 keys에 추가한다.
obj의 각 자체 프로퍼티 키 propertyKey 중, propertyKey가
Symbol인 것에 대해, 프로퍼티 생성의 시간순 오름차순으로, 다음을
수행한다
propertyKey를 keys에 추가한다.
keys를 반환한다.
10.4.5.9 버퍼 witness record를 가진 TypedArray
TypedArray With Buffer Witness Record
는 viewed buffer의 캐시된 바이트 길이와 함께 TypedArray를 캡슐화하는
데 사용되는 Record 값이다. 이는 viewed buffer가 growable
SharedArrayBuffer일 때 byte length data block에 대한 ReadSharedMemory
event가 하나만 존재하도록 보장하는 데 도움을 주기 위해 사용된다.
TypedArray With Buffer Witness Record는
Table 27
에 나열된 필드를 가진다.
Record가 생성되었을 때 객체의 [[ViewedArrayBuffer]]의 바이트
길이.
10.4.5.10 MakeTypedArrayWithBufferWitnessRecord ( obj, order )
The abstract operation MakeTypedArrayWithBufferWitnessRecord takes arguments obj (a TypedArray) and order (seq-cst or unordered) and returns a TypedArray With Buffer Witness Record. It performs the following steps when called:
The abstract operation TypedArrayCreate takes argument prototype (an Object) and returns a TypedArray. 이것은 새로운 TypedArray의 생성을 명세하는 데 사용된다. It performs the following steps when called:
typedArray.[[OwnPropertyKeys]]를
10.4.5.8
에 명시된 대로 설정한다.
typedArray.[[Prototype]]를 prototype으로 설정한다.
typedArray를 반환한다.
10.4.5.12 TypedArrayByteLength ( taRecord )
The abstract operation TypedArrayByteLength takes argument taRecord (a TypedArray With Buffer Witness Record) and returns a non-negative integer. It performs the following steps when called:
NOTE: 반환되는 byte length는, 기반 버퍼가 정수배가 아닌 크기로
리사이즈된 경우에도 항상 elementSize의 정수배이다.
length × elementSize를 반환한다.
10.4.5.13 TypedArrayLength ( taRecord )
The abstract operation TypedArrayLength takes argument taRecord (a TypedArray With Buffer Witness Record) and returns a non-negative integer. It performs the following steps when called:
The abstract operation IsTypedArrayOutOfBounds takes argument taRecord (a TypedArray With Buffer Witness Record) and returns a Boolean. 이것은 객체의 수치 프로퍼티 중 어느 하나라도 기반 버퍼의 경계 안에
포함되지 않는 인덱스의 값을 참조하는지를 검사한다. It performs the following steps when called:
obj를 taRecord.[[Object]]라고 하자.
bufferByteLength를 taRecord.[[CachedBufferByteLength]]
라고 하자.
The abstract operation IsValidIntegerIndex takes arguments obj (a TypedArray) and index (a Number) and returns a Boolean. It performs the following steps when called:
The abstract operation TypedArrayGetElement takes arguments obj (a TypedArray) and index (a Number) and returns a Number, a BigInt, or undefined. It performs the following steps when called:
10.4.5.18 TypedArraySetElement ( obj, index, value )
The abstract operation TypedArraySetElement takes arguments obj (a TypedArray), index (a Number), and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:
obj.[[ContentType]]가 bigint이면, numValue를 ?
ToBigInt(value)라고 하자.
SetValueInBuffer(obj.[[ViewedArrayBuffer]], byteIndexInBuffer,
elementType, numValue, true, unordered)를 수행한다.
unused를 반환한다.
Note
이 연산은 항상 성공한 것처럼 보이지만, TypedArray의 끝을 넘어
쓰려고 시도하거나 detached ArrayBuffer를 backing으로 가진
TypedArray에 쓰려고 시도할 때는 아무 효과가 없다.
10.4.5.19 IsArrayBufferViewOutOfBounds ( obj )
The abstract operation IsArrayBufferViewOutOfBounds takes argument obj (a TypedArray or a DataView) and returns a Boolean. 이것은 TypedArray의 수치 프로퍼티들이나 DataView 객체의 메서드
중 어느 하나라도 기반 data block의 경계 안에 포함되지 않는 인덱스의
값을 참조할 수 있는지를 검사한다. 이 추상 연산은 상위 명세를 위한
편의 기능으로 존재한다. It performs the following steps when called:
모듈 네임스페이스 이색 객체는 ECMAScript Module에서 export된
바인딩을 노출하는 이색 객체이다 (참조:
16.2.3). 모듈 네임스페이스 이색
객체의 String 키를 가진 자체 프로퍼티와 Module이 export한 바인딩
이름 사이에는 일대일 대응이 있다. export된 바인딩에는 export *
export item을 사용하여 간접적으로 export된 바인딩도 포함된다.
각 String 값의 자체 프로퍼티 키는 대응하는 export된 바인딩 이름의
StringValue이다. 이것들만이 모듈 네임스페이스 이색 객체의 String 키
프로퍼티이다. 각 그러한 프로퍼티는 { [[Writable]]: true,
[[Enumerable]]: true, [[Configurable]]: false } 속성을 가진다.
모듈 네임스페이스 이색 객체는 확장 가능하지 않다.
객체는 그 [[GetPrototypeOf]], [[SetPrototypeOf]], [[IsExtensible]],
[[PreventExtensions]], [[GetOwnProperty]], [[DefineOwnProperty]],
[[HasProperty]], [[Get]], [[Set]], [[Delete]], [[OwnPropertyKeys]] 내부
메서드가 이 절의 정의를 사용하고, 다른 essential 내부 메서드는
10.1
에서 찾을 수 있는 정의를 사용할 때
모듈 네임스페이스 이색 객체
이다. 이 메서드들은 ModuleNamespaceCreate에 의해 설치된다.
이 객체의 자체 프로퍼티로 노출되는 export 이름들의 String 값을
요소로 가지는 List. 이 리스트는 코드 유닛 사전식 순서에 따라
정렬된다.
10.4.6.1[[GetPrototypeOf]] ( )
The [[GetPrototypeOf]] internal method of 모듈 네임스페이스 이색 객체 takes no arguments and returns a normal completion containing null. It performs the following steps when called:
null을 반환한다.
10.4.6.2[[SetPrototypeOf]] ( proto )
The [[SetPrototypeOf]] internal method of 모듈 네임스페이스 이색 객체obj takes argument proto (an Object or null) and returns a normal completion containing a Boolean. It performs the following steps when called:
The [[IsExtensible]] internal method of 모듈 네임스페이스 이색 객체 takes no arguments and returns a normal completion containing false. It performs the following steps when called:
false를 반환한다.
10.4.6.4[[PreventExtensions]] ( )
The [[PreventExtensions]] internal method of 모듈 네임스페이스 이색 객체 takes no arguments and returns a normal completion containing true. It performs the following steps when called:
The [[DefineOwnProperty]] internal method of 모듈 네임스페이스 이색 객체obj takes arguments propertyKey (a property key) and desc (a Property Descriptor) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
The [[HasProperty]] internal method of 모듈 네임스페이스 이색 객체obj takes argument propertyKey (a property key) and returns a normal completion containing a Boolean. It performs the following steps when called:
The [[Get]] internal method of 모듈 네임스페이스 이색 객체obj takes arguments propertyKey (a property key) and receiver (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:
? targetEnv.GetBindingValue(binding.[[BindingName]], true)
를 반환한다.
Note
ResolveExport는 부작용이 없다. 이 연산이 특정 exportName,
resolveSet 쌍을 인수로 호출될 때마다 반드시 같은 결과를 반환해야
한다. 구현은 각 모듈 네임스페이스 이색 객체의 [[Exports]]에 대한
ResolveExport 결과를 미리 계산하거나 캐시하도록 선택할 수 있다.
10.4.6.9[[Set]] ( propertyKey, value, receiver )
The [[Set]] internal method of 모듈 네임스페이스 이색 객체 takes arguments propertyKey (a property key), value (an ECMAScript language value), and receiver (an ECMAScript language value) and returns a normal completion containing false. It performs the following steps when called:
false를 반환한다.
10.4.6.10[[Delete]] ( propertyKey )
The [[Delete]] internal method of 모듈 네임스페이스 이색 객체obj takes argument propertyKey (a property key) and returns a normal completion containing a Boolean. It performs the following steps when called:
The abstract operation ModuleNamespaceCreate takes arguments module (a Module Record) and exports (a List of Strings) and returns a module namespace exotic object. 이것은 새로운 모듈 네임스페이스 이색 객체의 생성을 명세하는 데
사용된다. It performs the following steps when called:
The [[SetPrototypeOf]] internal method of 불변 프로토타입 이색 객체obj takes argument proto (an Object or null) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
The abstract operation SetImmutablePrototype takes arguments obj (an Object) and proto (an Object or null) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
프록시 객체는 essential 내부 메서드가 부분적으로 ECMAScript 코드를
사용하여 구현되는 이색 객체이다. 모든 프록시 객체는 [[ProxyHandler]]라는
내부 슬롯을 가진다. [[ProxyHandler]]의 값은 프록시의
handler object라고 불리는 객체이거나 null이다. handler
object의 메서드(참조:
Table 29)는 프록시 객체의
하나 이상의 내부 메서드 구현을 보강하는 데 사용될 수 있다. 모든 프록시
객체는 또한 [[ProxyTarget]]이라는 내부 슬롯을 가지며, 그 값은 객체 또는
null이다. 이 객체는 프록시의 target object라고 불린다.
객체는 그 essential 내부 메서드(해당하는 경우 [[Call]] 및
[[Construct]] 포함)가 이 절의 정의를 사용할 때
프록시 이색 객체
이다. 이 내부 메서드들은 ProxyCreate에서 설치된다.
Table 29: Proxy Handler Methods
내부 메서드
핸들러 메서드
[[GetPrototypeOf]]
getPrototypeOf
[[SetPrototypeOf]]
setPrototypeOf
[[IsExtensible]]
isExtensible
[[PreventExtensions]]
preventExtensions
[[GetOwnProperty]]
getOwnPropertyDescriptor
[[DefineOwnProperty]]
defineProperty
[[HasProperty]]
has
[[Get]]
get
[[Set]]
set
[[Delete]]
deleteProperty
[[OwnPropertyKeys]]
ownKeys
[[Call]]
apply
[[Construct]]
construct
프록시 객체 내부 메서드의 구현을 제공하기 위해 handler 메서드가
호출될 때, 그 handler 메서드에는 프록시의 target object가 매개변수로
전달된다. 프록시의 handler object가 반드시 모든 essential 내부 메서드에
대응하는 메서드를 가지는 것은 아니다. 프록시에 대한 내부 메서드 호출은,
handler object가 대응하는 내부 trap에 대한 메서드를 가지지 않을 경우,
프록시의 target object에 대한 대응 내부 메서드 호출이 일어나게 한다.
프록시 객체의 [[ProxyHandler]] 및 [[ProxyTarget]] 내부 슬롯은 객체가
생성될 때 항상 초기화되며, 일반적으로 수정될 수 없다. 일부 프록시 객체는
나중에 revoked될 수 있도록 허용하는 방식으로 생성된다. 프록시가
revoked되면, 그 [[ProxyHandler]]와 [[ProxyTarget]] 내부 슬롯은 null로
설정되며, 그 결과 그 프록시 객체에 대한 이후의 내부 메서드 호출은
TypeError 예외를 던지게 된다.
프록시 객체는 내부 메서드의 구현을 임의의 ECMAScript 코드로 제공할 수
있게 허용하기 때문에,
6.1.7.3
에 정의된 불변식을 위반하는 handler 메서드를 가진 프록시 객체를 정의하는
것이 가능하다.
6.1.7.3
에 정의된 내부 메서드 불변식 중 일부는 essential 무결성 불변식이다.
이러한 불변식은 이 절에 명시된 프록시 객체 내부 메서드에 의해 명시적으로
강제된다. ECMAScript 구현은 가능한 모든 불변식 위반이 존재하는 상황에서도
견고해야 한다.
다음 알고리즘 설명에서, obj는 ECMAScript 프록시 객체이고,
propertyKey는 프로퍼티 키 값이며, value는 임의의 ECMAScript 언어
값이고, desc는 Property Descriptor 레코드라고 가정한다.
10.5.1[[GetPrototypeOf]] ( )
The [[GetPrototypeOf]] internal method of 프록시 이색 객체obj takes no arguments and returns either a normal completion containing either an Object or null, or a throw completion. It performs the following steps when called:
target 객체가 확장 가능하지 않다면, 프록시 객체에 적용된
[[GetPrototypeOf]]는 프록시 객체의 target 객체에 적용된
[[GetPrototypeOf]]와 같은 값을 반환해야 한다.
10.5.2[[SetPrototypeOf]] ( proto )
The [[SetPrototypeOf]] internal method of 프록시 이색 객체obj takes argument proto (an Object or null) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
target 객체가 확장 가능하지 않다면, 인수 값은 target 객체에
[[GetPrototypeOf]]를 적용한 결과와 같아야 한다.
10.5.3[[IsExtensible]] ( )
The [[IsExtensible]] internal method of 프록시 이색 객체obj takes no arguments and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
프록시 객체에 적용된 [[IsExtensible]]는 같은 인수로 프록시 객체의
target 객체에 적용된 [[IsExtensible]]와 같은 값을 반환해야 한다.
10.5.4[[PreventExtensions]] ( )
The [[PreventExtensions]] internal method of 프록시 이색 객체obj takes no arguments and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
프록시 객체에 적용된 [[PreventExtensions]]는 프록시 객체의 target
객체에 [[IsExtensible]]를 적용했을 때 false인 경우에만 true를
반환한다.
10.5.5[[GetOwnProperty]] ( propertyKey )
The [[GetOwnProperty]] internal method of 프록시 이색 객체obj takes argument propertyKey (a property key) and returns either a normal completion containing either a Property Descriptor or undefined, or a throw completion. It performs the following steps when called:
target 객체에 non-configurable 자체 프로퍼티로 존재하는
프로퍼티는 존재하지 않는 것으로 보고될 수 없다.
non-extensible target 객체의 자체 프로퍼티로 존재하는 프로퍼티는
존재하지 않는 것으로 보고될 수 없다.
target 객체에 자체 프로퍼티로 존재하지 않고 target 객체가 확장
가능하지 않은 경우, 그 프로퍼티는 존재하는 것으로 보고될 수 없다.
프로퍼티는 target 객체의 대응하는 non-configurable 자체 프로퍼티로
존재하지 않는 한 non-configurable로 보고될 수 없다.
프로퍼티는 target 객체의 대응하는 non-configurable,
non-writable 자체 프로퍼티로 존재하지 않는 한,
non-configurable이면서 non-writable인 것으로 보고될 수 없다.
10.5.6[[DefineOwnProperty]] ( propertyKey, desc )
The [[DefineOwnProperty]] internal method of 프록시 이색 객체obj takes arguments propertyKey (a property key) and desc (a Property Descriptor) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
desc가 [[Writable]] 필드를 가지고
desc.[[Writable]]가 false이면, TypeError 예외를
던진다.
true를 반환한다.
Note
프록시 객체에 대한 [[DefineOwnProperty]]는 다음 불변식을
강제한다:
[[DefineOwnProperty]]의 결과는 Boolean 값이다.
target 객체가 확장 가능하지 않다면 프로퍼티는 추가될 수 없다.
target 객체에 대응하는 non-configurable 자체 프로퍼티가 존재하지
않는 한, 프로퍼티는 non-configurable일 수 없다.
target 객체에 대응하는 non-configurable, non-writable 자체
프로퍼티가 존재하지 않는 한, non-configurable 프로퍼티는
non-writable일 수 없다.
프로퍼티가 대응하는 target 객체 프로퍼티를 가지는 경우, 그
프로퍼티의 Property Descriptor를 [[DefineOwnProperty]]를 사용하여
target 객체에 적용해도 예외를 던지지 않는다.
10.5.7[[HasProperty]] ( propertyKey )
The [[HasProperty]] internal method of 프록시 이색 객체obj takes argument propertyKey (a property key) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
target 객체에 non-configurable 자체 프로퍼티로 존재하는
프로퍼티는 존재하지 않는 것으로 보고될 수 없다.
target 객체의 자체 프로퍼티로 존재하고 target 객체가 확장
가능하지 않은 경우, 그 프로퍼티는 존재하지 않는 것으로 보고될 수
없다.
10.5.8[[Get]] ( propertyKey, receiver )
The [[Get]] internal method of 프록시 이색 객체obj takes arguments propertyKey (a property key) and receiver (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:
target 객체의 대응 프로퍼티가 non-writable,
non-configurable 자체 데이터 프로퍼티라면, 프로퍼티에 대해 보고된
값은 그 target 객체 프로퍼티의 값과 같아야 한다.
target 객체의 대응 프로퍼티가 [[Get]] 속성으로 undefined를 가진
non-configurable 자체 접근자 프로퍼티라면, 프로퍼티에 대해 보고된
값은 반드시 undefined이어야 한다.
10.5.9[[Set]] ( propertyKey, value, receiver )
The [[Set]] internal method of 프록시 이색 객체obj takes arguments propertyKey (a property key), value (an ECMAScript language value), and receiver (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
대응하는 target 객체 프로퍼티가 non-writable,
non-configurable 자체 데이터 프로퍼티인 경우, 그 프로퍼티의 값을
대응하는 target 객체 프로퍼티의 값과 다르게 변경할 수 없다.
대응하는 target 객체 프로퍼티가 [[Set]] 속성으로 undefined를
가진 non-configurable 자체 접근자 프로퍼티인 경우, 그 프로퍼티의
값을 설정할 수 없다.
10.5.10[[Delete]] ( propertyKey )
The [[Delete]] internal method of 프록시 이색 객체obj takes argument propertyKey (a property key) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
결과 List는 target 객체의 모든 non-configurable 자체 프로퍼티의
키를 포함해야 한다.
target 객체가 확장 가능하지 않다면, 결과 List는 target 객체의
모든 자체 프로퍼티의 키를 포함해야 하며 다른 값은 포함해서는 안
된다.
10.5.12[[Call]] ( thisArgument, argumentsList )
The [[Call]] internal method of 프록시 이색 객체obj takes arguments thisArgument (an ECMAScript language value) and argumentsList (a List of ECMAScript language values) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:
newObj를 ? Call(trap, handler,
« target, argArray, newTarget »)라고 하자.
newObj가 Object가 아니면, TypeError 예외를 던진다.
newObj를 반환한다.
Note 1
프록시 이색 객체는 그 [[ProxyTarget]] 내부 슬롯의 초기값이
[[Construct]] 내부 메서드를 가진 객체인 경우에만 [[Construct]]
내부 메서드를 가진다.
Note 2
프록시 객체에 대한 [[Construct]]는 다음 불변식을 강제한다:
[[Construct]]의 결과는 반드시 Object여야 한다.
10.5.14 ValidateNonRevokedProxy ( proxy )
The abstract operation ValidateNonRevokedProxy takes argument proxy (a Proxy exotic object) and returns either a normal completion containing unused or a throw completion. proxy가 revoked되었으면 TypeError 예외를 던진다. It performs the following steps when called:
The abstract operation ProxyCreate takes arguments target (an ECMAScript language value) and handler (an ECMAScript language value) and returns either a normal completion containing a Proxy exotic object or a throw completion. 이것은 새로운 프록시 객체의 생성을 명세하는 데 사용된다. It performs the following steps when called:
target이 Object가 아니면, TypeError 예외를 던진다.
handler가 Object가 아니면, TypeError 예외를 던진다.
proxy를 MakeBasicObject(« [[ProxyHandler]], [[ProxyTarget]] »)
라고 하자.
proxy의 essential 내부 메서드 중 [[Call]]과 [[Construct]]를
제외한 것들을
10.5
에 명시된 정의로 설정한다.
ECMAScript 소스 텍스트는 유니코드 코드 포인트들의 시퀀스이다. ECMAScript 문법이 허용하는 곳에서는, 서로게이트 코드 포인트를 포함하여 U+0000부터 U+10FFFF까지의 모든 유니코드 코드 포인트 값이 ECMAScript 소스 텍스트에 나타날 수 있다. ECMAScript 소스 텍스트를 저장하고 교환하는 데 사용되는 실제 인코딩은 이 명세와 관련이 없다. 외부 소스 텍스트 인코딩과 관계없이, 적합한 ECMAScript 구현은 소스 텍스트를 마치 동등한 SourceCharacter 값들의 시퀀스인 것처럼 처리하는데, 각 SourceCharacter는 하나의 유니코드 코드 포인트이다. 적합한 ECMAScript 구현은 소스 텍스트에 대해 어떤 정규화도 수행할 필요가 없으며, 마치 소스 텍스트 정규화를 수행하는 것처럼 동작할 필요도 없다.
결합 문자 시퀀스의 구성 요소들은, 사용자가 전체 시퀀스를 하나의 문자로 생각할 수 있더라도, 각각 개별 유니코드 코드 포인트로 취급된다.
Note
문자열 리터럴, 정규식 리터럴, 템플릿 리터럴, 식별자 안에서는, 임의의 유니코드 코드 포인트를 그 코드 포인트의 수치 값을 명시적으로 표현하는 유니코드 이스케이프 시퀀스를 사용해 나타낼 수도 있다. 주석 안에서 그러한 이스케이프 시퀀스는 사실상 주석의 일부로 무시된다.
ECMAScript는 유니코드 이스케이프 시퀀스의 동작에서 자바 프로그래밍 언어와 다르다. 예를 들어 자바 프로그램에서 유니코드 이스케이프 시퀀스 \u000A가 단일 행 주석 안에 나타나면, 그것은 줄 종결자(유니코드 코드 포인트 U+000A는 LINE FEED (LF)이다)로 해석되며, 따라서 다음 코드 포인트는 더 이상 주석의 일부가 아니다. 마찬가지로 자바 프로그램에서 유니코드 이스케이프 시퀀스 \u000A가 문자열 리터럴 안에 나타나면, 역시 줄 종결자로 해석되는데, 이는 문자열 리터럴 안에서는 허용되지 않는다—문자열 리터럴 값의 일부로 LINE FEED (LF)를 포함시키려면 \u000A 대신 \n을 써야 한다. ECMAScript 프로그램에서는 주석 안에 나타난 유니코드 이스케이프 시퀀스는 결코 해석되지 않으므로 주석의 종료에 기여할 수 없다. 마찬가지로 ECMAScript 프로그램에서 문자열 리터럴 안에 나타난 유니코드 이스케이프 시퀀스는 항상 그 리터럴의 일부에 기여하며, 결코 줄 종결자나 문자열 리터럴을 종료시킬 수 있는 코드 포인트로 해석되지 않는다.
The abstract operation UTF16EncodeCodePoint takes argument cp (a Unicode code point) and returns a String. It performs the following steps when called:
cp ≤ 0xFFFF이면, 수치 값이 cp인 코드 단위로 이루어진 String 값을 반환한다.
cu1을 수치 값이 floor((cp - 0x10000) / 0x400) + 0xD800인 코드 단위라고 하자.
cu2를 수치 값이 ((cp - 0x10000) modulo 0x400) + 0xDC00인 코드 단위라고 하자.
cu1과 cu2의 문자열 연결을 반환한다.
11.1.2 Static Semantics: CodePointsToString ( text )
The abstract operation CodePointsToString takes argument text (a sequence of Unicode code points) and returns a String. 이것은 6.1.4에 설명된 대로 text를 String 값으로 변환한다. It performs the following steps when called:
The abstract operation UTF16SurrogatePairToCodePoint takes arguments lead (a code unit) and trail (a code unit) and returns a code point. UTF-16 서로게이트 쌍을 이루는 두 코드 단위는 하나의 코드 포인트로 변환된다. It performs the following steps when called:
11.1.4 Static Semantics: CodePointAt ( string, position )
The abstract operation CodePointAt takes arguments string (a String) and position (a non-negative integer) and returns a Record with fields [[CodePoint]] (a code point), [[CodeUnitCount]] (a positive integer), and [[IsUnpairedSurrogate]] (a Boolean). 이것은 6.1.4에 설명된 대로 string을 UTF-16으로 인코딩된 코드 포인트들의 시퀀스로 해석하고, 인덱스 position의 코드 단위에서 시작하는 하나의 코드 포인트를 읽는다. It performs the following steps when called:
The abstract operation StringToCodePoints takes argument string (a String) and returns a List of code points. 이것은 6.1.4에 설명된 대로 string을 UTF-16으로 인코딩된 유니코드 텍스트로 해석한 결과 얻어지는 유니코드 코드 포인트들의 시퀀스를 반환한다. It performs the following steps when called:
The abstract operation ParseText takes arguments sourceText (a String or a sequence of Unicode code points) and goalSymbol (a nonterminal in one of the ECMAScript grammars) and returns a Parse Node or a non-empty List of SyntaxError objects. It performs the following steps when called:
goalSymbol을 goal symbol로 사용하여 sourceText를 파싱하려 시도하고, 파싱 결과를 early error 조건에 대해 분석한다. 파싱과 early error 검출은 구현 정의된 방식으로 상호 교차되어 수행될 수 있다.
파싱이 성공하고 early error가 발견되지 않았다면, 파싱 결과로 생성된 파스 트리의 루트에 있는 Parse Node(goalSymbol의 인스턴스)를 반환한다.
파싱 오류 및/또는 early error를 나타내는 하나 이상의 SyntaxError 객체의 List를 반환한다. 둘 이상의 파싱 오류 또는 early error가 존재하는 경우, 리스트 안의 오류 객체의 개수와 순서는 구현 정의이지만, 최소 하나는 반드시 존재해야 한다.
Note 1
특정 지점에 early error가 있고, 더 뒤의 지점에 syntax error도 있는 텍스트를 생각해 보자. 먼저 파싱 패스를 수행한 다음 early errors 패스를 수행하는 구현은 syntax error를 보고하고 early errors 패스로 진행하지 않을 수 있다. 두 작업을 상호 교차하여 수행하는 구현은 early error를 보고하고 syntax error를 찾으러 진행하지 않을 수 있다. 세 번째 구현은 두 오류를 모두 보고할 수도 있다. 이 모든 동작은 적합하다.
함수 코드는 일반적으로 함수 정의(15.2), 화살표 함수 정의(15.3), 메서드 정의(15.4), 제너레이터 함수 정의(15.5), 비동기 함수 정의(15.8), 비동기 제너레이터 함수 정의(15.6), 비동기 화살표 함수(15.9)의 본문으로 제공된다. 함수 코드는 또한 Function 생성자(20.2.1.1), GeneratorFunction 생성자(27.3.1.1), AsyncFunction 생성자(27.7.1.1), AsyncGeneratorFunction 생성자(27.4.1.1)에 대한 인수로부터도 파생된다.
내장 Function, Generator, AsyncFunction, AsyncGenerator 생성자에 대한 인수로 제공되는 함수 코드는, 마지막 인수가 String이고 그것을 처리했을 때 Use Strict 지시어를 포함하는 지시어 프롤로그로 시작하는 FunctionBody가 되면 strict mode 코드이다.
strict mode 코드가 아닌 ECMAScript 코드는 non-strict 코드라고 한다.
11.2.2.1 Static Semantics: IsStrict ( node )
The abstract operation IsStrict takes argument node (a Parse Node) and returns a Boolean. It performs the following steps when called:
ECMAScript 구현은 평가 동작이 ECMAScript 소스 텍스트가 아닌 어떤 호스트 정의 실행 코드 형식으로 표현되는 함수 이색 객체의 평가를 지원할 수 있다. 함수 객체가 ECMAScript 코드 안에서 정의되었는지, 또는 내장 함수인지는, 그러한 함수 객체를 호출하거나 그러한 함수 객체에 의해 호출되는 ECMAScript 코드의 관점에서는 관찰 가능하지 않다.
12 ECMAScript 언어: 어휘 문법
ECMAScript Script 또는 Module의 소스 텍스트는 먼저 입력 요소들의 시퀀스로 변환되며, 이들은 토큰, 줄 종결자, 주석, 또는 공백이다. 소스 텍스트는 왼쪽에서 오른쪽으로 스캔되며, 가능한 한 가장 긴 코드 포인트 시퀀스를 다음 입력 요소로 반복해서 취한다.
여러 어휘 goal을 사용하는 것은 자동 세미콜론 삽입에 영향을 줄 수 있는 어휘적 모호성이 없도록 보장한다. 예를 들어, 선행 division 또는 division-assignment와 선행 RegularExpressionLiteral이 모두 허용되는 구문 문법 문맥은 없다. 이것은 세미콜론 삽입의 영향을 받지 않는다(참조: 12.10); 다음과 같은 예에서:
a = b
/hi/g.exec(c).map(d);
LineTerminator 뒤의 첫 번째 비공백, 비주석 코드 포인트가 U+002F (SOLIDUS)이고 구문 문맥이 division 또는 division-assignment를 허용하는 경우, LineTerminator에 세미콜론은 삽입되지 않는다. 즉, 위 예시는 다음과 같은 방식으로 해석된다:
유니코드 형식 제어 문자(즉, LEFT-TO-RIGHT MARK 또는 RIGHT-TO-LEFT MARK와 같은 Unicode Character Database의 “Cf” 범주에 속하는 문자)는, 상위 수준 프로토콜(예: 마크업 언어)이 없는 상황에서 텍스트 범위의 형식을 제어하는 데 사용되는 제어 코드이다.
편집과 표시를 용이하게 하기 위해 소스 텍스트에서 형식 제어 문자를 허용하는 것이 유용하다. 모든 형식 제어 문자는 주석 안에서, 그리고 문자열 리터럴, 템플릿 리터럴, 정규식 리터럴 안에서 사용할 수 있다.
U+FEFF (ZERO WIDTH NO-BREAK SPACE)는 주로 텍스트 시작 부분에서 그것이 Unicode임을 표시하고 텍스트의 인코딩 및 바이트 순서를 감지할 수 있도록 하는 데 사용되는 형식 제어 문자이다. 이런 목적의 <ZWNBSP> 문자는 파일을 연결한 결과처럼 텍스트 시작 뒤에도 나타날 수 있다. ECMAScript 소스 텍스트에서 <ZWNBSP> 코드 포인트는 주석, 문자열 리터럴, 템플릿 리터럴, 정규식 리터럴 바깥에서는 공백 문자로 취급된다(참조: 12.2).
12.2 공백
공백 코드 포인트는 소스 텍스트의 가독성을 높이고 토큰(분해할 수 없는 어휘 단위)들을 서로 분리하는 데 사용되지만, 그 외에는 중요하지 않다. 공백 코드 포인트는 임의의 두 토큰 사이와 입력의 시작 또는 끝에 나타날 수 있다. 공백 코드 포인트는 StringLiteral, RegularExpressionLiteral, Template, 또는 TemplateSubstitutionTail 안에 나타날 수 있으며, 이 경우 리터럴 값의 일부를 이루는 중요한 코드 포인트로 간주된다. 또한 Comment 안에도 나타날 수 있지만, 다른 종류의 토큰 안에는 나타날 수 없다.
general category “Space_Separator”에 속하는 임의의 코드 포인트
<USP>
Note 1
U+0020 (SPACE) 및 U+00A0 (NO-BREAK SPACE) 코드 포인트는 <USP>의 일부이다.
Note 2
Table 30에 나열된 코드 포인트를 제외하면, ECMAScript WhiteSpace는 유니코드 “White_Space” 속성을 가지지만 general category “Space_Separator” (“Zs”)로 분류되지 않는 모든 코드 포인트를 의도적으로 제외한다.
공백 코드 포인트와 마찬가지로, 줄 종결자 코드 포인트는 소스 텍스트의 가독성을 높이고 토큰(분해할 수 없는 어휘 단위)들을 서로 분리하는 데 사용된다. 그러나 공백 코드 포인트와 달리, 줄 종결자는 구문 문법의 동작에 어느 정도 영향을 미친다. 일반적으로 줄 종결자는 임의의 두 토큰 사이에 나타날 수 있지만, 구문 문법에 의해 금지되는 몇몇 위치가 있다. 줄 종결자는 자동 세미콜론 삽입 과정에도 영향을 미친다(12.10). 줄 종결자는 StringLiteral, Template, 또는 TemplateSubstitutionTail을 제외한 어떤 토큰 안에도 나타날 수 없다. <LF> 및 <CR> 줄 종결자는 LineContinuation의 일부인 경우를 제외하면 StringLiteral 토큰 안에 나타날 수 없다.
Table 31의 유니코드 코드 포인트만 줄 종결자로 취급된다. 다른 새 줄 또는 줄 바꿈 유니코드 코드 포인트는 줄 종결자로 취급되지 않지만, Table 30에 나열된 요구사항을 만족하면 공백으로 취급된다. <CR><LF> 시퀀스는 흔히 줄 종결자로 사용된다. 줄 번호를 보고하는 목적상 이것은 하나의 SourceCharacter로 간주되어야 한다.
단일 행 주석은 LineTerminator 코드 포인트를 제외한 임의의 유니코드 코드 포인트를 포함할 수 있고, 토큰은 항상 가능한 한 길다는 일반 규칙 때문에, 단일 행 주석은 항상 // 표시부터 줄 끝까지의 모든 코드 포인트로 구성된다. 그러나 줄 끝의 LineTerminator는 단일 행 주석의 일부로 간주되지 않으며; 어휘 문법에 의해 별도로 인식되어 구문 문법을 위한 입력 요소 스트림의 일부가 된다. 이 점은 매우 중요한데, 단일 행 주석의 존재 여부가 자동 세미콜론 삽입 과정에 영향을 주지 않음을 의미하기 때문이다(참조: 12.10).
IdentifierName과 ReservedWord는, 약간의 수정과 함께 Unicode Standard Annex #31, Identifier and Pattern Syntax에 주어진 Default Identifier Syntax에 따라 해석되는 토큰이다. ReservedWord는 IdentifierName의 열거된 부분집합이다. 구문 문법은 Identifier를 ReservedWord가 아닌 IdentifierName으로 정의한다. 유니코드 식별자 문법은 Unicode Standard에 명시된 문자 속성에 기반한다. Unicode Standard 최신 버전에서 지정된 범주에 속하는 유니코드 코드 포인트는 모든 적합한 ECMAScript 구현에서 그 범주에 속하는 것으로 취급되어야 한다. ECMAScript 구현은 Unicode Standard의 더 이후 판에서 정의된 식별자 코드 포인트를 인식할 수 있다.
Note 1
이 표준은 특정 코드 포인트 추가를 명시한다: U+0024 (DOLLAR SIGN)와 U+005F (LOW LINE)는 IdentifierName 어디에서나 허용된다.
The syntax-directed operation IdentifierCodePoints takes no arguments and returns a List of code points. It is defined piecewise over the following productions:
키워드는 IdentifierName에 매치되는 토큰이지만, 동시에 구문적 용법도 가진다; 즉, 어떤 구문 production 안에서 fixed width 글꼴로 문자 그대로 나타난다. ECMAScript의 키워드에는 if, while, async, await 등 많은 것들이 포함된다.
예약어는 식별자로 사용할 수 없는 IdentifierName이다. 많은 키워드가 예약어이지만, 일부는 그렇지 않고, 일부는 특정 문맥에서만 예약된다. if와 while은 예약어이다. await는 async 함수와 모듈 내부에서만 예약된다. async는 예약어가 아니다; 제한 없이 변수 이름이나 문장 라벨로 사용할 수 있다.
이 명세는 문법 production과 early error 규칙의 조합을 사용하여 어떤 이름이 유효한 식별자이고 어떤 이름이 예약어인지 명시한다. 아래 ReservedWord 목록의 모든 토큰은 await와 yield를 제외하고는 무조건 예약된다. await와 yield에 대한 예외는 13.1에서 매개변수화된 구문 production을 사용하여 명시된다. 마지막으로, 여러 early error 규칙이 유효한 식별자의 집합을 제한한다. 13.1.1, 14.3.1.1, 14.7.5.1, 그리고 15.7.1를 보라. 요약하면, 식별자 이름에는 다섯 가지 범주가 있다:
Math, window, toString, _처럼, 항상 식별자로 허용되고 키워드가 아닌 것들;
await와 yield를 제외한 아래 나열된 ReservedWord들처럼, 절대로 식별자로 허용되지 않는 것들;
await와 yield처럼, 문맥적으로 식별자로 허용되는 것들;
strict mode 코드에서 문맥적으로 식별자로 허용되지 않는 것들: let, static, implements, interface, package, private, protected, public;
항상 식별자로 허용되지만, Identifier가 허용되지 않는 특정 구문 production 안에서는 키워드로도 나타나는 것들: as, async, from, get, meta, of, set, target.
조건부 키워드 또는 문맥 키워드라는 용어는 때때로 마지막 세 범주에 속하는 키워드를 가리키는 데 사용되며, 따라서 어떤 문맥에서는 식별자로, 다른 문맥에서는 키워드로 사용될 수 있다.
The syntax-directed operation NumericValue takes no arguments and returns a Number or a BigInt. It is defined piecewise over the following productions:
문자열 리터럴은 작은따옴표 또는 큰따옴표로 둘러싸인 0개 이상의 유니코드 코드 포인트이다. 유니코드 코드 포인트는 이스케이프 시퀀스를 사용해 표현될 수도 있다. 닫는 따옴표 코드 포인트, U+005C (REVERSE SOLIDUS), U+000D (CARRIAGE RETURN), U+000A (LINE FEED)를 제외한 모든 코드 포인트는 문자열 리터럴 안에 문자 그대로 나타날 수 있다. 어떤 코드 포인트든 이스케이프 시퀀스 형태로 나타날 수 있다. 문자열 리터럴은 ECMAScript String 값으로 평가된다. 이 String 값을 생성할 때 유니코드 코드 포인트는 11.1.1에 정의된 대로 UTF-16으로 인코딩된다. Basic Multilingual Plane에 속하는 코드 포인트는 문자열의 하나의 코드 단위 요소로 인코딩된다. 그 외 모든 코드 포인트는 문자열의 두 개 코드 단위 요소로 인코딩된다.
<LF>와 <CR>은 빈 코드 포인트 시퀀스를 생성하는 LineContinuation의 일부인 경우를 제외하고 문자열 리터럴 안에 나타날 수 없다. 문자열 리터럴의 String 값 안에 이들 중 하나를 포함하는 올바른 방법은 \n 또는 \u000A 같은 이스케이프 시퀀스를 사용하는 것이다.
문자열 리터럴이, 둘러싼 코드를 strict mode로 두는 Use Strict 지시어보다 앞에 올 수도 있으며, 구현은 그러한 리터럴에 대해서도 위 규칙을 강제하도록 주의해야 한다. 예를 들어, 다음 소스 텍스트는 Syntax Error를 포함한다:
functioninvalid() { "\7"; "use strict"; }
12.9.4.2 Static Semantics: SV
The syntax-directed operation SV takes no arguments and returns a String.
문자열 리터럴은 String 타입의 값을 나타낸다. SV는 문자열 리터럴의 여러 부분에 재귀적으로 적용되어 문자열 리터럴의 String 값을 생성한다. 이 정의 일부로, 문자열 리터럴 안의 일부 유니코드 코드 포인트는 아래 또는 12.9.3에 설명된 대로 수학적 값을 가지는 것으로 해석된다.
정규식 리터럴은, 그 리터럴이 평가될 때마다 RegExp 객체(참조: 22.2)로 변환되는 입력 요소이다. 프로그램 안의 두 정규식 리터럴은, 두 리터럴의 내용이 동일하더라도, 서로 ===로 비교해 같아지는 정규식 객체로 평가되지 않는다. RegExp 객체는 new RegExp 또는 RegExp 생성자를 함수로 호출함으로써 런타임에 생성될 수도 있다(참조: 22.2.4).
The syntax-directed operation TV takes no arguments and returns a String or undefined. 템플릿 리터럴 구성 요소는 TV에 의해 String 타입의 값으로 해석된다. TV는 템플릿 객체의 인덱스된 구성 요소(구어적으로 템플릿 값)를 구성하는 데 사용된다. TV에서는 이스케이프 시퀀스가 그 이스케이프 시퀀스가 나타내는 유니코드 코드 포인트의 UTF-16 코드 단위(들)로 치환된다.
The syntax-directed operation TRV takes no arguments and returns a String. 템플릿 리터럴 구성 요소는 TRV에 의해 String 타입의 값으로 해석된다. TRV는 템플릿 객체의 raw 구성 요소(구어적으로 템플릿 raw 값)를 구성하는 데 사용된다. TRV는 TV와 유사하지만, TRV에서는 이스케이프 시퀀스가 리터럴 안에 나타난 그대로 해석된다는 차이가 있다.
UnicodeEscapeSequence::u{CodePoint}의 TRV는 코드 단위 0x0075 (LATIN SMALL LETTER U), 코드 단위 0x007B (LEFT CURLY BRACKET), CodePoint의 TRV, 코드 단위 0x007D (RIGHT CURLY BRACKET)의 문자열 연결이다.
대부분의 ECMAScript 문장과 선언은 세미콜론으로 끝나야 한다. 그러한 세미콜론은 언제나 소스 텍스트에 명시적으로 나타날 수 있다. 그러나 편의를 위해, 어떤 상황에서는 그러한 세미콜론을 소스 텍스트에서 생략할 수 있다. 이러한 상황은 그런 경우 소스 코드 토큰 스트림에 세미콜론이 자동으로 삽입된다고 설명된다.
12.10.1 자동 세미콜론 삽입 규칙
다음 규칙에서 “token”은 12 절에 설명된 대로 현재 어휘 goal symbol을 사용하여 결정된 실제 인식된 어휘 토큰을 의미한다.
세미콜론 삽입에는 세 가지 기본 규칙이 있다:
소스 텍스트를 왼쪽에서 오른쪽으로 파싱할 때, 문법의 어떤 production에도 허용되지 않는 토큰(이를 문제가 되는 토큰이라고 부른다)을 만나면, 다음 조건 중 하나 이상이 참일 경우 문제가 되는 토큰 앞에 세미콜론이 자동으로 삽입된다:
이전 토큰이 )이고, 삽입된 세미콜론이 do-while 문(14.7.2)의 종료 세미콜론으로 파싱된다.
소스 텍스트를 왼쪽에서 오른쪽으로 파싱할 때, 토큰 입력 스트림의 끝에 도달했고 파서가 그 입력 토큰 스트림을 goal 비단말의 단일 인스턴스로 파싱할 수 없으면, 입력 스트림 끝에 세미콜론이 자동으로 삽입된다.
소스 텍스트를 왼쪽에서 오른쪽으로 파싱할 때, 문법의 어떤 production에는 허용되지만 그 production이 제한된 production이고, 그 토큰이 제한된 production 안에서 “[no LineTerminator here]” 주석 바로 뒤의 terminal 또는 nonterminal에 대한 첫 번째 토큰이 될 경우(따라서 그런 토큰을 제한된 토큰이라 부른다), 그리고 제한된 토큰이 이전 토큰과 적어도 하나의 LineTerminator로 분리되어 있으면, 제한된 토큰 앞에 세미콜론이 자동으로 삽입된다.
그러나 앞선 규칙들에 대한 추가적인 우선 조건이 있다: 그 세미콜론이 빈 문장으로 파싱되거나, 또는 그 세미콜론이 for 문의 헤더 안의 두 세미콜론 중 하나가 된다면(참조: 14.7.4), 세미콜론은 결코 자동으로 삽입되지 않는다.
break 또는 continue 문 안의 LabelIdentifier는 break 또는 continue 토큰과 같은 줄에 있어야 한다.
화살표 함수 매개변수의 끝과 그 =>는 같은 줄에 있어야 한다.
비동기 함수 또는 메서드 앞의 async 토큰은 바로 다음 토큰과 같은 줄에 있어야 한다.
12.10.2 자동 세미콜론 삽입의 예
이 절은 비규범적이다.
소스
{ 12 } 3
는 자동 세미콜론 삽입 규칙을 적용해도 ECMAScript 문법에서 유효한 문장이 아니다. 반면 소스
{ 12 } 3
도 역시 유효한 ECMAScript 문장이 아니지만, 자동 세미콜론 삽입에 의해 다음과 같이 변환된다:
{ 1
;2 ;} 3;
이는 유효한 ECMAScript 문장이다.
소스
for (a; b
)
는 유효한 ECMAScript 문장이 아니며, 세미콜론이 for 문의 헤더에 필요하기 때문에 자동 세미콜론 삽입에 의해 변경되지 않는다. 자동 세미콜론 삽입은 for 문의 헤더에 있는 두 세미콜론 중 어느 것도 결코 삽입하지 않는다.
소스
return
a + b
는 자동 세미콜론 삽입에 의해 다음과 같이 변환된다:
return;
a + b;
Note 1
표현식 a + b는 return 문이 반환할 값으로 취급되지 않는데, 그것이 return 토큰과 LineTerminator로 분리되어 있기 때문이다.
소스
a = b
++c
는 자동 세미콜론 삽입에 의해 다음과 같이 변환된다:
a = b;
++c;
Note 2
토큰 ++는 변수 b에 적용되는 후위 연산자로 취급되지 않는데, b와 ++ 사이에 LineTerminator가 있기 때문이다.
소스
if (a > b)
else c = d
는 유효한 ECMAScript 문장이 아니며, 그 지점에서 문법의 어떤 production도 적용되지 않더라도, 자동으로 삽입된 세미콜론이 빈 문장으로 파싱되기 때문에 else 토큰 앞에서 자동 세미콜론 삽입에 의해 변경되지 않는다.
소스
a = b + c
(d + e).print()
는 자동 세미콜론 삽입에 의해 변환되지 않는다. 왜냐하면 두 번째 줄을 시작하는 괄호로 둘러싸인 표현식은 함수 호출의 인수 목록으로 해석될 수 있기 때문이다:
a = b + c(d + e).print()
대입문이 반드시 왼쪽 괄호로 시작해야 하는 상황에서는, 프로그래머가 자동 세미콜론 삽입에 의존하기보다 앞선 문장의 끝에 명시적인 세미콜론을 제공하는 것이 좋다.
12.10.3 자동 세미콜론 삽입의 흥미로운 경우
이 절은 비규범적이다.
ECMAScript 프로그램은 자동 세미콜론 삽입에 의존하여 매우 적은 수의 세미콜론만 사용하는 스타일로 작성될 수 있다. 위에서 설명했듯이, 세미콜론은 모든 개행마다 삽입되는 것이 아니며, 자동 세미콜론 삽입은 줄 종결자를 가로지르는 여러 토큰에 의존할 수 있다.
새로운 구문 기능이 ECMAScript에 추가되면, 그 앞에서 자동 세미콜론 삽입에 의존하던 줄이 파싱될 때 다른 문법 production으로 바뀌게 만드는 추가 문법 production이 추가될 수 있다.
이 절의 목적상, 자동 세미콜론 삽입의 경우는 그것 앞에 오는 소스 텍스트에 따라 세미콜론이 삽입될 수도 있고 안 될 수도 있는 위치라면 흥미로운 것으로 간주된다. 이 절의 나머지는 이 버전의 ECMAScript에서 나타나는 자동 세미콜론 삽입의 여러 흥미로운 경우를 설명한다.
12.10.3.1 문장 목록에서의 자동 세미콜론 삽입의 흥미로운 경우
StatementList 안에서 많은 StatementListItem은 세미콜론으로 끝나며, 이는 자동 세미콜론 삽입을 사용해 생략할 수 있다. 위 규칙의 결과로, 표현식으로 끝나는 줄의 끝에서는 다음 줄이 다음 중 하나로 시작하면 세미콜론이 필요하다:
ECMAScript는 “[no LineTerminator here]”를 포함하는 문법 production을 가진다. 이러한 production은 때때로 문법 안에서 선택적 피연산자를 두기 위한 수단이다. 이런 위치에 LineTerminator를 도입하면 선택적 피연산자가 없는 문법 production을 사용하게 되어 소스 텍스트의 문법 production이 바뀌게 된다.
이 절의 나머지는 이 버전의 ECMAScript에서 “[no LineTerminator here]”를 사용하는 여러 production을 설명한다.
12.10.3.2.1 선택적 피연산자와 “[no LineTerminator here]”를 가진 문법 production 목록
ArrayLiteral은 대괄호로 둘러싸인, 0개 이상의 표현식 목록을 사용하여 Array의 초기화를 기술하는 표현식이며, 각 표현식은 배열 요소를 나타낸다. 요소는 리터럴일 필요가 없으며; 배열 초기자가 평가될 때마다 각각 평가된다.
배열 요소는 요소 목록의 처음, 중간, 또는 끝에서 생략될 수 있다. 요소 목록에서 콤마 앞에 AssignmentExpression이 없을 때마다(즉, 처음의 콤마이거나 다른 콤마 뒤의 콤마인 경우), 빠진 배열 요소는 Array의 길이에 기여하고 이후 요소들의 인덱스를 증가시킨다. 생략된 배열 요소는 정의되지 않는다. 배열 끝에서 요소가 생략되면, 그 요소는 Array의 길이에 기여하지 않는다.
The syntax-directed operation ArrayAccumulation takes arguments array (an Array) and nextIndex (an integer) and returns either a normal completion containing an integer or an abrupt completion. It is defined piecewise over the following productions:
특정 문맥에서 ObjectLiteral은 더 제한적인 2차 문법을 위한 커버 문법으로 사용된다. CoverInitializedName production은 이 2차 문법들을 완전히 덮기 위해 필요하다. 그러나 이 production을 사용하면 실제 ObjectLiteral이 기대되는 일반 문맥에서는 이른 Syntax Error가 발생한다.
The syntax-directed operation PropertyDefinitionNodes takes no arguments and returns a List of Parse Nodes. It is defined piecewise over the following productions:
The syntax-directed operation PropertyNameList takes no arguments and returns a List of Strings. It is defined piecewise over the following productions:
The syntax-directed operation PropertyDefinitionEvaluation takes argument object (an Object) and returns either a normal completion containing unused or an abrupt completion. It is defined piecewise over the following productions:
The abstract operation IsValidRegularExpressionLiteral takes argument literal (a RegularExpressionLiteral Parse Node) and returns a Boolean. 이것은 인수가 유효한 정규식 리터럴인지 결정한다. It performs the following steps when called:
The syntax-directed operation TemplateStrings takes argument raw (a Boolean) and returns a List of either Strings or undefined. It is defined piecewise over the following productions:
13.2.8.3 Static Semantics: TemplateString ( templateToken, raw )
The abstract operation TemplateString takes arguments templateToken (a NoSubstitutionTemplate Parse Node, a TemplateHead Parse Node, a TemplateMiddle Parse Node, or a TemplateTail Parse Node) and raw (a Boolean) and returns a String or undefined. It performs the following steps when called:
이 연산은 raw가 false이고 templateToken이 NotEscapeSequence를 포함하면 undefined를 반환한다. 그 외 모든 경우에는 String을 반환한다.
13.2.8.4 GetTemplateObject ( templateLiteral )
The abstract operation GetTemplateObject takes argument templateLiteral (a Parse Node) and returns an Array. It performs the following steps when called:
realm의 프로그램 코드 안의 각 TemplateLiteral은 태그된 Template의 평가(13.2.8.6)에 사용되는 고유한 템플릿 객체와 연관된다. 템플릿 객체는 동결되며, 특정 태그된 Template가 평가될 때마다 같은 템플릿 객체가 사용된다. 템플릿 객체가 TemplateLiteral의 첫 평가 시점에 지연 생성되는지, 또는 첫 평가 전에 미리 생성되는지는 ECMAScript 코드에서 관찰할 수 없는 구현 선택이다.
Note 3
이 명세의 미래 판은 템플릿 객체의 추가적인 non-enumerable 프로퍼티를 정의할 수 있다.
The abstract operation EvaluatePropertyAccessWithExpressionKey takes arguments baseValue (an ECMAScript language value), expression (an Expression Parse Node), and strict (a Boolean) and returns either a normal completion containing a Reference Record or an abrupt completion. It performs the following steps when called:
propertyNameReference를 expression의 Evaluation 결과 ?라고 하자.
propertyNameValue를 ? GetValue(propertyNameReference)라고 하자.
NOTE: 대부분의 경우, 이 단계 직후 propertyNameValue에 ToPropertyKey가 수행된다. 그러나 a[b] = c의 경우에는 c의 평가 이후까지 수행되지 않는다.
The abstract operation EvaluatePropertyAccessWithIdentifierKey takes arguments baseValue (an ECMAScript language value), identifierName (an IdentifierName Parse Node), and strict (a Boolean) and returns a Reference Record. It performs the following steps when called:
propertyNameString을 identifierName의 StringValue라고 하자.
The abstract operation EvaluateNew takes arguments constructExpr (a NewExpression Parse Node or a MemberExpression Parse Node) and arguments (empty or an Arguments Parse Node) and returns either a normal completion containing an Object or an abrupt completion. It performs the following steps when called:
The abstract operation EvaluateCall takes arguments func (an ECMAScript language value), ref (an ECMAScript language value or a Reference Record), arguments (a Parse Node), and tailPosition (a Boolean) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:
The abstract operation MakeSuperPropertyReference takes arguments actualThis (an ECMAScript language value), propertyKey (an ECMAScript language value), and strict (a Boolean) and returns a Super Reference Record. It performs the following steps when called:
The syntax-directed operation ChainEvaluation takes arguments baseValue (an ECMAScript language value) and baseReference (an ECMAScript language value or a Reference Record) and returns either a normal completion containing either an ECMAScript language value or a Reference Record, or an abrupt completion. It is defined piecewise over the following productions:
The abstract operation EvaluateImportCall takes argument specifierExpression (a Parse Node) and optional argument optionsExpression (a Parse Node) and returns either a normal completion containing a Promise or an abrupt completion. It performs the following steps when called:
The abstract operation ContinueDynamicImport takes arguments promiseCapability (a PromiseCapability Record) and moduleCompletion (either a normal completion containing a Module Record or a throw completion) and returns unused. 이것은 원래 import() 호출로 시작된 동적 import 과정을 완료하며, 필요에 따라 그 호출이 반환한 promise를 resolve 또는 reject한다. It performs the following steps when called:
The host-defined abstract operation HostGetImportMetaProperties takes argument moduleRecord (a Module Record) and returns a List of Records with fields [[Key]] (a property key) and [[Value]] (an ECMAScript language value). 이것은 호스트가 import.meta로부터 반환되는 객체에 대한 프로퍼티 키와 값을 제공할 수 있게 한다.
HostGetImportMetaProperties의 기본 구현은 새로운 빈 List를 반환하는 것이다.
The host-defined abstract operation HostFinalizeImportMeta takes arguments importMeta (an Object) and moduleRecord (a Module Record) and returns unused. 이것은 호스트가 import.meta에서 반환되는 객체를 준비하기 위해 특별한 연산을 수행할 수 있게 한다.
대부분의 호스트는 단순히 HostGetImportMetaProperties를 정의하고, HostFinalizeImportMeta는 기본 동작 그대로 둘 수 있다. 그러나 HostFinalizeImportMeta는 객체가 ECMAScript 코드에 노출되기 전에 호스트가 직접 조작해야 하는 경우를 위한 "탈출구"를 제공한다.
delete 연산자가 strict mode 코드 안에 나타나면, 그 UnaryExpression이 변수, 함수 인수, 또는 함수 이름에 대한 직접 참조일 경우 SyntaxError 예외가 던져진다. 또한 delete 연산자가 strict mode 코드 안에 나타나고 삭제하려는 프로퍼티가 { [[Configurable]]: false } 속성을 가지는 경우(또는 다른 이유로 삭제할 수 없는 경우), TypeError 예외가 던져진다.
Note 2
단계 4.c에서 생성될 수 있는 객체는 위 추상 연산과 일반 객체 [[Delete]] 내부 메서드 밖에서는 접근할 수 없다. 구현은 그 객체를 실제로 만들지 않도록 선택할 수 있다.
The abstract operation InstanceofOperator takes arguments value (an ECMAScript language value) and target (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. 이것은 value가 target의 인스턴스인지 결정하는 일반 알고리즘을 구현하는데, target의 %Symbol.hasInstance% 메서드를 조회하거나, 그것이 없으면 target의 "prototype" 프로퍼티 값이 value의 프로토타입 체인 안에 존재하는지를 결정한다. It performs the following steps when called:
동등 연산자는 항상 추이적이지는 않다. 예를 들어, 같은 String 값을 나타내는 서로 다른 두 String 객체가 있을 수 있다; 각 String 객체는 == 연산자에 의해 그 String 값과는 같다고 간주되지만, 두 String 객체는 서로 같지 않다. 예를 들어:
new String("a") == "a"와 "a" == new String("a")는 둘 다 true이다.
new String("a") == new String("a")는 false이다.
Note 3
String 비교는 코드 단위 값 시퀀스에 대한 단순한 동등성 테스트를 사용한다. Unicode 명세에 정의된 보다 복잡하고 의미 지향적인 문자 또는 문자열 동등성 및 정렬 순서 정의를 사용하려는 시도는 없다. 따라서 Unicode Standard에 따라 canonical equal한 String 값들이 서로 같지 않게 테스트될 수 있다. 실제로 이 알고리즘은 두 String이 이미 정규화된 형태라고 가정한다.
ECMAScript의 ConditionalExpression 문법은 C와 Java의 그것과 약간 다르며, 이 둘은 각각 두 번째 하위 표현식으로 Expression을 허용하지만 세 번째 표현식은 ConditionalExpression으로 제한한다. ECMAScript에서 이 차이의 동기는 조건식의 어느 쪽 가지에도 대입 표현식이 오도록 허용하고, 가운데 표현식이 콤마 표현식인 혼란스럽고 거의 쓸모없는 경우를 제거하기 위함이다.
이 표현식이 strict mode 코드 안에 나타날 때, 단계 1.e, 3, 2, 2, 2에서의 lRef가 해석 불가능한 참조이면 런타임 오류이다. 그런 경우 ReferenceError 예외가 던져진다. 또한 단계 9, 6, 6, 6에서의 lRef가 { [[Writable]]: false } 속성 값을 가진 데이터 프로퍼티, { [[Set]]: undefined } 속성 값을 가진 접근자 프로퍼티, 또는 IsExtensible 판정이 false를 반환하는 객체의 존재하지 않는 프로퍼티에 대한 참조이면 런타임 오류이다. 이 경우 TypeError 예외가 던져진다.
The abstract operation ApplyStringOrNumericBinaryOperator takes arguments lVal (an ECMAScript language value), opText (**, *, /, %, +, -, <<, >>, >>>, &, ^, or |), and rVal (an ECMAScript language value) and returns either a normal completion containing either a String, a BigInt, or a Number, or a throw completion. It performs the following steps when called:
단계 1.a와 1.b에서 ToPrimitive 호출에는 힌트가 제공되지 않는다. Date를 제외한 모든 표준 객체는 힌트가 없는 경우 number가 주어진 것처럼 처리한다; Date는 힌트가 없는 경우 string이 주어진 것처럼 처리한다. 이색 객체는 힌트의 부재를 다른 방식으로 처리할 수 있다.
Note 2
단계 1.c는 논리곱 대신 논리합 연산을 사용한다는 점에서 IsLessThan 알고리즘의 단계 3와 다르다.
The abstract operation EvaluateStringOrNumericBinaryExpression takes arguments leftOperand (a Parse Node), opText (**, *, /, %, +, -, <<, >>, >>>, &, ^, or |), and rightOperand (a Parse Node) and returns either a normal completion containing either a String, a BigInt, or a Number, or an abrupt completion. It performs the following steps when called:
The syntax-directed operation DestructuringAssignmentEvaluation takes argument value (an ECMAScript language value) and returns either a normal completion containing unused or an abrupt completion. It is defined piecewise over the following productions:
The syntax-directed operation PropertyDestructuringAssignmentEvaluation takes argument value (an ECMAScript language value) and returns either a normal completion containing a List of property keys or an abrupt completion. 이것은 구조 분해된 모든 프로퍼티 키의 리스트를 수집한다. It is defined piecewise over the following productions:
The syntax-directed operation RestDestructuringAssignmentEvaluation takes arguments value (an ECMAScript language value) and excludedNames (a List of property keys) and returns either a normal completion containing unused or an abrupt completion. It is defined piecewise over the following productions:
The syntax-directed operation IteratorDestructuringAssignmentEvaluation takes argument iteratorRecord (an Iterator Record) and returns either a normal completion containing unused or an abrupt completion. It is defined piecewise over the following productions:
The syntax-directed operation KeyedDestructuringAssignmentEvaluation takes arguments value (an ECMAScript language value) and propertyName (a property key) and returns either a normal completion containing unused or an abrupt completion. It is defined piecewise over the following productions:
The abstract operation BlockDeclarationInstantiation takes arguments code (a Parse Node) and env (a Declarative Environment Record) and returns unused. code는 블록 본문에 대응하는 Parse Node이다. env는 바인딩이
생성될 Environment Record이다.
The syntax-directed operation PropertyBindingInitialization takes arguments value (an ECMAScript language value) and environment (an Environment Record or undefined) and returns either a normal completion containing a List of property keys or an abrupt completion. 이것은 바인딩된 모든 프로퍼티 이름의 리스트를 수집한다. It is defined piecewise over the following productions:
The syntax-directed operation RestBindingInitialization takes arguments value (an ECMAScript language value), environment (an Environment Record or undefined), and excludedNames (a List of property keys) and returns either a normal completion containing unused or an abrupt completion. It is defined piecewise over the following productions:
The syntax-directed operation KeyedBindingInitialization takes arguments value (an ECMAScript language value), environment (an Environment Record or undefined), and propertyName (a property key) and returns either a normal completion containing unused or an abrupt completion.
Note
environment에 undefined가 전달되면, 초기화 값을 할당하기 위해
PutValue 연산을 사용해야 함을 나타낸다. 이것은 non-strict 함수의
형식 매개변수 목록의 경우이다. 그 경우, 같은 이름을 가진 여러
매개변수의 가능성을 처리하기 위해 형식 매개변수 바인딩은 미리
초기화된다.
It is defined piecewise over the following productions:
The abstract operation LoopContinues takes arguments completion (a Completion Record) and labelSet (a List of Strings) and returns a Boolean. It performs the following steps when called:
The syntax-directed operation LoopEvaluation takes argument labelSet (a List of Strings) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It is defined piecewise over the following productions:
The syntax-directed operation DoWhileLoopEvaluation takes argument labelSet (a List of Strings) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It is defined piecewise over the following productions:
The syntax-directed operation WhileLoopEvaluation takes argument labelSet (a List of Strings) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It is defined piecewise over the following productions:
The syntax-directed operation ForLoopEvaluation takes argument labelSet (a List of Strings) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It is defined piecewise over the following productions:
The abstract operation ForBodyEvaluation takes arguments test (an Expression Parse Node or empty), increment (an Expression Parse Node or empty), stmt (a Statement Parse Node), perIterationBindings (a List of Strings), and labelSet (a List of Strings) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:
The abstract operation CreatePerIterationEnvironment takes argument perIterationBindings (a List of Strings) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:
perIterationBindings에 요소가 하나라도 있으면,
lastIterationEnv를 현재 실행 중인 execution context의
LexicalEnvironment라고 하자.
The syntax-directed operation ForDeclarationBindingInitialization takes arguments value (an ECMAScript language value) and environment (an Environment Record) and returns either a normal completion containing unused or an abrupt completion. It is defined piecewise over the following productions:
The syntax-directed operation ForDeclarationBindingInstantiation takes argument environment (a Declarative Environment Record) and returns unused. It is defined piecewise over the following productions:
The syntax-directed operation ForInOfLoopEvaluation takes argument labelSet (a List of Strings) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It is defined piecewise over the following productions:
The abstract operation ForIn/OfHeadEvaluation takes arguments uninitializedBoundNames (a List of Strings), expr (an Expression Parse Node or an AssignmentExpression Parse Node), and iterationKind (enumerate, iterate, or async-iterate) and returns either a normal completion containing an Iterator Record or an abrupt completion. It performs the following steps when called:
The abstract operation ForIn/OfBodyEvaluation takes arguments lhs (a Parse Node), stmt (a Statement Parse Node), iteratorRecord (an Iterator Record), iterationKind (enumerate or iterate), lhsKind (assignment, var-binding, or lexical-binding), and labelSet (a List of Strings) and optional argument iteratorKind (sync or async) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:
The abstract operation EnumerateObjectProperties takes argument obj (an Object) and returns an iterator object. It performs the following steps when called:
열거 가능한 obj의 모든 String 값 키의 프로퍼티를 순회하는
next 메서드를 가진 이터레이터 객체를 반환한다. 이터레이터
객체는 ECMAScript 코드에서 직접 접근할 수 없다. 프로퍼티를
열거하는 방식과 순서는 명시되지 않지만 아래에 명시된 규칙에는
부합해야 한다.
이 이터레이터의 throw 및 return 메서드는 null이며 결코
호출되지 않는다. 이 이터레이터의 next 메서드는 프로퍼티 키가
이터레이터 값으로 반환되어야 하는지를 결정하기 위해 객체
프로퍼티를 처리한다. 반환되는 프로퍼티 키에는 Symbol인 키는
포함되지 않는다. 대상 객체의 프로퍼티는 열거 도중 삭제될 수 있다.
이터레이터의 next 메서드가 처리하기 전에 삭제된 프로퍼티는
무시된다. 열거 도중 대상 객체에 새 프로퍼티가 추가되더라도, 새로
추가된 프로퍼티가 현재 진행 중인 열거에서 처리된다는 보장은 없다.
어떤 프로퍼티 이름이든 한 번의 열거에서 이터레이터의 next
메서드에 의해 최대 한 번만 반환된다.
대상 객체의 프로퍼티 열거에는 그 프로토타입, 프로토타입의
프로토타입 등도 재귀적으로 포함된다; 하지만 프로토타입의 프로퍼티는,
이터레이터의 next 메서드에 의해 이미 처리된 프로퍼티와 같은
이름을 가지면 처리되지 않는다. 프로토타입 객체의 프로퍼티가 이미
처리되었는지 결정할 때 [[Enumerable]] 속성 값은 고려되지 않는다.
프로토타입 객체의 열거 가능한 프로퍼티 이름은 그 프로토타입 객체를
인수로 전달하여 EnumerateObjectProperties를 호출함으로써 얻어져야
한다. EnumerateObjectProperties는 대상 객체의 자체 프로퍼티 키를
[[OwnPropertyKeys]] 내부 메서드를 호출하여 얻어야 한다. 대상
객체의 프로퍼티 속성은 [[GetOwnProperty]] 내부 메서드를 호출하여
얻어야 한다.
obj 또는 그 프로토타입 체인 안의 객체의 [[Prototype]]
내부 슬롯 값이 바뀌거나,
obj 또는 그 프로토타입 체인 안의 객체에서 프로퍼티가
제거되거나,
obj의 프로토타입 체인 안의 객체에 프로퍼티가 추가되거나,
또는
obj 또는 그 프로토타입 체인 안의 객체의 프로퍼티의
[[Enumerable]] 속성 값이 바뀌는 경우.
Note 1
ECMAScript 구현은 14.7.5.10.2.1의
알고리즘을 직접 구현할 필요는 없다. 앞 단락의 제약 중 하나가
위반되지 않는 한, 그 알고리즘에서 벗어나지 않는 동작을 하는 임의의
구현을 선택할 수 있다.
다음은 이 규칙들에 부합하는 ECMAScript generator 함수의 정보성
정의이다:
function* EnumerateObjectProperties(obj) {
const visited = newSet();
for (const key ofReflect.ownKeys(obj)) {
if (typeof key === "symbol") continue;
const desc = Reflect.getOwnPropertyDescriptor(obj, key);
if (desc) {
visited.add(key);
if (desc.enumerable) yield key;
}
}
const proto = Reflect.getPrototypeOf(obj);
if (proto === null) return;
for (const protoKey ofEnumerateObjectProperties(proto)) {
if (!visited.has(protoKey)) yield protoKey;
}
}
Note 2
구현이 CreateForInIterator와 일치할 필요가 없는 이색 객체들의
목록은, 역사적으로 구현들이 그러한 경우에는 동작이 달랐고 다른
모든 경우에는 일치했기 때문에 선택되었다.
14.7.5.10 For-In 이터레이터 객체
For-In Iterator
는 특정 객체에 대한 특정한 순회를 나타내는 객체이다. For-In
Iterator 객체는 ECMAScript 코드에서 직접 접근할 수 없으며;
EnumerateObjectProperties의 동작을 설명하기 위해서만 존재한다.
14.7.5.10.1 CreateForInIterator ( object )
The abstract operation CreateForInIterator takes argument object (an Object) and returns a For-In Iterator. 이것은 object의 자체 및 상속된 열거 가능한 문자열
프로퍼티를 특정 순서로 순회하는 For-In Iterator 객체를 생성하는
데 사용된다. It performs the following steps when called:
return 문은 함수가 실행을 중단하게 하며, 대부분의 경우 호출자에게
값을 반환한다. Expression이 생략되면 반환값은 undefined이다.
그렇지 않으면 반환값은 Expression의 값이다. return 문은 주변
문맥에 따라 실제로 호출자에게 값을 반환하지 않을 수도 있다. 예를 들어
try 블록 안에서는 return 문의 Completion Record가 finally
블록 평가 중 다른 Completion Record로 대체될 수 있다.
The syntax-directed operation CaseBlockEvaluation takes argument input (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It is defined piecewise over the following productions:
The abstract operation CaseClauseIsSelected takes arguments constructor (a CaseClause Parse Node) and input (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. 이것은 constructor가 input과 일치하는지를 결정한다. It performs the following steps when called:
Statement는 레이블로 접두될 수 있다. 레이블된 문은 오직 레이블된
break 및 continue 문과 함께만 사용된다. ECMAScript에는 goto
문이 없다. Statement는 LabelledStatement의 일부가 될 수 있고,
그것은 다시 LabelledStatement의 일부가 될 수 있으며, 이런 식으로
계속될 수 있다. 이렇게 도입된 레이블들은 개별 문장의 의미론을 설명할
때 집합적으로 “현재 레이블 집합”이라고 불린다.
The abstract operation IsLabelledFunction takes argument stmt (a Statement Parse Node) and returns a Boolean. It performs the following steps when called:
The syntax-directed operation LabelledEvaluation takes argument labelSet (a List of Strings) and returns either a normal completion containing either an ECMAScript language value or empty, or an abrupt completion. It is defined piecewise over the following productions:
The syntax-directed operation CatchClauseEvaluation takes argument thrownValue (an ECMAScript language value) and returns either a normal completion containing either an ECMAScript language value or empty, or an abrupt completion. It is defined piecewise over the following productions:
The syntax-directed operation FunctionBodyContainsUseStrict takes no arguments and returns 불리언. It is defined piecewise over the following productions:
The syntax-directed operation EvaluateFunctionBody takes arguments functionObject (ECMAScript 함수 객체) and argumentsList (ECMAScript 언어 값의 리스트) and returns return 완료 또는 throw 완료. It is defined piecewise over the following productions:
The syntax-directed operation InstantiateOrdinaryFunctionObject takes arguments env (Environment Record) and privateEnv (PrivateEnvironment Record 또는 null) and returns ECMAScript 함수 객체. It is defined piecewise over the following productions:
The syntax-directed operation InstantiateOrdinaryFunctionExpression takes optional argument name (프로퍼티 키 또는 Private Name) and returns ECMAScript 함수 객체. It is defined piecewise over the following productions:
The syntax-directed operation EvaluateConciseBody takes arguments functionObject (ECMAScript 함수 객체) and argumentsList (ECMAScript 언어 값들의 List) and returns 반환 완료 또는 던짐 완료. It is defined piecewise over the following productions:
The syntax-directed operation InstantiateArrowFunctionExpression takes optional argument name (속성 키 또는 Private Name) and returns ECMAScript 함수 객체. It is defined piecewise over the following productions:
ArrowFunction은 arguments, super, this, 또는 new.target에 대한 로컬 바인딩을 정의하지 않는다. ArrowFunction 내에서 arguments, super, this, 또는 new.target에 대한 모든 참조는 렉시컬하게 둘러싸는 환경의 바인딩으로 해석되어야 한다. 일반적으로 이는 바로 둘러싸는 함수의 Function Environment가 된다. ArrowFunction이 super에 대한 참조를 포함할 수 있더라도, 단계 5에서 생성된 함수 객체는 MakeMethod를 수행하여 메서드로 만들어지지 않는다. super를 참조하는 ArrowFunction은 항상 비-ArrowFunction 내에 포함되며, super를 구현하는 데 필요한 상태는 ArrowFunction의 함수 객체가 캡처한 env를 통해 접근할 수 있다.
The syntax-directed operation DefineMethod takes argument object (객체) and optional argument functionPrototype (객체) and returns [[Key]](속성 키) 및 [[Closure]](ECMAScript 함수 객체) 필드를 가진 Record를 포함하는 정상 완료 또는 갑작스러운 완료. It is defined piecewise over the following productions:
The syntax-directed operation MethodDefinitionEvaluation takes arguments object (an Object) and enumerable (a Boolean) and returns either a normal completion containing either a PrivateElement or unused, or an abrupt completion. It is defined piecewise over the following productions:
The syntax-directed operation EvaluateGeneratorBody takes arguments functionObject (ECMAScript 함수 객체) and argumentsList (ECMAScript 언어 값들의 List) and returns 던짐 완료 또는 반환 완료. It is defined piecewise over the following productions:
The syntax-directed operation InstantiateGeneratorFunctionObject takes arguments env (Environment Record) and privateEnv (PrivateEnvironment Record 또는 null) and returns ECMAScript 함수 객체. It is defined piecewise over the following productions:
The syntax-directed operation InstantiateGeneratorFunctionExpression takes optional argument name (속성 키 또는 Private Name) and returns ECMAScript 함수 객체. It is defined piecewise over the following productions:
The syntax-directed operation EvaluateAsyncGeneratorBody takes arguments functionObject (ECMAScript 함수 객체) and argumentsList (ECMAScript 언어 값들의 List) and returns 던짐 완료 또는 반환 완료. It is defined piecewise over the following productions:
The syntax-directed operation InstantiateAsyncGeneratorFunctionObject takes arguments env (Environment Record) and privateEnv (PrivateEnvironment Record 또는 null) and returns ECMAScript 함수 객체. It is defined piecewise over the following productions:
The syntax-directed operation InstantiateAsyncGeneratorFunctionExpression takes optional argument name (속성 키 또는 Private Name) and returns ECMAScript 함수 객체. It is defined piecewise over the following productions:
ClassElementList의 PrivateBoundIdentifiers에 중복 항목이 있으면 구문 오류이다. 단, 이름이 getter에 한 번, setter에 한 번만 사용되고 다른 항목에는 사용되지 않으며, getter와 setter가 둘 다 정적이거나 둘 다 비정적인 경우는 예외이다.
The syntax-directed operation ClassElementKind takes no arguments and returns constructor-method, non-constructor-method, or empty. It is defined piecewise over the following productions:
The syntax-directed operation ConstructorMethod takes no arguments and returns ClassElement파스 노드 또는 empty. It is defined piecewise over the following productions:
The syntax-directed operation NonConstructorElements takes no arguments and returns ClassElement파스 노드들의 List. It is defined piecewise over the following productions:
The syntax-directed operation PrototypePropertyNameList takes no arguments and returns 속성 키들의 List. It is defined piecewise over the following productions:
The syntax-directed operation PrivateBoundIdentifiers takes no arguments and returns String들의 List. It is defined piecewise over the following productions:
The syntax-directed operation ClassFieldDefinitionEvaluation takes argument homeObject (객체) and returns ClassFieldDefinition Record를 포함하는 정상 완료 또는 갑작스러운 완료. It is defined piecewise over the following productions:
The syntax-directed operation ClassStaticBlockDefinitionEvaluation takes argument homeObject (객체) and returns ClassStaticBlockDefinition Record. It is defined piecewise over the following productions:
The syntax-directed operation EvaluateClassStaticBlockBody takes argument functionObject (ECMAScript 함수 객체) and returns 반환 완료 또는 던짐 완료. It is defined piecewise over the following productions:
The syntax-directed operation ClassDefinitionEvaluation takes arguments classBinding (String 또는 undefined), className (속성 키 또는 Private Name), and sourceText (ECMAScript 소스 텍스트) and returns 함수 객체를 포함하는 정상 완료 또는 갑작스러운 완료.
Note
명세의 편의를 위해 private 메서드와 접근자는 클래스 인스턴스의 [[PrivateElements]] 슬롯에서 private 필드와 함께 포함된다. 그러나 주어진 객체는 주어진 클래스가 정의한 private 메서드와 접근자를 모두 가지거나 전혀 가지지 않는다. 이 기능은 구현체가 각 메서드나 접근자를 개별적으로 추적할 필요가 없는 전략을 사용하여 private 메서드와 접근자를 구현할 수 있도록 설계되었다.
예를 들어, 구현체는 인스턴스 private 메서드를 해당 Private Name과 직접 연결하고, 각 객체에 대해 어떤 클래스 생성자가 그 객체를 this 값으로 하여 실행되었는지를 추적할 수 있다. 그러면 객체에서 인스턴스 private 메서드를 조회하는 것은 그 메서드를 정의한 클래스 생성자가 해당 객체를 초기화하는 데 사용되었는지 확인한 뒤, Private Name과 연결된 메서드를 반환하는 것으로 이루어진다.
이는 private 필드와 다르다. 필드 초기자는 클래스 인스턴스화 중에 던질 수 있으므로, 개별 객체는 주어진 클래스의 private 필드 중 적절한 부분집합만 가질 수 있으며, 따라서 private 필드는 일반적으로 개별적으로 추적되어야 한다.
It is defined piecewise over the following productions:
NOTE: 이 분기는 constructor(...args) { super(...args); }와 유사하게 동작한다. 가장 주목할 만한 차이점은, 앞서 언급한 ECMAScript 소스 텍스트는 %Array.prototype%의 %Symbol.iterator% 메서드를 관찰 가능하게 호출하지만, 이 함수는 그렇게 하지 않는다는 점이다.
func를 ! constructorFunction.[[GetPrototypeOf]]()라고 하자.
The syntax-directed operation BindingClassDeclarationEvaluation takes no arguments and returns 함수 객체를 포함하는 정상 완료 또는 갑작스러운 완료. It is defined piecewise over the following productions:
The syntax-directed operation InstantiateAsyncFunctionObject takes arguments env (Environment Record) and privateEnv (PrivateEnvironment Record 또는 null) and returns ECMAScript 함수 객체. It is defined piecewise over the following productions:
The syntax-directed operation InstantiateAsyncFunctionExpression takes optional argument name (속성 키 또는 Private Name) and returns ECMAScript 함수 객체. It is defined piecewise over the following productions:
The syntax-directed operation EvaluateAsyncFunctionBody takes arguments functionObject (ECMAScript 함수 객체) and argumentsList (ECMAScript 언어 값들의 List) and returns 반환 완료. It is defined piecewise over the following productions:
The syntax-directed operation AsyncConciseBodyContainsUseStrict takes no arguments and returns 불리언. It is defined piecewise over the following productions:
The syntax-directed operation EvaluateAsyncConciseBody takes arguments functionObject (ECMAScript 함수 객체) and argumentsList (ECMAScript 언어 값들의 List) and returns 반환 완료. It is defined piecewise over the following productions:
The syntax-directed operation InstantiateAsyncArrowFunctionExpression takes optional argument name (속성 키 또는 Private Name) and returns ECMAScript 함수 객체. It is defined piecewise over the following productions:
The abstract operation IsInTailPosition takes argument call (a CallExpression Parse Node, a MemberExpression Parse Node, or an OptionalChain Parse Node) and returns a Boolean. It performs the following steps when called:
꼬리 위치 호출은 호출자 컨텍스트 체인의 관찰을 가능하게 하는 일반적인 비표준 언어 확장(10.2.4 참조) 때문에 엄격 모드 코드에서만 정의된다.
15.10.2 Static Semantics: HasCallInTailPosition
The syntax-directed operation HasCallInTailPosition takes argument call (a CallExpression Parse Node, a MemberExpression Parse Node, or an OptionalChain Parse Node) and returns a Boolean.
Note 1
call은 특정 소스 텍스트 범위를 나타내는 파스 노드이다. 다음 알고리즘이 call을 다른 파스 노드와 비교할 때, 그것은 이들이 동일한 소스 텍스트를 나타내는지에 대한 테스트이다.
Note 2
호출 결과의 GetValue 반환이 바로 뒤따르는 잠재적 꼬리 위치 호출도 가능한 꼬리 위치 호출이다. 함수 호출은 Reference Record를 반환할 수 없으므로, 그러한 GetValue 연산은 항상 실제 함수 호출 결과와 같은 값을 반환한다.
It is defined piecewise over the following productions:
The abstract operation ParseScript takes arguments sourceText (ECMAScript 소스 텍스트), realm (Realm Record), and hostDefined (아무 값) and returns Script Record 또는 비어 있지 않은 SyntaxError 객체들의 List. sourceText를 Script로 파싱한 결과에 기반하여 Script Record를 생성한다. It performs the following steps when called:
구현체는 해당 스크립트 소스 텍스트에 대해 ParseScript를 평가하기 전에 스크립트 소스 텍스트를 파싱하고 조기 오류 조건을 분석할 수 있다. 그러나 모든 오류 보고는 이 명세가 실제로 해당 소스 텍스트에 대해 ParseScript를 수행하는 시점까지 지연되어야 한다.
16.1.6 ScriptEvaluation ( scriptRecord )
The abstract operation ScriptEvaluation takes argument scriptRecord (Script Record) and returns ECMAScript 언어 값을 포함하는 정상 완료 또는 갑작스러운 완료. It performs the following steps when called:
globalEnv를 scriptRecord.[[Realm]].[[GlobalEnv]]로 둔다.
The abstract operation GlobalDeclarationInstantiation takes arguments script (Script파스 노드) and env (Global Environment Record) and returns unused를 포함하는 정상 완료 또는 던짐 완료. script는 실행 컨텍스트가 설정되는 Script이다. env는 바인딩이 생성될 전역 환경이다.
Note 1
스크립트를 평가하기 위해 실행 컨텍스트가 설정될 때, 선언은 현재 전역 환경에서 인스턴스화된다. 코드에서 선언된 각 전역 바인딩이 인스턴스화된다.
16.1.1에 지정된 조기 오류는 단일 Script 내에 포함된 선언에 대해 function/var 선언과 let/const/class 선언 사이의 이름 충돌 및 let/const/class 바인딩의 재선언을 방지한다. 그러나 둘 이상의 Script에 걸친 이러한 충돌과 재선언은 GlobalDeclarationInstantiation 중 런타임 오류로 감지된다. 그러한 오류가 감지되면, 해당 스크립트에 대해 어떤 바인딩도 인스턴스화되지 않는다. 그러나 전역 객체가 Proxy exotic 객체를 사용하여 정의되면 충돌 선언에 대한 런타임 테스트가 신뢰할 수 없어 갑작스러운 완료가 발생하고 일부 전역 선언이 인스턴스화되지 않을 수 있다. 이런 일이 발생하면 Script의 코드는 평가되지 않는다.
명시적인 var 또는 function 선언과 달리, 전역 객체에 직접 생성된 속성은 let/const/class 선언에 의해 가려질 수 있는 전역 바인딩을 생성한다.
중복 ExportedNames 규칙은 ModuleBody 내에 여러 개의 export defaultExportDeclaration 항목이 존재하면 구문 오류가 됨을 의미한다. 충돌 또는 중복 선언과 관련된 추가 오류 조건은 모듈 평가 이전의 모듈 링크 단계에서 검사된다. 이러한 오류가 발견되면 해당 Module은 평가되지 않는다.
The abstract operation ImportedLocalNames takes argument importEntries (ImportEntry Record들의 List) and returns String들의 List. importEntries에 의해 정의된 모든 로컬 이름 바인딩의 List를 생성한다. It performs the following steps when called:
The syntax-directed operation ModuleRequests takes no arguments and returns ModuleRequest Records의 List. It is defined piecewise over the following productions:
모듈 레코드는 단일 모듈의
import/export에 대한 구조적 정보를 캡슐화합니다. 이 정보는 연결된
모듈 집합의 import/export 연결에 사용됩니다. 모듈 레코드에는
모듈 평가 시에만 사용되는 네 개의 필드가 포함되어 있습니다.
명세 목적상, 모듈 레코드는 Record 명세 타입의 값이며 간단한
객체지향 계층 구조에서 모듈 레코드가 추상 클래스이고 그 아래에
추상 및 구체 서브클래스가 존재하는 것으로 간주할 수 있습니다.
이 명세는 Cyclic Module Record라는 이름의 추상 서브클래스와
Source Text Module Record라는 이름의 구체 서브클래스를 정의합니다.
다른 명세와 구현에서는 자체적으로 정의한 대체 모듈 정의 수단에
상응하는 추가적인 모듈 레코드 서브클래스를 정의할 수 있습니다.
모듈 레코드는 Table 38
에 나열된 필드를 정의합니다. 모든 모듈 정의 서브클래스는 적어도
이들 필드를 포함합니다. 또한 Table 39
에 있는 추상 메서드 목록도 정의하며, 모든 모듈 정의 서브클래스는
해당 추상 메서드에 대한 구체 구현을 제공해야 합니다.
The abstract method ResolveExport takes argument exportName (a String) and optional argument resolveSet (a List of Records with fields [[Module]] (a Module Record) and [[ExportName]] (a String)) and returns a ResolvedBinding Record, null, or ambiguous.
이 모듈이 내보내는 이름의 바인딩을 반환한다.
바인딩은 {[[Module]]: 모듈 레코드,
[[BindingName]]: 문자열 | namespace}
형식의
ResolvedBinding 레코드
로 표현된다.
내보내기가 모듈 네임스페이스 객체이고 어느 모듈에도
직접 바인딩이 없으면 [[BindingName]]에
namespace가 들어간다. 이름을 해결할 수 없으면
null을, 여러 바인딩이 발견되면 ambiguous를 반환.
이 연산은 같은 exportName, resolveSet 쌍에 대해
호출할 때마다 동일한 결과를 반환해야 한다.
The abstract method Evaluate takes no arguments and returns 프라미스(Promise).
이 모듈과 그 의존성의 평가에 대한
프라미스를 반환하며,
성공하면 resolve 되고
이미 성공한 경우에도 resolve 되고,
평가 오류이거나 이전에 실패했다면 reject.
reject 시 호스트는 프라미스 거부를 처리하고
평가 오류를 재throw해야 함.
이 모듈이 Cyclic Module Record가 아니라면,
반환된 프라미스는 이미 판정(settled)된 상태여야 한다.
The abstract operation EvaluateModuleSync takes argument module (a Module Record) and returns either a normal completion containing unused or a throw completion. 호출자가 module의 평가가 이미 정착(settled)된 프로미스를 반환한다는 것을 보장할 경우, module을 동기적으로 평가한다. It performs the following steps when called:
new, unlinked, linking, linked, evaluating, evaluating-async, 또는 evaluated
초기값은 new이다. 모듈이 생명주기를 따라 진행됨에 따라 unlinked, linking, linked, evaluating, (필요 시) evaluating-async, evaluated 순으로 전이된다. evaluating-async는 이 모듈이 비동기 의존성 완료 후 실행 대기 중이거나 [[HasTLA]] 필드가 true인 모듈로 이미 실행되었지만 top-level 완료를 기다리는 상태임을 나타낸다.
이 레코드가 나타내는 모듈이 상대적 import 속성과 함께 모듈을 요청할 때 사용한 specifier 문자열을, 해결된 Module Record로 매핑하는 구조이다. 이 리스트에는 ModuleRequestsEqual(r1, r2)가 true가 되는 서로 다른 두 레코드 r1, r2가 포함되지 않는다.
초기값은 unset이며 완전히 동기적인 모듈의 경우 계속 unset 상태를 유지한다. 비동기이거나 비동기 의존성을 가진 모듈의 경우, 16.2.1.6.1.3.4에서 대기 중인 모듈 실행 순서를 결정하는 정수 값으로 설정된다. 대기 중인 모듈이 성공적으로 실행되면 done으로 설정된다.
이 모듈이 어떤 순환의 [[CycleRoot]]이고, 해당 순환 내 모듈 중 하나에서 Evaluate()가 호출된 경우, 이 필드는 전체 평가를 위한 PromiseCapability Record를 가진다. 이는 Evaluate() 추상 메서드가 반환하는 Promise 객체를 해결하기 위해 사용된다. 해당 모듈의 의존성들에서는, 그 의존성 중 일부에 대해 top-level Evaluate()가 시작된 경우가 아니라면 이 필드는 empty이다.
실행 컨텍스트 내에서 모듈 코드를 평가한다. 이 모듈의 [[HasTLA]]가 true인 경우 PromiseCapability Record가 인자로 전달되며, 메서드는 해당 capability를 resolve 또는 reject해야 한다. 이 경우 메서드는 예외를 throw해서는 안 되며, 필요 시 PromiseCapability Record를 reject해야 한다.
이 명세에서는 다음 타입들에 정의가 존재하며, 호스트는 자체 정의를 가진 추가 타입을 제공할 수 있다:
The LoadRequestedModules concrete method of a Cyclic Module Recordmodule takes optional argument hostDefined (anything) and returns a Promise. module의 의존성 그래프에 있는 모든 Module Record의 [[LoadedModules]]를 채운다(대부분의 작업은 보조 함수 InnerModuleLoading이 수행한다). HostLoadImportedModule 훅에 전달되는 optional hostDefined 매개변수를 받는다. It performs the following steps when called:
hostDefined 매개변수는 가져온 모듈을 fetch하는 데 필요한 추가 정보를 전달하는 데 사용할 수 있다. 예를 들어 HTML에서 <link rel="preload" as="..."> 태그에 대한 올바른 fetch destination을 설정하는 데 사용된다.
import() 표현식은 절대로 hostDefined 매개변수를 설정하지 않는다.
The abstract operation InnerModuleLoading takes arguments state (a GraphLoadingState Record) and module (a Module Record) and returns unused. LoadRequestedModules가 module의 의존성 그래프에 대한 실제 로딩 과정을 재귀적으로 수행하는 데 사용한다. It performs the following steps when called:
! Call(state.[[PromiseCapability]].[[Reject]], undefined, « moduleCompletion.[[Value]] »)을 수행한다.
unused를 반환한다.
16.2.1.6.1.2 Link ( )
The Link concrete method of a Cyclic Module Recordmodule takes no arguments and returns either a normal completion containing unused or a throw completion. 성공 시, Link는 이 모듈의 [[Status]]를 unlinked에서 linked로 전환한다. 실패 시, 예외가 던져지고 이 모듈의 [[Status]]는 unlinked로 남는다. (대부분의 작업은 보조 함수 InnerModuleLinking이 수행한다.) It performs the following steps when called:
Assert: module.[[Status]]는 unlinked, linked, evaluating-async, 또는 evaluated 중 하나이다.
16.2.1.6.1.2.1 InnerModuleLinking ( module, stack, index )
The abstract operation InnerModuleLinking takes arguments module (a Module Record), stack (a List of Cyclic Module Records), and index (a non-negative integer) and returns either a normal completion containing a non-negative integer or a throw completion. Link가 module에 대한 실제 링킹 과정을 수행하고, 의존성 그래프의 다른 모든 모듈에도 재귀적으로 수행하는 데 사용한다. stack 및 index 매개변수와 모듈의 [[DFSAncestorIndex]] 필드는 깊이 우선 탐색(DFS) 순회를 추적한다. 특히 [[DFSAncestorIndex]]는 강한 연결 요소(SCC)를 발견하는 데 사용되어, 하나의 SCC 안의 모든 모듈이 함께 linked로 전환되도록 한다. It performs the following steps when called:
requiredModule과 module이 같은 Module Record이면, done을 true로 설정한다.
index를 반환한다.
16.2.1.6.1.3 Evaluate ( )
The Evaluate concrete method of a Cyclic Module Recordmodule takes no arguments and returns a Promise. Evaluate는 이 모듈의 [[Status]]를 linked에서 evaluating-async 또는 evaluated로 전환한다. 주어진 강한 연결 요소 안의 모듈에서 처음 호출될 때, Evaluate는 모듈 평가가 끝나면 resolve되는 Promise를 생성하고 반환한다. 이 Promise는 해당 요소의 [[CycleRoot]]의 [[TopLevelCapability]] 필드에 저장된다. 그 요소 안의 어떤 모듈에서 Evaluate가 나중에 호출되더라도 같은 Promise를 반환한다. (대부분의 작업은 보조 함수 InnerModuleEvaluation이 수행한다.) It performs the following steps when called:
16.2.1.6.1.3.1 InnerModuleEvaluation ( module, stack, index )
The abstract operation InnerModuleEvaluation takes arguments module (a Module Record), stack (a List of Cyclic Module Records), and index (a non-negative integer) and returns either a normal completion containing a non-negative integer or a throw completion. Evaluate가 module에 대한 실제 평가 과정을 수행하고, 의존성 그래프의 다른 모든 모듈에도 재귀적으로 수행하는 데 사용한다. stack 및 index 매개변수와 module의 [[DFSAncestorIndex]] 필드는 InnerModuleLinking에서와 같은 방식으로 사용된다. It performs the following steps when called:
그렇지 않으면, requiredModule.[[Status]]를 evaluating-async로 설정한다.
requiredModule과 module이 같은 Module Record이면, done을 true로 설정한다.
requiredModule.[[CycleRoot]]를 module로 설정한다.
index를 반환한다.
Note 1
모듈은 InnerModuleEvaluation에 의해 순회되는 동안 evaluating이다. 모듈은 실행 완료 시 evaluated가 되거나, [[HasTLA]] 필드가 true이거나 비동기 의존성이 있으면 실행 중 evaluating-async가 된다.
Note 2
비동기 cycle의 모듈에 의존하는 모든 모듈은, 그 cycle이 evaluating이 아닐 때, 대신 [[CycleRoot]]를 통해 cycle의 루트 실행에 의존한다. 이는 cycle 상태를 루트 모듈 상태를 통해 하나의 강한 연결 요소로 취급할 수 있게 보장한다.
16.2.1.6.1.3.2 ExecuteAsyncModule ( module )
The abstract operation ExecuteAsyncModule takes argument module (a Cyclic Module Record) and returns unused. It performs the following steps when called:
Assert: module.[[Status]]는 evaluating 또는 evaluating-async이다.
The abstract operation GatherAvailableAncestors takes arguments module (a Cyclic Module Record) and execList (a List of Cyclic Module Records) and returns unused. It performs the following steps when called:
The abstract operation AsyncModuleExecutionFulfilled takes argument module (a Cyclic Module Record) and returns unused. It performs the following steps when called:
Assert: execList의 모든 요소는 [[AsyncEvaluationOrder]] 필드가 정수로 설정되어 있고, [[PendingAsyncDependencies]] 필드가 0으로 설정되어 있으며, [[EvaluationError]] 필드가 empty로 설정되어 있다.
sortedExecList를 execList의 요소들을 [[AsyncEvaluationOrder]] 필드의 오름차순으로 정렬한 요소들을 갖는 List로 둔다.
The abstract operation AsyncModuleExecutionRejected takes arguments module (a Cyclic Module Record) and error (an ECMAScript language value) and returns unused. It performs the following steps when called:
이 비규범 절은 몇 가지 일반적인 모듈 그래프의 링킹 및 평가 예시를, 오류가 어떻게 발생할 수 있는지에 특히 초점을 맞추어 제시한다.
먼저 다음의 단순한 모듈 그래프를 생각해 보자.
Figure 2: 단순한 모듈 그래프
먼저 오류 조건이 없다고 가정하자. 호스트가 처음 A.LoadRequestedModules()를 호출하면, 가정에 따라 성공적으로 완료되고 B와 C의 의존성도 각각 재귀적으로 로드한다(각각 C 및 없음). 그런 다음 A.[[Status]] = B.[[Status]] = C.[[Status]] = unlinked로 설정한다. 이어서 호스트가 A.Link()를 호출하면, 이 역시 가정에 따라 성공적으로 완료되어 A.[[Status]] = B.[[Status]] = C.[[Status]] = linked가 된다. 이러한 준비 단계는 언제든 수행할 수 있다. 나중에 호스트가 모듈의 가능한 부수 효과를 감수할 준비가 되면 A.Evaluate()를 호출할 수 있으며, 이는 성공적으로 완료되어 undefined로 resolve되는 Promise를 반환한다(역시 가정에 따라). 이 과정에서 먼저 C, 그다음 B가 재귀적으로 평가된다. 이 시점에서 각 모듈의 [[Status]]는 evaluated가 된다.
그다음 A.LoadRequestedModules() 호출이 성공한 뒤 링킹 오류가 관련된 경우를 생각해 보자. C의 InnerModuleLinking은 성공하지만 그 이후 B에서 실패한다면, 예를 들어 C가 제공하지 않는 것을 import하기 때문이라면, 원래의 A.Link()는 실패하고 A와 B의 [[Status]]는 모두 unlinked로 남는다. 하지만 C의 [[Status]]는 linked가 된다.
마지막으로, Link() 호출이 성공한 뒤 평가 오류가 관련된 경우를 생각해 보자. C의 InnerModuleEvaluation은 성공하지만 그 이후 B에서 실패한다면, 예를 들어 B에 예외를 던지는 코드가 포함되어 있기 때문이라면, 원래의 A.Evaluate()는 실패하고 rejected Promise를 반환한다. 그 결과 예외는 A와 B의 [[EvaluationError]] 필드 모두에 기록되고, 이들의 [[Status]]는 evaluated가 된다. C도 evaluated가 되지만, A 및 B와 달리 평가를 성공적으로 완료했으므로 [[EvaluationError]] 없이 남는다. 예외를 저장하면 호스트가 Evaluate() 메서드를 호출해 A 또는 B를 재사용하려 할 때마다 같은 예외를 만나게 된다. (호스트가 Cyclic Module Record를 재사용해야 하는 것은 아니며, 마찬가지로 호스트가 이 메서드들이 던진 예외 객체를 노출해야 하는 것도 아니다. 그러나 명세는 그러한 사용을 가능하게 한다.)
평가는 부수 효과를 일으킬 수 있으므로 한 번만 수행되어야 한다. 따라서 평가가 이미 수행되었는지, 성공하지 못했더라도, 기억하는 것이 중요하다. (오류의 경우, 예외도 기억하는 것이 타당하다. 그렇지 않으면 이후 Evaluate() 호출이 새 예외를 합성해야 하기 때문이다.)
반면 링킹은 부수 효과가 없으므로, 실패하더라도 나중에 문제없이 다시 시도할 수 있다.
로딩은 호스트와 밀접하게 상호작용하며, 일부 호스트에서는 사용자가 실패한 로드를 다시 시도하도록 허용하는 것이 바람직할 수 있다(예를 들어 일시적인 네트워크 상태 불량으로 실패가 발생한 경우).
그다음 호스트는 A.Link()를 호출하여 진행하고, 이는 A에 대해 InnerModuleLinking을 수행한다. 이는 다시 B에 대해 InnerModuleLinking을 호출한다. cycle 때문에 다시 A에 대해 InnerModuleLinking이 트리거되지만, 이 시점에는 A.[[Status]]가 이미 linking이므로 no-op이다. 제어가 A로 돌아와 C에 대해 InnerModuleLinking이 트리거될 때 B.[[Status]] 자체는 linking으로 남아 있다. 이것이 C.[[Status]]가 linked인 상태로 반환된 뒤, A와 B는 함께 linking에서 linked로 전환된다. 이는 이들이 강한 연결 요소를 형성하므로 의도된 동작이다. 이 단계에서는 모듈 그래프가 깊이 우선 탐색으로 순회되기 때문에 같은 SCC 안의 모듈들의 상태를 동시에 전환할 수 있다.
순환 모듈 그래프의 평가 단계에서도 성공 사례에서는 이와 유사한 이야기가 발생한다.
이제 A에 링킹 오류가 있는 경우를 생각해 보자. 예를 들어 C에 존재하지 않는 binding을 import하려 한다고 하자. 이 경우에도 A에 대한 두 번째 InnerModuleLinking 호출에서 조기 반환하는 것을 포함해 위 단계들은 여전히 발생한다. 그러나 원래의 A에 대한 InnerModuleLinking으로 되감아 돌아오면, InitializeEnvironment 중, 즉 C.ResolveExport() 직후에 실패한다. 던져진 SyntaxError 예외는 A.Link까지 전파되며, 이는 현재 자신의 stack 위에 있는 모든 모듈을 재설정한다(이들은 항상 아직 linking인 모듈과 정확히 같다). 따라서 A와 B는 모두 unlinked가 된다. C는 linked로 남는다는 점에 유의하라.
또는 A에 평가 오류가 있는 경우를 생각해 보자. 예를 들어 그 소스 코드가 예외를 던진다고 하자. 이 경우에도 A에 대한 두 번째 InnerModuleEvaluation 호출에서 조기 반환하는 것을 포함해 위 단계들의 평가 시점 대응 과정은 여전히 발생한다. 그러나 원래의 A에 대한 InnerModuleEvaluation으로 되감아 돌아오면, 가정에 따라 실패한다. 던져진 예외는 A.Evaluate()까지 전파되며, 이는 현재 자신의 stack 위에 있는 모든 모듈(즉 아직 evaluating인 모듈)뿐 아니라 [[AsyncParentModules]]를 통해서도 오류를 기록한다. [[AsyncParentModules]]는 AsyncModuleExecutionRejected 알고리즘을 통해 전체 의존성 그래프에서 top-level await를 포함하거나 이에 의존하는 모듈들을 위한 체인을 형성한다. 따라서 A와 B는 모두 evaluated가 되고 예외는 A와 B의 [[EvaluationError]] 필드 모두에 기록되며, C는 [[EvaluationError]] 없이 evaluated로 남는다.
마지막으로, 모든 모듈이 비동기적으로 완료되는 cycle이 있는 모듈 그래프를 생각해 보자.
Figure 5: 비동기 순환 모듈 그래프
로딩과 링킹은 이전과 같이 발생하며, 모든 모듈은 [[Status]]가 linked로 설정된 상태가 된다.
A.Evaluate()를 호출하면 A, B, D에 대해 InnerModuleEvaluation을 호출하며, 이들은 모두 evaluating으로 전환된다. 그런 다음 A에 대해 InnerModuleEvaluation이 다시 호출되는데, 이미 evaluating이므로 no-op이다. 이 시점에서 D.[[PendingAsyncDependencies]]는 0이므로 ExecuteAsyncModule(D)가 호출되고, D의 비동기 실행을 추적하는 새 PromiseCapability와 함께 D.ExecuteModule을 호출한다. B에 대한 InnerModuleEvaluation으로 되감아 돌아와 B.[[PendingAsyncDependencies]]를 1로 설정하고 B.[[AsyncEvaluationOrder]]를 1로 설정한다. 원래의 A에 대한 InnerModuleEvaluation으로 되감아 돌아와 A.[[PendingAsyncDependencies]]를 1로 설정한다. A의 의존성에 대한 루프의 다음 반복에서 C에 대해, 따라서 D(다시 no-op)와 E에 대해 InnerModuleEvaluation을 호출한다. E는 의존성이 없고 cycle의 일부가 아니므로, D와 같은 방식으로 ExecuteAsyncModule(E)를 호출하고 E는 즉시 stack에서 제거된다. 다시 C에 대한 InnerModuleEvaluation으로 되감아 돌아와 C.[[AsyncEvaluationOrder]]를 3으로 설정한다. 이제 A의 의존성에 대한 루프를 끝내고, A.[[AsyncEvaluationOrder]]를 4로 설정한 뒤, 전체 강한 연결 요소를 stack에서 제거하여 모든 모듈을 한 번에 evaluating-async로 전환한다. 이 시점에서 모듈들의 필드는 Table 43에 주어진 것과 같다.
E가 먼저 실행을 마친다고 가정하자. 그 일이 발생하면 AsyncModuleExecutionFulfilled가 호출되고, E.[[Status]]는 evaluated로 설정되며, C.[[PendingAsyncDependencies]]는 감소하여 1이 된다. 갱신된 모듈들의 필드는 Table 44에 주어진 것과 같다.
Table 44: 모듈 E가 실행을 마친 뒤의 모듈 필드
필드
모듈
C
E
[[DFSAncestorIndex]]
0
4
[[Status]]
evaluating-async
evaluated
[[AsyncEvaluationOrder]]
3
done
[[AsyncParentModules]]
« A »
« C »
[[PendingAsyncDependencies]]
1 (D)
0
다음으로 D가 완료된다(아직 실행 중이던 유일한 모듈이었기 때문이다). 그 일이 발생하면 AsyncModuleExecutionFulfilled가 다시 호출되고 D.[[Status]]는 evaluated로 설정된다. 실행 가능한 조상은 B([[AsyncEvaluationOrder]]가 1)와 C([[AsyncEvaluationOrder]]가 3)이므로, B가 먼저 처리된다. B.[[PendingAsyncDependencies]]는 감소하여 0이 되고, B에 대해 ExecuteAsyncModule이 호출되어 실행을 시작한다. C.[[PendingAsyncDependencies]]도 감소하여 0이 되고, C도 실행을 시작한다(B가 await를 포함한다면 B와 병렬로 실행될 수도 있다). 갱신된 모듈들의 필드는 Table 45에 주어진 것과 같다.
Table 45: 모듈 D가 실행을 마친 뒤의 모듈 필드
필드
모듈
B
C
D
[[DFSAncestorIndex]]
0
0
0
[[Status]]
evaluating-async
evaluating-async
evaluated
[[AsyncEvaluationOrder]]
1
3
done
[[AsyncParentModules]]
« A »
« A »
« B, C »
[[PendingAsyncDependencies]]
0
0
0
C가 다음으로 실행을 마친다고 가정하자. 그 일이 발생하면 AsyncModuleExecutionFulfilled가 다시 호출되고, C.[[Status]]는 evaluated로 설정되며, A.[[PendingAsyncDependencies]]는 감소하여 1이 된다. 갱신된 모듈들의 필드는 Table 46에 주어진 것과 같다.
마지막으로 A가 실행을 마친다. 그 일이 발생하면 AsyncModuleExecutionFulfilled가 다시 호출되고 A.[[Status]]는 evaluated로 설정된다. 이 시점에서 A.[[TopLevelCapability]] 안의 Promise(A.Evaluate()에서 반환된 것)가 resolve되고, 이것으로 이 모듈 그래프의 처리가 끝난다. 갱신된 모듈의 필드는 Table 48에 주어진 것과 같다.
Table 48: 모듈 A가 실행을 마친 뒤의 모듈 필드
필드
모듈
A
[[DFSAncestorIndex]]
0
[[Status]]
evaluated
[[AsyncEvaluationOrder]]
done
[[AsyncParentModules]]
« »
[[PendingAsyncDependencies]]
0
또는 B가 실행을 마치기 전에 C가 실행에 실패하고 오류를 반환하는 실패 사례를 생각해 보자. 그 일이 발생하면 AsyncModuleExecutionRejected가 호출되어 C.[[Status]]를 evaluated로 설정하고 C.[[EvaluationError]]를 그 오류로 설정한다. 그런 다음 각 AsyncParentModules에 대해 AsyncModuleExecutionRejected를 수행하여 이 오류를 모든 AsyncParentModules로 전파한다. 갱신된 모듈들의 필드는 Table 49에 주어진 것과 같다.
Table 49: 모듈 C가 오류와 함께 완료된 뒤의 모듈 필드
필드
모듈
A
C
[[DFSAncestorIndex]]
0
0
[[Status]]
evaluated
evaluated
[[AsyncEvaluationOrder]]
done
done
[[AsyncParentModules]]
« »
« A »
[[PendingAsyncDependencies]]
1 (B)
0
[[EvaluationError]]
empty
C의 평가 오류
C가 C의 오류로 A에 대해 AsyncModuleExecutionRejected를 호출하므로, A는 C와 같은 오류로 reject된다. A.[[Status]]는 evaluated로 설정된다. 이 시점에서 A.[[TopLevelCapability]] 안의 Promise(A.Evaluate()에서 반환된 것)는 reject된다. 갱신된 모듈의 필드는 Table 50에 주어진 것과 같다.
그런 다음 B가 오류 없이 실행을 마친다. 그 일이 발생하면 AsyncModuleExecutionFulfilled가 다시 호출되고 B.[[Status]]는 evaluated로 설정된다. GatherAvailableAncestors가 B에 대해 호출된다. 그러나 A.[[CycleRoot]]는 평가 오류가 있는 A이므로 반환되는 sortedExecList에 추가되지 않으며 AsyncModuleExecutionFulfilled는 추가 처리 없이 반환된다. 이후 B를 import하는 모든 모듈은 cycle root A에 설정된 C의 평가 오류에서 나온 B.[[CycleRoot]].[[EvaluationError]]의 rejection을 resolve하게 된다. 갱신된 모듈들의 필드는 Table 51에 주어진 것과 같다.
Source Text Module Record는 목표 기호Module을 사용해 파싱된 ECMAScript 소스 텍스트(11)로부터 정의된 모듈에 관한 정보를 나타내는 데 사용된다. 그 필드들은 모듈이 import하고 export하는 이름에 관한 요약 정보를 포함하며, 그 구체 메서드들은 이 요약 정보를 사용해 모듈을 링크하고 평가한다.
원하는 binding이 [[ModuleRequest]]로 식별되는 모듈에 의해 export되는 이름. ExportDeclaration이 ModuleSpecifier를 가지지 않으면 null. namespace는 export * as ns from "mod" 선언에 사용된다. all-but-default는 export * from "mod" 선언에 사용된다.
[[LocalName]]
String 또는 null
import하는 모듈 안에서 export된 값에 로컬로 접근하는 데 사용되는 이름. export된 값이 모듈 안에서 로컬로 접근 가능하지 않으면 null.
Note 2
Table 56는 구문적 export 형식을 나타내는 데 사용되는 ExportEntry record 필드의 예를 제공한다:
The abstract operation ParseModule takes arguments sourceText (ECMAScript source text), realm (a Realm Record), and hostDefined (anything) and returns a Source Text Module Record or a non-empty List of SyntaxError objects. sourceText를 Module로 파싱한 결과를 기반으로 Source Text Module Record를 생성한다. It performs the following steps when called:
NOTE: 원래 다른 모듈에서 import된 binding 또는 namespace object를 export할 때, ExportEntry Record는 그 binding 또는 namespace object가 import된 뒤 export된 것이 아니라 원래 모듈에서 직접 재export되었다면 가졌을 형식과 일치하도록 다시 작성된다. 이를 통해 export * from을 통해 같은 이름 아래 같은 binding 또는 namespace를 두 번 export하여 생기는 충돌을 Source Text Module Record의 ResolveExport 구체 메서드의 9.e.iii 단계에서 ambiguous로 처리하지 않고 무시할 수 있다.
ie를 [[LocalName]]이 ee.[[LocalName]]인 importEntries의 요소로 둔다.
구현은 해당 모듈 소스 텍스트에 대해 ParseModule을 평가하기 전에 모듈 소스 텍스트를 파싱하고 Early Error 조건을 분석할 수 있다. 그러나 모든 오류 보고는 이 명세가 실제로 해당 소스 텍스트에 대해 ParseModule을 수행하는 시점까지 지연되어야 한다.
The ResolveExport concrete method of a Source Text Module Recordmodule takes argument exportName (a String) and optional argument resolveSet (a List of Records with fields [[Module]] (a Module Record) and [[ExportName]] (a String)) and returns a ResolvedBinding Record, null, or ambiguous.
ResolveExport는 import된 binding을 실제 정의 모듈과 로컬 binding 이름으로 해석하려고 시도한다. 정의 모듈은 이 메서드가 호출된 Module Record가 나타내는 모듈일 수도 있고, 그 모듈이 import하는 다른 모듈일 수도 있다. resolveSet 매개변수는 해소되지 않은 순환 import/export 경로를 감지하는 데 사용된다. 특정 Module Record와 exportName으로 구성된 쌍이 이미 resolveSet에 있는 상태로 도달하면, import 순환성이 발견된 것이다. ResolveExport를 재귀적으로 호출하기 전에 module과 exportName으로 구성된 쌍이 resolveSet에 추가된다.
정의 모듈이 발견되면 ResolvedBinding Record { [[Module]], [[BindingName]] }가 반환된다. 이 record는 원래 요청된 export의 해소된 binding을 식별한다. 단, 로컬 binding이 없는 namespace의 export인 경우는 예외이다. 이 경우 [[BindingName]]은 namespace로 설정된다. 정의가 발견되지 않았거나 요청이 순환적인 것으로 밝혀지면 null이 반환된다. 요청이 ambiguous한 것으로 밝혀지면 ambiguous가 반환된다.
AsyncBlockStart(capability, module.[[ECMAScriptCode]], moduleContext)를 수행한다.
unused를 반환한다.
16.2.1.8 Synthetic Module Records
Synthetic Module Record는 명세에 의해 정의된 모듈에 대한 정보를 나타내는 데 사용된다. 그 export된 이름들은 생성 시 정적으로 정의되지만, 해당 값들은 SetSyntheticModuleExport를 사용하여 시간이 지남에 따라 변경될 수 있다. 이들은 import나 의존성을 가지지 않는다.
Note
Synthetic Module Record는 다양한 모듈 타입을 정의하는 데 사용될 수 있다. 예를 들어 JSON 모듈이나 CSS 모듈 등이 있다.
Table 38에 정의된 필드에 더해, Synthetic Module Record는 Table 57에 나열된 추가 필드를 가진다.
The abstract operation CreateDefaultExportSyntheticModule takes argument defaultExport (an ECMAScript language value) and returns a Synthetic Module Record. default export가 defaultExport인 Synthetic Module Record를 생성한다. It performs the following steps when called:
The abstract operation SetSyntheticModuleExport takes arguments module (a Synthetic Module Record), exportName (a String), and exportValue (an ECMAScript language value) and returns unused. 기존 Synthetic Module Record의 export 값을 설정하거나 변경하는 데 사용할 수 있다. It performs the following steps when called:
The LoadRequestedModules concrete method of a Synthetic Module Recordmodule takes optional argument hostDefined (anything) and returns a Promise. It performs the following steps when called:
The ResolveExport concrete method of a Synthetic Module Recordmodule takes argument exportName (a String) and optional argument resolveSet (a List of Records with fields [[Module]] (a Module Record) and [[ExportName]] (a String)) and returns a ResolvedBinding Record, null, or ambiguous. It performs the following steps when called:
! Call(pc.[[Resolve]], undefined, « undefined »)를 수행한다.
pc.[[Promise]]를 반환한다.
16.2.1.9 GetImportedModule ( referrer, request )
The abstract operation GetImportedModule takes arguments referrer (a Cyclic Module Record) and request (a ModuleRequest Record) and returns a Module Record. It performs the following steps when called:
실제 수행되는 과정은 호스트 정의이지만, 일반적으로 적절한 Module Record를 로드하기 위해 필요한 I/O 작업을 수행하는 것으로 구성된다. 서로 다른 (referrer, moduleRequest.[[Specifier]], moduleRequest.[[Attributes]]) 삼중 조합이 동일한 Module Record 인스턴스로 매핑될 수 있다. 실제 매핑 의미론은 호스트 정의이지만, 일반적으로 매핑 과정에서 specifier에 대한 정규화 과정이 적용된다. 전형적인 정규화 과정에는 상대 경로 및 축약된 경로 지정자의 확장과 같은 작업이 포함된다.
Note 2
위의 텍스트는 type: "json"으로 import될 때 JSON 모듈을 지원해야 함을 요구하지만(HostLoadImportedModule이 정상적으로 완료되는 경우), type: "json" 없이 import될 때 JSON 모듈을 지원하는 것을 금지하지는 않는다.
16.2.1.11 FinishLoadingImportedModule ( referrer, moduleRequest, payload, result )
The abstract operation AllImportAttributesSupported takes argument attributes (a List of ImportAttribute Records) and returns a Boolean. It performs the following steps when called:
The host-defined abstract operation HostGetSupportedImportAttributes takes no arguments and returns a List of Strings. 호스트 환경이 지원하는 import attributes를 지정할 수 있도록 한다. 지원되는 키를 가진 attribute만 호스트에 전달된다.
HostGetSupportedImportAttributes의 구현은 다음 요구 사항을 준수해야 한다:
HostGetSupportedImportAttributes의 기본 구현은 새로운 빈 List를 반환하는 것이다.
Note
호스트가 처리할 attribute를 선택하도록 모든 attribute를 전달하는 대신, 지원되는 import attribute를 명시하도록 요구하는 목적은 지원되지 않는 attribute가 서로 다른 호스트 간에 일관되게 처리되도록 보장하기 위함이다.
16.2.1.13 GetModuleNamespace ( module )
The abstract operation GetModuleNamespace takes argument module (an instance of a concrete subclass of Module Record) and returns a Module Namespace Object. module의 export를 나타내는 Module Namespace Object를 가져오며, 처음 요청될 때 지연 생성하고 이후 재사용을 위해 module.[[Namespace]]에 저장한다. It performs the following steps when called:
GetModuleNamespace는 절대 예외를 던지지 않는다. 대신 해소할 수 없는 이름은 이 시점에서 단순히 namespace에서 제외된다. 이러한 이름들은 나중에 실제 링크 오류로 이어지지만, 어디에서도 명시적으로 요청되지 않는 ambiguous star export인 경우에는 예외가 발생하지 않을 수 있다.
The syntax-directed operation ImportEntries takes no arguments and returns a List of ImportEntry Records. It is defined piecewise over the following productions:
The syntax-directed operation ImportEntriesForModule takes argument module (a ModuleRequest Record) and returns a List of ImportEntry Records. It is defined piecewise over the following productions:
entry를 ImportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName }로 둔다.
« entry »를 반환한다.
16.2.2.4 Static Semantics: WithClauseToAttributes
The syntax-directed operation WithClauseToAttributes takes no arguments and returns a List of ImportAttribute Records. It is defined piecewise over the following productions:
attributes를 [[Key]] 필드의 사전식 순서에 따라 정렬하되, 각 해당 필드의 값을 UTF-16 코드 단위 값의 시퀀스로 취급한다. NOTE: 이 정렬은 호스트가 attribute가 열거되는 순서를 기반으로 동작을 변경하는 것이 금지된다는 점에서만 관찰 가능하다.
The syntax-directed operation ExportEntries takes no arguments and returns a List of ExportEntry Records. It is defined piecewise over the following productions:
entry를 ExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: "*default*", [[ExportName]]: "default" }로 둔다.
« entry »를 반환한다.
Note
"*default*"는 이 명세 안에서 익명 default export 값에 대한 synthetic name으로 사용된다. 자세한 내용은 이 노트를 보라.
16.2.3.5 Static Semantics: ExportEntriesForModule
The syntax-directed operation ExportEntriesForModule takes argument module (a ModuleRequest Record or null) and returns a List of ExportEntry Records. It is defined piecewise over the following productions:
유일한 요소가 새 ExportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName, [[ExportName]]: sourceName }인 List를 반환한다.
유일한 요소가 새 ExportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName, [[ExportName]]: exportName }인 List를 반환한다.
16.2.3.6 Static Semantics: ReferencedBindings
The syntax-directed operation ReferencedBindings takes no arguments and returns a List of Parse Nodes. It is defined piecewise over the following productions:
구현체는 관련된 ECMAScript 언어 구성요소가 평가될 때 대부분의 오류를 보고해야 한다. An 조기 오류는 오류를 포함하는 Script의 어떤 구성도 평가되기 전에 감지되어 보고될 수 있는 오류이다. 조기 오류의 존재는 해당 구성의 평가를 방지한다. 구현체는 ParseScript에서 해당 Script를 파싱하는 과정의 일부로 Script에 있는 조기 오류를 보고해야 한다. Module의 조기 오류는 Module이 평가되는 시점에 보고되며 그 Module은 초기화되지 않는다. eval 코드의 조기 오류는 eval이 호출될 때 보고되며 eval 코드의 평가를 방지한다. 조기 오류가 아닌 모든 오류는 런타임 오류이다.
구현체는 본 명세서의 “Static Semantics: Early Errors” 하위절에 열거된 상태가 발생하면 이를 조기 오류로 보고해야 한다.
컴파일러가 어떤 구성체가 어떤 상황에서도 오류 없이 실행될 수 없음을 증명할 수 있더라도, 구현체는 다른 종류의 오류를 조기 오류로 취급해서는 안 된다. 구현체는 그러한 경우에 조기 경고를 발행할 수는 있지만, 관련 구성체가 실제로 실행될 때까지 오류를 보고해서는 안 된다.
구현체는 명시된 대로 모든 오류를 보고해야 하며, 다음의 경우는 예외이다:
Except as restricted in 17.1, 호스트 또는 구현체는 Script 구문, Module 구문, 정규 표현식 패턴 또는 플래그 구문을 확장할 수 있다. 이를 허용하기 위해, eval 호출, 정규 표현식 리터럴 사용, Function 또는 RegExp 생성자 사용과 같이 SyntaxError를 던질 수 있는 모든 연산은 스크립트 구문 또는 정규 표현식 패턴·플래그 구문에 대한 호스트 정의 확장을 만났을 때 SyntaxError를 던지는 대신 호스트 정의 동작을 나타낼 수 있다.
Except as restricted in 17.1, 호스트 또는 구현체는 이 명세에 설명된 것 이외의 추가 타입, 값, 객체, 속성 및 함수를 제공할 수 있다. 이는 전역 범위에서 변수를 조회하는 것과 같은 구성체가 오류(예: ReferenceError)를 던지는 대신 호스트 정의 동작을 갖게 되는 원인이 될 수 있다.
구현체가 어떤 함수 객체에 "caller"라는 이름의 자체 소유 속성을 확장하면, 그 속성의 값은 [[Get]] 또는 [[GetOwnProperty]]를 통해 관찰될 때 strict 함수 객체가 되어서는 안 된다. 만약 그것이 접근자 속성이라면, 그 속성의 [[Get]] 속성값인 함수는 호출될 때 결코 strict 함수를 반환해서는 안 된다.
매핑된 arguments 객체이건 매핑되지 않은 arguments 객체이건 "caller"라는 이름의 자체 소유 속성을 가진 객체로 생성되어서는 안 된다.
toLocaleString과 같이 ECMA-402에 명시된 내장 메서드의 동작은 ECMA-402에서 명시한 경우를 제외하고 확장되어서는 안 된다.
22.2.1 및 B.1.2에 있는 RegExp 패턴 문법은 [UnicodeMode] 문법 매개변수가 존재할 때 소스 문자 A-Z 또는 a-z 중 어느 것도 IdentityEscape[+UnicodeMode]로 인식하도록 확장되어서는 안 된다.
Syntactic Grammar는 BindingIdentifier 비단말 기호와 매치되는 소스 텍스트 바로 뒤에 토큰 :가 즉시 올 수 있도록 허용하는 어떤 방식으로도 확장되어서는 안 된다.
ECMAScript Script 또는 Module이 실행을 시작할 때 항상 이용 가능한 특정 내장 객체들이 있다. 그중 하나인 전역 객체는 실행 프로그램의 전역 환경의 일부이다. 나머지 객체들은 전역 객체의 초기 속성으로 접근 가능하거나 접근 가능한 내장 객체의 속성으로 간접적으로 접근 가능하다.
별도 명시가 없는 한, 함수로 호출 가능한 내장 객체는 10.3에 설명된 특성을 갖는 내장 함수 객체이다. 별도 명시가 없는 한, 내장 객체의 [[Extensible]] 내부 슬롯은 초기값으로 true를 가진다. 모든 내장 함수 객체는 [[Realm]] 내부 슬롯을 가지며 그 값은 객체가 처음 생성된 realm의 Realm 레코드이다.
많은 내장 객체들이 함수이다: 인수와 함께 호출될 수 있다. 그중 일부는 또한 생성자이다: new 연산자와 함께 사용하도록 의도된 함수이다. 각 내장 함수에 대해 이 명세서는 그 함수가 요구하는 인수와 그 함수 객체의 속성을 설명한다. 각 내장 생성자에 대해서는, 해당 생성자를 호출하는 new 표현식이 반환하는 특정 객체 인스턴스의 속성 및 그 생성자의 프로토타입 객체의 속성도 추가로 설명한다.
특정 함수의 설명에서 달리 명시되지 않는 한, 내장 함수나 생성자에 요구된 것보다 적은 인수가 제공되면, 그 함수나 생성자는 충분한 추가 인수가 제공된 것과 정확히 동일하게 동작해야 하며, 각각의 추가 인수는 undefined 값이다. 이러한 누락된 인수는 “존재하지 않음”으로 간주되며 명세 알고리즘에서 그 방식으로 식별될 수 있다. 특정 함수의 설명에서 “this 값”과 “NewTarget” 용어는 10.3에 주어진 의미를 갖는다.
특정 함수의 설명에서 달리 명시되지 않는 한, 내장 함수나 생성자에 허용된 것보다 더 많은 인수가 제공되면 초과 인수들은 호출 시 평가된 다음 함수에 의해 무시된다. 그러나 구현체는 그러한 인수들에 관해 구현체 특정 동작을 정의할 수 있으며, 그 동작이 단지 초과 인수의 존재만을 근거로 TypeError 예외를 던지는 방식이어서는 안 된다.
Note 1
내장 함수 집합에 추가 기능을 더하는 구현체는 기존 함수에 새로운 매개변수를 추가하기보다는 새로운 함수를 추가하는 방식으로 하는 것이 권장된다.
달리 명시되지 않는 한, 모든 내장 함수와 모든 내장 생성자는 Function 프로토타입 객체, 즉 표현식 Function.prototype(20.2.3)의 초기값을 [[Prototype]] 내부 슬롯의 값으로 가진다.
만약 이 명세서가 내장 생성자의 동작을 알고리즘 단계로 정의하면, 그 알고리즘이 [[Call]]과 [[Construct]]의 목적상 그 동작이다. 만약 알고리즘이 이 두 경우를 구분할 필요가 있으면, NewTarget이 undefined인지 확인하는데, 이는 [[Call]] 호출을 나타낸다.
내장 함수 객체로 식별되지만 생성자로 식별되지 않은 함수 객체는, 특정 함수 설명에서 달리 명시되지 않는 한, [[Construct]] 내부 메서드를 구현하지 않는다.
생성자가 아닌 내장 함수 객체는 특정 함수 설명에서 달리 명시되지 않는 한 "prototype" 속성을 갖지 않는다.
이 명세서에 정의된 모든 내장 함수는 CreateBuiltinFunction추상 연산(10.3.4)을 호출하여 생성된다. length 및 name 매개변수의 값은 아래에서 논의되는 "length" 및 "name" 속성의 초기값이다. prefix 매개변수의 값도 아래에서 유사하게 논의된다.
모든 내장 함수 객체는 생성자를 포함하여 "length" 속성을 가지며 그 값은 음이 아닌 정수 Number이다. 달리 명시되지 않는 한, 이 값은 함수 설명의 하위절 제목에 표시된 필수 매개변수의 수이다. 선택적 매개변수와 나머지 매개변수는 매개변수 수에 포함되지 않는다.
Note 2
예를 들어, Array 프로토타입 객체의 "map" 속성의 초기값인 함수 객체는 하위절 제목 «Array.prototype.map (callback [ , thisArg])» 아래에 설명되어 있으며 여기에는 두 개의 명명된 인수 callback과 thisArg가 표시되고 후자는 선택적이다; 따라서 그 함수 객체의 "length" 속성의 값은 1𝔽이다.
달리 명시되지 않는 한, 내장 함수 객체의 "length" 속성은 속성 어트리뷰트 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }를 가진다.
모든 내장 함수 객체는 생성자를 포함하여 "name" 속성을 가지며 그 값은 문자열이다. 달리 명시되지 않는 한, 이 값은 명세에서 함수에 부여된 이름이다. 익명 함수로 식별된 함수는 "name" 속성의 값으로 빈 문자열을 사용한다. 객체의 속성으로 지정된 함수에 대해 이름 값은 함수를 접근하는 데 사용되는 속성 이름 문자열이다. 내장 속성의 get 또는 set 접근자 함수로 지정된 함수들은 CreateBuiltinFunction을 호출할 때 prefix 매개변수로 "get" 또는 "set"이 전달된다.
만약 내장 함수의 속성 키가 Symbol 값인 경우 그 "name" 속성의 값은 명시적으로 지정된다. 만약 그러한 명시된 값이 접두사 "get " 또는 "set "으로 시작하고 그 값이 지정된 함수가 내장 속성의 get 또는 set 접근자 함수라면, 접두사를 제외한 값이 name 매개변수로 전달되고 "get" 또는 "set"(각각)이 prefix 매개변수로 전달되어 CreateBuiltinFunction을 호출한다.
달리 명시되지 않는 한, 내장 함수 객체의 "name" 속성은 속성 어트리뷰트 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }를 가진다.
19에서 28까지의 절들과 부록 B.2에 설명된 모든 다른 데이터 속성은 달리 명시되지 않는 한 속성 어트리뷰트 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }를 가진다.
19에서 28까지의 절들과 부록 B.2에 설명된 모든 다른 접근자 속성은 달리 명시되지 않는 한 속성 어트리뷰트 { [[Enumerable]]: false, [[Configurable]]: true }를 가진다. 만약 get 접근자 함수만 설명되어 있다면 set 접근자 함수의 기본값은 undefined이다. 만약 set 접근자만 설명되어 있다면 get 접근자의 기본값은 undefined이다.
19 전역 객체
다음은 전역 객체이다:
어떤 실행 컨텍스트로 제어가 들어가기 전에 생성된다.
[[Construct]] 내부 메소드를 가지지 않는다; new 연산자로 생성자처럼 사용할 수 없다.
19.2.1.1 PerformEval ( source, strictCaller, direct )
The abstract operation PerformEval takes arguments source (an ECMAScript language value), strictCaller (a Boolean), and direct (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:
eval 코드는 호출한 컨텍스트 또는 eval 코드 자체의 코드 중 어느 쪽이라도 엄격 모드 코드인 경우, 호출한 컨텍스트의 변수 환경에 변수나 함수 바인딩을 생성할 수 없다. 대신 그러한 바인딩들은 eval 코드에서만 접근 가능한 새로운 VariableEnvironment에 인스턴스화된다. let, const, 또는 class 선언으로 도입된 바인딩은 항상 새로운 LexicalEnvironment에 인스턴스화된다.
19.2.1.2 HostEnsureCanCompileStrings ( calleeRealm, parameterStrings, bodyString, direct )
The host-defined abstract operation HostEnsureCanCompileStrings takes arguments calleeRealm (a Realm Record), parameterStrings (a List of Strings), bodyString (a String), and direct (a Boolean) and returns either a normal completion containing unused or a throw completion. 호스트 환경이 문자열을 ECMAScript 코드로 해석·평가하는 것을 허용하는 특정 ECMAScript 함수들을 차단할 수 있도록 한다.
parameterStrings는 함수 생성자들을 사용할 때 매개변수 목록을 만들기 위해 연결될 문자열들을 나타낸다. bodyString은 함수 본문 또는 eval 호출에 전달된 문자열을 나타낸다.
direct는 평가가 직접 eval인지 여부를 나타낸다.
HostEnsureCanCompileStrings의 기본 구현은 NormalCompletion(unused)을 반환하는 것이다.
이 함수는 string의 선행 부분만을 Number 값으로 해석할 수 있다; 십진수 표기법의 일부로 해석할 수 없는 코드 유닛은 무시되며, 무시된 코드 유닛이 있었다는 표시를 제공하지 않는다.
19.2.5 parseInt ( string, radix )
이 함수는 지정된 radix에 따라 string의 내용을 해석하여 정수 Number를 생성한다. string의 선행 공백은 무시된다. 만약 radix가 0으로 강제 변환되면(예: undefined일 때), 숫자 표기법이 "0x" 또는 "0X"으로 시작하지 않는 한 10으로 간주된다; 시작이 "0x" 또는 "0X"이면 16으로 간주된다. 만약 radix가 16이면, 숫자 표기법은 선택적으로 "0x" 또는 "0X"으로 시작할 수 있다.
만약 trimmedString의 길이 ≥ 2이고 처음 두 코드 유닛이 "0x" 또는 "0X"이면,
trimmedString을 인덱스 2부터의 부분 문자열로 설정하라.
radixMV를 16으로 설정하라.
만약 trimmedString이 radix-radixMV 자릿수가 아닌 코드 유닛을 포함하면, 그 첫 번째 그런 코드 유닛의 인덱스를 end로 하라; 그렇지 않으면 end를 trimmedString의 길이로 하라.
numberString을 trimmedString의 0부터 end까지의 부분 문자열로 하라.
만약 numberString이 비어있으면, NaN을 반환한다.
mathInt를 numberString이 radix-radixMV 표기법으로 나타내는 정수 값으로 하라; 값 10~35에 대해 문자 AZ 및 az를 사용한다. (단, 만약 radixMV = 10이고 numberString이 20개를 초과하는 유효 숫자를 포함하면 구현은 20번째 이후의 모든 유효 숫자를 0으로 대체할 수 있다; 그리고 radixMV가 2,4,8,10,16,32 중 하나가 아니면, mathInt는 구현이 근사한 정수일 수 있다.)
이 함수는 string의 선행 부분만을 정수 값으로 해석할 수 있다; 정수 표기법의 일부로 해석할 수 없는 코드 유닛은 무시되며, 무시된 코드 유닛이 있었다는 표시를 제공하지 않는다.
19.2.6 URI 처리 함수들
Uniform Resource Identifier(URI)는 리소스(예: 웹 페이지나 파일)와 이를 접근하는 전송 프로토콜(예: HTTP 또는 FTP)을 식별하는 문자열이다. ECMAScript 언어 자체는 URI 사용을 위한 추가 지원을 제공하지 않으며, 이 절에서 설명된 대로 URI를 인코딩하고 디코딩하는 함수들만 제공한다. encodeURI와 decodeURI는 전체 URI와 함께 동작하도록 설계되었으며, 예약된 문자가 특별한 의미(예: 구분자)를 갖는 것으로 간주하여 인코딩하지 않는다. encodeURIComponent와 decodeURIComponent는 URI의 개별 구성 요소와 함께 동작하도록 설계되었으며, 예약된 문자가 텍스트를 나타내고 구성 요소가 전체 URI의 일부일 때 특별한 의미를 피하기 위해 인코딩되어야 한다고 가정한다.
Note 1
예약 문자의 집합은 RFC 2396을 기반으로 하며 더 최근의 RFC 3986이 도입한 변경을 반영하지 않는다.
Note 2
많은 ECMAScript 구현은 웹 페이지를 조작하는 추가 함수와 메서드를 제공한다; 이러한 함수들은 이 표준의 범위를 벗어난다.
19.2.6.1 decodeURI ( encodedURI )
이 함수는 encodeURI 함수가 도입했을 수 있는 형태의 이스케이프 시퀀스와 UTF-8 인코딩을 해당 코드 포인트가 나타내는 UTF-16 인코딩으로 대체한 새로운 URI 버전을 계산한다. encodeURI가 도입했을 수 없는 이스케이프 시퀀스는 대체하지 않는다.
The abstract operation Encode takes arguments string (a String) and extraUnescaped (a String) and returns either a normal completion containing a String or a throw completion. UTF-16로 인코딩된 코드 포인트의 시퀀스로서 string을 해석하면서 URI 인코딩과 이스케이프를 수행한다(참조 6.1.4). RFC 2396에서 예약되지 않은 것으로 식별되었거나 extraUnescaped에 나타나는 문자는 이스케이프되지 않는다. It performs the following steps when called:
len을 string의 길이로 하라.
result를 빈 문자열로 하라.
alwaysUnescaped를 ASCII 단어 문자와 "-.!~*'()"의 문자열 이어붙이기로 하라.
퍼센트 인코딩은 개별 옥텟을 표현하기 위해 사용되므로, 단일 코드 포인트가 여러 연속된 이스케이프 시퀀스(각 8비트 UTF-8 코드 유닛마다 하나)로 표현될 수 있다.
19.2.6.6 Decode ( string, preserveEscapeSet )
The abstract operation Decode takes arguments string (a String) and preserveEscapeSet (a String) and returns either a normal completion containing a String or a throw completion. Basic Latin 문자들 중 preserveEscapeSet에 해당하는 이스케이프 시퀀스는 보존하면서 URI 언이스케이프와 디코딩을 수행한다. It performs the following steps when called:
RFC 3629는 잘못된 UTF-8 옥텟 시퀀스의 디코딩을 금지한다. 예를 들어 잘못된 시퀀스 0xC0 0x80은 코드 유닛 0x0000으로 디코딩되어서는 안 된다. Decode 알고리즘의 구현체는 이러한 잘못된 시퀀스를 만났을 때 URIError를 던져야 한다.
19.2.6.7 ParseHexOctet ( string, position )
The abstract operation ParseHexOctet takes arguments string (a String) and position (a non-negative integer) and returns either a non-negative integer or a non-empty List of SyntaxError objects. 문자열의 지정된 position에서 두 개의 16진수 문자를 파싱하여 부호 없는 8비트 정수로 변환한다. It performs the following steps when called:
len을 string의 길이로 하라.
단언: position + 2 ≤ len.
hexDigits를 string의 position부터 position + 2까지의 부분 문자열로 하라.
The abstract operation ObjectDefineProperties takes arguments obj (an Object) and properties (an ECMAScript language value) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:
The abstract operation GetOwnPropertyKeys takes arguments value (an ECMAScript language value) and type (string or symbol) and returns either a normal completion containing a List of property keys or a throw completion. It performs the following steps when called:
callback은 두 개의 인수를 받는 함수여야 한다. groupBy는 items의 각 요소에 대해 오름차순으로 callback을 한 번 호출하여 새로운 객체를 구성한다. callback이 반환하는 각 값은 속성 키로 강제 변환된다. 그러한 속성 키들 각각에 대해 결과 객체는 해당 속성 키를 키로 하고 callback의 반환 값이 해당 키로 강제 변환되는 모든 요소를 포함하는 배열을 값으로 하는 속성을 가진다.
역사적으로 이 메서드는 이전 판본의 이 명세에서 다양한 내장 객체들에 대한 명목형 타입 태그로 사용되었던 [[Class]] 내부 슬롯의 문자열 값을 접근하기 위해 가끔 사용되었다. 위의 toString 정의는 이러한 특정 종류의 내장 객체들에 대해 toString을 타입 검사로 사용하는 레거시 코드와의 호환성을 보존한다. 다른 종류의 내장 또는 프로그램 정의 객체들에 대해 신뢰할 수 있는 타입 검사 메커니즘을 제공하지 않는다. 또한 프로그램은 %Symbol.toStringTag%를 사용하여 그러한 레거시 타입 검사들의 신뢰성을 무효화하는 방식으로 사용할 수 있다.
생성자가 아닌 함수로 호출될 때 새로운 함수 객체를 생성하고 초기화한다. 따라서 함수 호출 Function(…)은 동일한 인수로 new Function(…) 객체 생성 표현식과 동등하다.
클래스 정의의 extends 절의 값으로 사용될 수 있다. 지정된 Function 동작을 상속하려는 서브클래스 생성자는 내장 함수 동작에 필요한 내부 슬롯들로 서브클래스 인스턴스를 생성하고 초기화하기 위해 Function 생성자에 대한 super 호출을 포함해야 한다. 함수 객체를 정의하는 모든 ECMAScript 문법 형태는 Function의 인스턴스를 생성한다. 내장된 GeneratorFunction, AsyncFunction, AsyncGeneratorFunction 서브클래스를 제외하고는 Function 서브클래스의 인스턴스를 생성하는 문법적 수단은 없다.
20.2.1.1 Function ( ...parameterArgs, bodyArg )
마지막 인수(있다면)는 함수의 본문(실행 가능한 코드)을 지정한다; 앞의 인수들은 형식 매개변수를 지정한다.
The abstract operation CreateDynamicFunction takes arguments constructor (a constructor), newTarget (a constructor or undefined), kind (normal, generator, async, or async-generator), parameterArgs (a List of ECMAScript language values), and bodyArg (an ECMAScript language value) and returns either a normal completion containing an ECMAScript function object or a throw completion. constructor는 이 동작을 수행하는 생성자 함수이다. newTarget는 new가 처음 적용된 생성자이다. parameterArgs와 bodyArg는 constructor에 전달된 인수 값을 반영한다. It performs the following steps when called:
만약 newTarget이 undefined이면 newTarget을 constructor로 설정하라.
thisArg 값은 변경 없이 this 값으로 전달된다. 이는 Edition 3에서 undefined 또는 null인 thisArg가 전역 객체로 대체되고 다른 모든 값에 ToObject가 적용되어 그 결과가 this 값으로 전달되던 동작에서의 변경이다. thisArg가 변경 없이 전달되더라도, 비엄격 함수들은 함수 진입 시에 여전히 이러한 변환을 수행한다.
Note 2
만약 func가 화살표 함수이거나 바인드된 함수 이국적 객체이면, thisArg는 단계 6의 함수 [[Call]]에 의해 무시될 것이다.
이 속성은 속성들 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }을 가진다.
Note
이것은 대부분의 함수가 상속하는 %Symbol.hasInstance%의 기본 구현이다. %Symbol.hasInstance%는 instanceof 연산자가 값이 특정 생성자의 인스턴스인지 결정할 때 호출된다. 예를 들어 식
v instanceof F
는 다음과 같이 평가된다
F[%Symbol.hasInstance%](v)
생성자 함수는 함수에 다른 %Symbol.hasInstance% 메서드를 노출함으로써 instanceof가 인식하는 객체들을 제어할 수 있다.
이 속성은 바인드된 함수의 대상 함수를 전역적으로 노출하는 데 사용될 수 있는 변조를 방지하기 위해 쓰기 불가 및 구성 불가로 설정되어 있다.
이 메서드의 "name" 속성의 값은 "[Symbol.hasInstance]"이다.
20.2.4 함수 인스턴스들
모든 Function 인스턴스는 ECMAScript 함수 객체이며 Table 25에 나열된 내부 슬롯들을 가진다. Function.prototype.bind 메서드(20.2.3.2)를 사용하여 생성된 함수 객체는 Table 26에 나열된 내부 슬롯들을 가진다.
함수 인스턴스는 다음 속성들을 가진다:
20.2.4.1 length
"length" 속성의 값은 함수가 기대하는 인수의 전형적인 수를 나타내는 정수 Number이다. 그러나 언어는 함수가 다른 수의 인수로 호출되는 것을 허용한다. "length" 속성에 명시된 수와 다른 수의 인수로 호출될 때 함수의 동작은 함수에 따라 다르다. 이 속성은 속성들 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }을 가진다.
20.2.4.2 name
"name" 속성의 값은 함수에 대해 설명적인 문자열이다. 이름은 의미론적 중요성은 없지만 일반적으로 ECMAScript 소스 텍스트에서 정의 지점에서 함수를 참조하는 변수나 속성 이름이다. 이 속성은 속성들 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }을 가진다.
이 명세에 의해 컨텍스트 이름이 연관되지 않은 익명 함수 객체는 "name" 속성의 값으로 빈 문자열을 사용한다.
20.2.4.3 prototype
생성자로 사용될 수 있는 함수 인스턴스는 "prototype" 속성을 가진다. 그러한 Function 인스턴스가 생성될 때마다 또 다른 일반 객체가 생성되며 그 객체는 해당 함수의 "prototype" 속성의 초기 값이다. 달리 명시되지 않는 한, "prototype" 속성의 값은 그 함수가 생성자로 호출될 때 생성되는 객체의 [[Prototype]] 내부 슬롯을 초기화하는 데 사용된다.
이 속성은 속성들 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }을 가진다.
The host-defined abstract operation HostHasSourceTextAvailable takes argument func (a function object) and returns a Boolean. 호스트 환경이 func에 대한 소스 텍스트 제공을 방지할 수 있게 한다.
HostHasSourceTextAvailable의 구현은 다음 요구사항을 충족해야 한다:
매개변수에 대해 결정론적이어야 한다. 특정 func을 인수로 받아 호출될 때마다 동일한 결과를 반환해야 한다.
HostHasSourceTextAvailable의 기본 구현은 true를 반환하는 것이다.
클래스 정의의 extends 절의 값으로 사용될 수 있다. 지정된 Boolean 동작을 상속하려는 서브클래스 생성자는 [[BooleanData]] 내부 슬롯을 가진 서브클래스 인스턴스를 생성하고 초기화하기 위해 Boolean 생성자에 대한 super 호출을 포함해야 한다.
The abstract operation ThisBooleanValue takes argument value (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
만약 value가 Boolean이면 value를 반환한다.
만약 value가 객체이고 value가 [[BooleanData]] 내부 슬롯을 가지고 있으면,
b를 value.[[BooleanData]]로 하자.
단언: b는 Boolean이다.
b를 반환하라.
TypeError 예외를 던진다.
20.3.4 Boolean 인스턴스의 속성들
Boolean 인스턴스는 Boolean 프로토타입 객체로부터 속성을 상속하는 일반 객체이다. Boolean 인스턴스는 [[BooleanData]] 내부 슬롯을 가진다. [[BooleanData]] 내부 슬롯은 이 Boolean 객체가 표현하는 Boolean 값이다.
GlobalSymbolRegistry List는 전역적으로 사용 가능한 추가 전용 List이다. 이는 모든 Realm이 공유한다. 어떤 ECMAScript 코드의 평가보다 먼저, 새로운 빈 List로 초기화된다. GlobalSymbolRegistry List의 요소는 Table 58에 정의된 구조를 가진 Record이다.
The abstract operation ThisSymbolValue takes argument value (an ECMAScript language value) and returns either a normal completion containing a Symbol or a throw completion. It performs the following steps when called:
value가 Symbol이면, value를 반환한다.
value가 Object이고 value가 [[SymbolData]] 내부 슬롯을 가지면, 다음을 수행한다
이 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.
20.4.4 Symbol 인스턴스의 속성
Symbol 인스턴스는 Symbol 프로토타입 객체로부터 속성을 상속하는 ordinary object이다. Symbol 인스턴스는 [[SymbolData]] 내부 슬롯을 가진다. [[SymbolData]] 내부 슬롯은 이 Symbol 객체가 나타내는 Symbol 값이다.
20.4.5 Symbol을 위한 추상 연산
20.4.5.1 KeyForSymbol ( sym )
The abstract operation KeyForSymbol takes argument sym (a Symbol) and returns a String or undefined. sym이 GlobalSymbolRegistry List에 있으면, sym을 등록하는 데 사용된 String이 반환된다. It performs the following steps when called:
만약 msg가 undefined이면 msg를 빈 문자열로 설정; 그렇지 않으면 msg를 ? ToString(msg)로 설정하라.
만약 name이 빈 문자열이면 msg를 반환하라.
만약 msg가 빈 문자열이면 name을 반환하라.
name, 코드 유닛 0x003A (COLON), 코드 유닛 0x0020 (SPACE), 및 msg의 문자열 이어붙이기를 반환하라.
20.5.4 Error 인스턴스의 속성들
Error 인스턴스는 Error 프로토타입 객체로부터 속성을 상속하는 일반 객체이며 값이 undefined인 [[ErrorData]] 내부 슬롯을 가진다. [[ErrorData]]의 유일한 명시된 용도는 Object.prototype.toString 및 Error.isError에서 Error, AggregateError, 및 NativeError 인스턴스를 Error 객체로 식별하는 것이다.
20.5.5 이 표준에서 사용되는 네이티브 오류 유형들
런타임 오류가 감지되면 아래의 NativeError 객체들 중 하나 또는 AggregateError 객체의 새 인스턴스가 던져진다. 모든 NativeError 객체는 20.5.6에 설명된 동일한 구조를 공유한다.
20.5.5.1 EvalError
EvalError 생성자는 %EvalError%이다.
이 예외는 현재 이 명세 내에서 사용되지 않는다. 이 객체는 이전 판본과의 호환성을 위해 남아 있다.
20.5.5.2 RangeError
RangeError 생성자는 %RangeError%이다.
허용 가능한 값의 집합 또는 범위에 속하지 않는 값을 나타낸다.
20.5.5.3 ReferenceError
ReferenceError 생성자는 %ReferenceError%이다.
잘못된 참조가 감지되었음을 나타낸다.
20.5.5.4 SyntaxError
SyntaxError 생성자는 %SyntaxError%이다.
파싱 오류가 발생했음을 나타낸다.
20.5.5.5 TypeError
TypeError 생성자는 %TypeError%이다.
다른 NativeError 객체들이 실패 원인의 적절한 표시가 아닐 때 실패한 연산을 나타내는 데 사용된다.
20.5.5.6 URIError
URIError 생성자는 %URIError%이다.
전역 URI 처리 함수들 중 하나가 그 정의와 호환되지 않는 방식으로 사용되었음을 나타낸다.
20.5.6NativeError 객체 구조
각 객체는 아래에 설명된 구조를 가지며, 생성자 이름과 프로토타입 객체의 "name" 속성에 사용되는 이름만 다르다.
각 오류 객체에 대해 정의에서 NativeError에 대한 참조는 20.5.5에서 적절한 오류 객체 이름으로 대체되어야 한다.
20.5.6.1NativeError 생성자들
각 NativeError 생성자:
생성자가 아닌 함수로 호출될 때 새로운 NativeError 객체를 생성하고 초기화한다. 함수로 객체를 호출하는 것은 동일한 인수로 생성자로 호출하는 것과 동등하다. 따라서 함수 호출 NativeError(…)는 동일한 인수로 객체 생성 표현식 new NativeError(…)과 동등하다.
클래스 정의의 extends 절의 값으로 사용될 수 있다. 지정된 NativeError 동작을 상속하려는 서브클래스 생성자는 [[ErrorData]] 내부 슬롯을 가진 서브클래스 인스턴스를 생성하고 초기화하기 위해 NativeError 생성자에 대한 super 호출을 포함해야 한다.
20.5.6.1.1NativeError ( message [ , options ] )
각 NativeError 함수는 호출될 때 다음 단계를 수행한다:
만약 NewTarget이 undefined이면 newTarget을 활성 함수 객체로 하자; 그렇지 않으면 newTarget을 NewTarget으로 하자.
단계 2에서 전달되는 문자열의 실제 값은 정의되는 NativeError 생성자에 해당하여 "%EvalError.prototype%", "%RangeError.prototype%", "%ReferenceError.prototype%", "%SyntaxError.prototype%", "%TypeError.prototype%", 또는 "%URIError.prototype%" 중 하나이다.
주어진 NativeError 생성자의 프로토타입에 대한 "constructor" 속성의 초기 값은 그 생성자 자체이다.
20.5.6.3.2NativeError.prototype.message
주어진 NativeError 생성자의 프로토타입에 대한 "message" 속성의 초기 값은 빈 문자열이다.
20.5.6.3.3NativeError.prototype.name
주어진 NativeError 생성자의 프로토타입에 대한 "name" 속성의 초기 값은 생성자의 이름( NativeError 대신 사용되는 이름)으로 구성된 문자열 값이다.
20.5.6.4NativeError 인스턴스의 속성들
NativeError 인스턴스는 자신의 NativeError 프로토타입 객체로부터 속성을 상속하는 일반 객체이며 값이 undefined인 [[ErrorData]] 내부 슬롯을 가진다. [[ErrorData]]의 유일한 명시된 사용은 Object.prototype.toString 및 Error.isError에서 Error, AggregateError, 또는 NativeError 인스턴스를 식별하는 것이다.
생성자가 아닌 함수로 호출될 때 새로운 AggregateError 객체를 생성하고 초기화한다. 따라서 함수 호출 AggregateError(…)는 동일한 인수로 new AggregateError(…) 객체 생성 표현식과 동등하다.
클래스 정의의 extends 절의 값으로 사용될 수 있다. 지정된 AggregateError 동작을 상속하려는 서브클래스 생성자는 [[ErrorData]] 내부 슬롯을 가진 서브클래스 인스턴스를 생성하고 초기화하기 위해 AggregateError 생성자에 대한 super 호출을 포함해야 한다.
AggregateError.prototype.name의 초기 값은 "AggregateError"이다.
20.5.7.4 AggregateError 인스턴스의 속성들
AggregateError 인스턴스는 자신의 AggregateError 프로토타입 객체로부터 속성을 상속하는 일반 객체이며 값이 undefined인 [[ErrorData]] 내부 슬롯을 가진다. [[ErrorData]]의 유일한 명시된 사용은 Object.prototype.toString 및 Error.isError에서 Error, AggregateError, 또는 NativeError 인스턴스를 식별하는 것이다.
20.5.8 Error 객체들을 위한 추상 연산들
20.5.8.1 InstallErrorCause ( obj, options )
The abstract operation InstallErrorCause takes arguments obj (an Object) and options (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. 옵션 options에 "cause" 속성이 존재할 때 obj에 "cause" 속성을 생성하는 데 사용된다. It performs the following steps when called:
만약 options가 객체이고 ? HasProperty(options, "cause")가 true이면,
IEEE 754-2019의 정밀도 제한 때문에 반올림 동작이 필요하여, Number.MAX_SAFE_INTEGER보다 큰 모든 정수의 Number 값은 최소한 하나 이상의 다른 정수와 값을 공유한다. 따라서 그러한 큰 크기의 정수들은 안전하지 않음으로 간주되며, Number 값으로 정확히 표현되거나 서로 구별될 것이라고 보장되지 않는다. 예를 들어, 9007199254740992와 9007199254740993는 모두 Number 값 9007199254740992𝔽로 평가된다.
Number.MAX_SAFE_INTEGER의 값은 9007199254740991𝔽 (𝔽(253 - 1))이다.
IEEE 754-2019의 정밀도 제한 때문에 반올림 동작이 필요하여, Number.MIN_SAFE_INTEGER보다 작은 모든 정수의 Number 값은 최소한 하나 이상의 다른 정수와 값을 공유한다. 따라서 그러한 큰 크기의 정수들은 안전하지 않음으로 간주되며, Number 값으로 정확히 표현되거나 서로 구별될 것이라고 보장되지 않는다. 예를 들어, -9007199254740992와 -9007199254740993는 모두 Number 값 -9007199254740992𝔽로 평가된다.
Number.MIN_SAFE_INTEGER의 값은 -9007199254740991𝔽 (𝔽(-(253 - 1)))이다.
Number.MIN_VALUE의 값은 Number 타입의 가장 작은 양수 값이며, 대략 5 × 10-324이다.
IEEE 754-2019 배정밀도 이진 표현에서 가능한 가장 작은 값은 비정규화(denormalized) 수이다. 만약 구현체가 비정규화 값을 지원하지 않으면, Number.MIN_VALUE의 값은 구현체가 실제로 표현할 수 있는 가장 작은 0이 아닌 양수 값이어야 한다.
이 메서드는 유효 숫자 부분의 소수점 앞에 한 자리 그리고 유효숫자 소수점 뒤에 fractionDigits 자리를 갖는 10진 지수 표기법으로 표현된 이 Number 값을 포함하는 문자열을 반환한다. 만약 fractionDigits가 undefined이면, 필요한 만큼의 유효숫자 자릿수를 포함하여 Number를 고유하게 지정한다(이는 ToString과 유사하되, 이 경우 항상 지수 표기법으로 출력된다는 점이 다르다).
Let significand be the String value consisting of fractionCount + 1 occurrences of the code unit 0x0030 (DIGIT ZERO).
Let exponent be 0.
Else,
If fractionDigits is not undefined, then
Let exponent and intSignificand be integers such that 10fractionCount ≤ intSignificand < 10fractionCount + 1 and for which intSignificand × 10exponent - fractionCount - numberValue is as close to zero as possible. If there are two such sets of exponent and intSignificand, pick the exponent and intSignificand for which intSignificand × 10exponent - fractionCount is larger.
Else,
Let exponent, intSignificand, and ff be integers such that ff ≥ 0, 10ff ≤ intSignificand < 10ff + 1, 𝔽(intSignificand × 10exponent - ff) is 𝔽(numberValue), and ff is as small as possible. Note that the decimal representation of intSignificand has ff + 1 digits, intSignificand is not divisible by 10, and the least significant digit of intSignificand is not necessarily uniquely determined by these criteria.
Set fractionCount to ff.
Let significand be the String value consisting of the digits of the decimal representation of intSignificand (in order, with no leading zeroes).
If fractionCount ≠ 0, then
Let integerPart be the first code unit of significand.
Let fractionalPart be the other fractionCount code units of significand.
위 규칙보다 더 정확한 변환을 제공하는 구현체를 위해, 다음의 대체 버전의 단계 10.b.i를 지침으로 사용하는 것이 권장된다:
Let exponent, intSignificand, and ff be integers such that ff ≥ 0, 10ff ≤ intSignificand < 10ff + 1, 𝔽(intSignificand × 10exponent - ff) is 𝔽(numberValue), and ff is as small as possible. If there are multiple possibilities for intSignificand, choose intSignificand such that 𝔽(intSignificand × 10exponent - ff) is closest to 𝔽(numberValue). If there are two such possible values of intSignificand, choose the one that is even.
Let intValue be an integer for which intValue / 10fractionCount - numberValue is as close to zero as possible. If there are two such intValue, pick the larger intValue.
If intValue = 0, let digitString be "0"; else let digitString be the String value consisting of the digits of the decimal representation of intValue (in order, with no leading zeroes).
If fractionCount ≠ 0, then
Let digitCount be the length of digitString.
If digitCount ≤ fractionCount, then
Let zeroPad be the String value consisting of fractionCount + 1 - digitCount occurrences of the code unit 0x0030 (DIGIT ZERO).
이 메서드는 이 Number 값을 다음 중 하나로 표현한 문자열을 반환한다: 유효숫자 소수점 앞에 한 자리와 유효숫자 소수점 뒤에 precision - 1 자리를 갖는 10진 지수 표기법 또는 precision 유효숫자를 갖는 10진 고정 표기법. 만약 precision이 undefined이면 ToString을 대신 호출한다.
Let significand be the String value consisting of precisionCount occurrences of the code unit 0x0030 (DIGIT ZERO).
Let exponent be 0.
Else,
Let exponent and intSignificand be integers such that 10precisionCount - 1 ≤ intSignificand < 10precisionCount and for which intSignificand × 10exponent - precisionCount + 1 - numberValue is as close to zero as possible. If there are two such sets of exponent and intSignificand, pick the exponent and intSignificand for which intSignificand × 10exponent - precisionCount + 1 is larger.
Let significand be the String value consisting of the digits of the decimal representation of intSignificand (in order, with no leading zeroes).
If exponent < -6 or exponent ≥ precisionCount, then
Let exponentSign be the code unit 0x002D (HYPHEN-MINUS).
Set exponent to -exponent.
Let exponentDigits be the String value consisting of the digits of the decimal representation of exponent (in order, with no leading zeroes).
Return the string-concatenation of sign, significand, the code unit 0x0065 (LATIN SMALL LETTER E), exponentSign, and exponentDigits.
If exponent = precisionCount - 1, return the string-concatenation of sign and significand.
If exponent ≥ 0, then
Set significand to the string-concatenation of the first exponent + 1 code units of significand, the code unit 0x002E (FULL STOP), and the remaining precisionCount - (exponent + 1) code units of significand.
Else,
Set significand to the string-concatenation of the code unit 0x0030 (DIGIT ZERO), the code unit 0x002E (FULL STOP), -(exponent + 1) occurrences of the code unit 0x0030 (DIGIT ZERO), and the String significand.
The abstract operation ThisNumberValue takes argument value (an ECMAScript language value) and returns either a normal completion containing a Number or a throw completion. It performs the following steps when called:
The abstract operation NumberToBigInt takes argument number (a Number) and returns either a normal completion containing a BigInt or a throw completion. It performs the following steps when called:
If number is not an integral Number, throw a RangeError exception.
The abstract operation ThisBigIntValue takes argument value (an ECMAScript language value) and returns either a normal completion containing a BigInt or a throw completion. It performs the following steps when called:
acos, acosh, asin, asinh, atan, atanh, atan2, cbrt, cos, cosh, exp, expm1, hypot, log, log1p, log2, log10, pow, random, sin, sinh, tan, 그리고 tanh 함수들의 동작은 경계 사례에 해당하는 특정 인수 값들에 대해 특정 결과를 요구하는 것 외에는 여기서 정확히 명시되지 않는다. 다른 인수 값들에 대해서는 이러한 함수들은 익숙한 수학적 함수의 결과에 대한 근사값을 계산하도록 의도되어 있으나, 근사 알고리즘 선택에는 어느 정도의 여지가 허용된다. 일반적인 의도는 구현자가 해당 하드웨어 플랫폼에서 C 프로그래머가 사용할 수 있는 동일한 수학 라이브러리를 ECMAScript 용으로 사용할 수 있어야 한다는 것이다.
Return an implementation-approximated Number value representing the inverse hyperbolic tangent of ℝ(n).
21.3.2.8 Math.atan2 ( y, x )
이 함수는 인수 y와 x의 몫 y / x의 역탄젠트를 반환한다. 결과의 사분면은 y와 x의 부호를 사용하여 결정된다. 두 인수를 취하는 역탄젠트 함수에서 인수 이름이 전통적으로 y가 먼저이고 x가 두번째인 것이 의도적이며 전통적이다. 결과는 -π에서 +π까지의 포함 구간으로 라디안으로 표현된다.
Let n16 be the result of converting n to IEEE 754-2019 binary16 format using roundTiesToEven mode.
Let n64 be the result of converting n16 to IEEE 754-2019 binary64 format.
Return the ECMAScript Number value corresponding to n64.
Note
이 연산은 binary32로 캐스팅한 다음 binary16으로 캐스팅하는 것과 같지 않다(이중 반올림의 가능성 때문에): 예를 들어 k = 1.00048828125000022204𝔽에 대해 Math.f16round(k)는 1.0009765625𝔽이고, Math.f16round(Math.fround(k))는 1𝔽이다.
모든 플랫폼이 binary64에서 binary16으로의 네이티브 캐스팅을 제공하지는 않는다. 이를 제공할 수 있는 라이브러리들이 있으며, MIT 라이선스의 half 라이브러리가 그 예다. 또는 먼저 binary64를 roundTiesToEven 모드로 binary32로 캐스트한 다음, 결과가 잘못된 이중 반올림을 초래할 수 있는지 확인하고, 그런 경우에는 명시적으로 이들을 처리하여 올바른 결과가 나오도록 할 수 있다.
If number is neither +0𝔽 nor -0𝔽, set onlyZero to false.
If onlyZero is true, return +0𝔽.
Return an implementation-approximated Number value representing the square root of the sum of squares of the mathematical values of the elements of coerced.
이 함수의 "length" 속성은 2𝔽이다.
Note
구현체는 이 함수가 두 개 이상의 인수와 함께 호출될 때 발생하기 쉬운 오버플로우와 언더플로우로 인한 정밀도 손실을 피하기 위해 주의해야 한다.
Math.round(x)의 값이 항상 Math.floor(x + 0.5)의 값과 같은 것은 아니다. x가 -0𝔽이거나 x가 -0𝔽보다 작지만 -0.5𝔽 이상이면, Math.round(x)는 -0𝔽를 반환하지만, Math.floor(x + 0.5)는 +0𝔽를 반환한다. 또한 Math.round(x)는 x + 0.5를 계산할 때의 내부 rounding 때문에 Math.floor(x + 0.5)의 값과 다를 수 있다.
NOTE: This step is not expected to be reached in practice and is included only so that implementations may rely on inputs being "reasonably sized" without violating this specification.
Let error be ThrowCompletion(a newly created RangeError object).
If n is not finite or n is either +0𝔽 or -0𝔽, return n.
If n < 1𝔽 and n > +0𝔽, return +0𝔽.
If n < -0𝔽 and n > -1𝔽, return -0𝔽.
Return the integral Number nearest n in the direction of +0𝔽.
21.4 Date 객체
21.4.1 Date 객체 개요 및 추상 연산 정의
다음의 추상 연산들은 시간 값들( 21.4.1.1에 정의됨 )에 대해 동작한다. 모든 경우에, 이러한 함수들의 어떤 인수가 NaN이면 결과는 NaN이 된다는 점에 유의하라.
21.4.1.1 시간 값들과 시간 범위
ECMAScript에서 시간 측정은 POSIX의 시간 측정과 유사하며, 특히 윤년 규칙을 사용하는 보정된 필요(프로레프틱) 그레고리력, 에포크(epoch)로 UTC 1970년 1월 1일 자정의 정의, 그리고 하루를 정확히 86,400초(각각 1000밀리초)로 계산하는 것을 공유한다.
ECMAScript에서 시간 값(time value)은 Number이다. 이는 밀리초 정밀도의 순간을 나타내는 유한한 정수 Number이거나 특정 순간을 나타내지 않는 NaN이다. 만약 시간 값이 24 × 60 × 60 × 1000 = 86,400,000의 배수(즉 86,400,000 × d 꼴의 정수d)이면, 이는 에포크 이후 정수d일의 시작에 해당하는 UTC 날짜의 순간을 나타낸다(음수 d의 경우 에포크보다 이전). 그 외의 모든 유한 시간 값 t는 그러한 배수인 가장 큰 이전의 시간 값 s에 대해 정의되며, 같은 UTC 날에 속하고 s 다음으로 (t - s) 밀리초만큼 뒤에 발생하는 순간을 나타낸다.
시간 값들은 UTC 윤초(leap seconds)를 고려하지 않는다—양의 윤초 안에 있는 순간을 나타내는 시간 값은 없고, 음의 윤초로 인해 UTC 타임라인에서 제거된 순간을 나타내는 시간 값은 존재할 수 있다. 하지만 시간 값의 정의는 윤초 경계에서만 불연속성을 갖고 윤초 밖에서는 차이가 0이므로 UTC와 부분적으로 정렬되는 결과를 낳는다.
Number는 -9,007,199,254,740,992에서 9,007,199,254,740,992까지의 정수를 정확히 표현할 수 있다(21.1.2.8 및 21.1.2.6). 시간 값은 약간 더 작은 범위인 밀리초 단위로 -8,640,000,000,000,000에서 8,640,000,000,000,000까지를 지원한다. 이는 에포크를 기준으로 정확히 -100,000,000일에서 100,000,000일까지의 지원 시간 값 범위를 제공한다.
1970년 1월 1일 자정의 정확한 순간은 시간 값 +0𝔽으로 표현된다.
Note
프로레프틱 그레고리력에서 윤년은 정확히 4로 나누어떨어지고 또한 400으로 나누어떨어지거나 100으로 나누어떨어지지 않는 해들이다.
400년 주기에는 97개의 윤년이 있다. 이는 연평균 365.2425일, 즉 31,556,952,000밀리초를 낳는다. 따라서 Number가 밀리초 정밀도로 정확히 표현할 수 있는 최대 범위는 대략 1970년을 기준으로 -285,426년에서 285,426년이다. 이 절에서 지정한 시간 값의 더 작은 범위는 약 1970년을 기준으로 -273,790년에서 273,790년이다.
The abstract operation Day takes argument t (a finite time value) and returns an integral Number. 이는 t가 속하는 날의 일 번호를 반환한다. It performs the following steps when called:
The abstract operation TimeWithinDay takes argument t (a finite time value) and returns an integral Number in the interval from +0𝔽 (inclusive) to msPerDay (exclusive). 이는 t가 속하는 날의 시작 이후 경과한 밀리초 수를 반환한다. It performs the following steps when called:
The abstract operation DaysInYear takes argument y (an integral Number) and returns 365𝔽 or 366𝔽. 이는 연도 y의 일 수를 반환한다. 윤년은 366일이고, 그 외의 해는 365일이다. It performs the following steps when called:
The abstract operation DayFromYear takes argument y (an integral Number) and returns an integral Number. 이는 연도 y의 첫날의 일 번호를 반환한다. It performs the following steps when called:
NOTE: In the following steps, numYears1, numYears4, numYears100, and numYears400 represent the number of years divisible by 1, 4, 100, and 400, respectively, that occur between the epoch and the start of year y. The number is negative if y is before the epoch.
The abstract operation TimeFromYear takes argument y (an integral Number) and returns a time value. 이는 연도 y의 시작 시각의 시간 값을 반환한다. It performs the following steps when called:
The abstract operation YearFromTime takes argument t (a finite time value) and returns an integral Number. 이는 t가 속하는 연도를 반환한다. It performs the following steps when called:
Return the largest integral Number y (closest to +∞) such that TimeFromYear(y) ≤ t.
21.4.1.9 DayWithinYear ( t )
The abstract operation DayWithinYear takes argument t (a finite time value) and returns an integral Number in the inclusive interval from +0𝔽 to 365𝔽. It performs the following steps when called:
The abstract operation InLeapYear takes argument t (a finite time value) and returns +0𝔽 or 1𝔽. 이는 t가 윤년 내에 있으면 1𝔽을, 그렇지 않으면 +0𝔽을 반환한다. It performs the following steps when called:
The abstract operation MonthFromTime takes argument t (a finite time value) and returns an integral Number in the inclusive interval from +0𝔽 to 11𝔽. 이는 t가 속하는 달을 식별하는 Number를 반환한다. 달 값 +0𝔽는 1월, 1𝔽는 2월, ..., 11𝔽는 12월을 지정한다. 참고로 MonthFromTime(+0𝔽) = +0𝔽는 1970년 1월 1일 목요일에 해당한다. It performs the following steps when called:
The abstract operation DateFromTime takes argument t (a finite time value) and returns an integral Number in the inclusive interval from 1𝔽 to 31𝔽. 이는 t가 속하는 달의 날짜(일)를 반환한다. It performs the following steps when called:
The abstract operation WeekDay takes argument t (a finite time value) and returns an integral Number in the inclusive interval from +0𝔽 to 6𝔽. 이는 t가 속하는 요일을 식별하는 Number를 반환한다. 요일 값 +0𝔽는 일요일, 1𝔽는 월요일, ..., 6𝔽는 토요일을 지정한다. 참고로 WeekDay(+0𝔽) = 4𝔽는 1970년 1월 1일 목요일에 해당한다. It performs the following steps when called:
The abstract operation HourFromTime takes argument t (a finite time value) and returns an integral Number in the inclusive interval from +0𝔽 to 23𝔽. 이는 t가 속하는 시간(시)을 반환한다. It performs the following steps when called:
The abstract operation MinFromTime takes argument t (a finite time value) and returns an integral Number in the inclusive interval from +0𝔽 to 59𝔽. 이는 t가 속하는 분(minutes)을 반환한다. It performs the following steps when called:
The abstract operation SecFromTime takes argument t (a finite time value) and returns an integral Number in the inclusive interval from +0𝔽 to 59𝔽. 이는 t가 속하는 초(seconds)를 반환한다. It performs the following steps when called:
The abstract operation msFromTime takes argument t (a finite time value) and returns an integral Number in the inclusive interval from +0𝔽 to 999𝔽. 이는 t가 속하는 초의 밀리초 부분을 반환한다. It performs the following steps when called:
The abstract operation GetUTCEpochNanoseconds takes arguments year (an integer), month (an integer in the inclusive interval from 1 to 12), day (an integer in the inclusive interval from 1 to 31), hour (an integer in the inclusive interval from 0 to 23), minute (an integer in the inclusive interval from 0 to 59), second (an integer in the inclusive interval from 0 to 59), millisecond (an integer in the inclusive interval from 0 to 999), microsecond (an integer in the inclusive interval from 0 to 999), and nanosecond (an integer in the inclusive interval from 0 to 999) and returns a BigInt. 반환 값은 주어진 ISO 8601 달력 날짜와 UTC의 벽 시계(wall-clock) 시각에 대응하는 에포크 이후의 나노초 수를 나타내는 BigInt이다. It performs the following steps when called:
Let date be MakeDay(𝔽(year), 𝔽(month - 1), 𝔽(day)).
Let time be MakeTime(𝔽(hour), 𝔽(minute), 𝔽(second), 𝔽(millisecond)).
ECMAScript에서 표준시(time zones)는 0x0000에서 0x007F 범위의 코드 유닛들로만 구성된 문자열인 타임존 식별자로 표현된다.
구현체가 지원하는 타임존은 사용 가능한 명명된 타임존(available named time zones) 또는 오프셋 타임존(offset time zones)일 수 있다. 오프셋 타임존은 IsTimeZoneOffsetString이 참을 반환하는 문자열로 표현된다.
주요(Primary) 타임존 식별자는 사용 가능한 명명된 타임존에 대한 선호 식별자이다.
비주요(Non-primary) 타임존 식별자는 주요 식별자가 아닌 사용 가능한 명명된 타임존의 식별자이다.
사용 가능한 명명된 타임존 식별자은 주요 식별자 또는 비주요 식별자이다.
각각의 사용 가능한 명명된 타임존 식별자는 정확히 하나의 사용 가능한 명명된 타임존과 연관된다.
각각의 사용 가능한 명명된 타임존은 정확히 하나의 주요 타임존 식별자와 0개 이상의 비주요 타임존 식별자와 연관된다.
ECMAScript 구현체는 식별자 "UTC"인 사용 가능한 명명된 타임존을 반드시 지원해야 하며, 이는 UTC 타임존의 주요 타임존 식별자여야 한다.
추가로, 구현체는 다른 많은 사용 가능한 명명된 타임존을 지원할 수 있다.
ECMA-402 국제화 API 요구사항을 따르는 구현체는 타임존 인식(time zone aware)이라고 불린다.
타임존 인식 구현체는 IANA 타임존 데이터베이스의 Zone 및 Link 이름에 해당하는 사용 가능한 명명된 타임존들을 지원해야 하며, 그 외의 이름을 지원해서는 안 된다.
타임존 인식 구현체에서 주요 타임존 식별자는 IANA Time Zone Database의 Zone 이름이고, 비주요 식별자는 Link 이름이다(ECMA-402 명세에서 AvailableNamedTimeZoneIdentifiers로 구체적으로 재정의되지 않는 한).
전체 IANA 타임존 데이터베이스를 지원하지 않는 구현체라도 IANA 이름을 식별자로 사용하는 것이 권장된다.
The implementation-defined abstract operation GetNamedTimeZoneEpochNanoseconds takes arguments timeZoneIdentifier (a String), year (an integer), month (an integer in the inclusive interval from 1 to 12), day (an integer in the inclusive interval from 1 to 31), hour (an integer in the inclusive interval from 0 to 23), minute (an integer in the inclusive interval from 0 to 59), second (an integer in the inclusive interval from 0 to 59), millisecond (an integer in the inclusive interval from 0 to 999), microsecond (an integer in the inclusive interval from 0 to 999), and nanosecond (an integer in the inclusive interval from 0 to 999) and returns a List of BigInts.
반환되는 리스트의 각 값은 주어진 ISO 8601 달력 날짜와 명명된 타임존 timeZoneIdentifier에 해당하는 벽 시계 시각에 대응하는 에포크 이후의 나노초 수를 나타낸다.
입력이 음의 타임존 전환(예: 서머타임 종료로 시간이 반복되거나 타임존 규칙 변경으로 오프셋이 감소하는 경우)으로 인해 두 번 발생하는 지역 시간일 때, 반환 리스트는 두 개 이상의 요소를 가지며 오름차순으로 정렬된다.
입력이 양의 타임존 전환(예: 서머타임 시작으로 시간이 건너뛰어지거나 타임존 규칙 변경으로 오프셋이 증가하는 경우)으로 인해 건너뛰어진 지역 시간이라면, 반환 리스트는 비어있다.
그렇지 않으면 반환 리스트는 한 요소를 가진다.
GetNamedTimeZoneEpochNanoseconds의 기본 구현(로컬 정치적 규칙을 포함하지 않는 ECMAScript 구현체가 사용할)은 호출될 때 다음 단계를 수행한다:
예: 2017년 11월 5일 1:30 AM America/New_York는 두 번 반복되므로 GetNamedTimeZoneEpochNanoseconds("America/New_York", 2017, 11, 5, 1, 30, 0, 0, 0, 0)는 길이 2의 리스트를 반환하며, 첫 번째 요소는 05:30 UTC(UTC 오프셋 -04:00에 해당하는 01:30 미국 동부 일광 절약 시간)를, 두 번째 요소는 06:30 UTC(01:30 미국 동부 표준시, 오프셋 -05:00)를 나타낸다.
2017년 3월 12일 2:30 AM America/New_York은 존재하지 않으므로 GetNamedTimeZoneEpochNanoseconds("America/New_York", 2017, 3, 12, 2, 30, 0, 0, 0, 0)는 빈 리스트를 반환한다.
The implementation-defined abstract operation GetNamedTimeZoneOffsetNanoseconds takes arguments timeZoneIdentifier (a String) and epochNanoseconds (a BigInt) and returns an integer.
반환된 정수는 지정된 명명된 타임존 timeZoneIdentifier에 대해, 에포크로부터의 epochNanoseconds에 대응하는 순간에서의 UTC로부터의 오프셋을 나노초 단위로 나타낸다.
로컬 정치적 규칙을 포함하지 않는 구현체에서 사용할 GetNamedTimeZoneOffsetNanoseconds의 기본 구현은 호출될 때 다음 단계를 수행한다:
만약 [[Identifier]]가 주요 타임존 식별자이면, [[Identifier]]는 [[PrimaryIdentifier]]와 동일하다.
21.4.1.23 AvailableNamedTimeZoneIdentifiers ( )
The implementation-defined abstract operation AvailableNamedTimeZoneIdentifiers takes no arguments and returns a List of Time Zone Identifier Records.
반환 결과는 이 구현체에서 사용 가능한 모든 명명된 타임존 식별자들과 각 사용 가능한 식별자에 대응하는 주요 타임존 식별자를 설명한다. 리스트는 각 타임존 레코드의 [[Identifier]] 필드에 따라 정렬된다.
ECMA-402 국제화 API를 구현하는 타임존 인식 구현체는 AvailableNamedTimeZoneIdentifiers 추상 연산을 ECMA-402 명세에 지정된 대로 구현해야 한다.
타임존 인식이 아닌 구현체에 대해서는 AvailableNamedTimeZoneIdentifiers는 호출될 때 다음 단계를 수행한다:
If the implementation does not include local political rules for any time zones, then
Return « the Time Zone Identifier Record { [[Identifier]]: "UTC", [[PrimaryIdentifier]]: "UTC" } ».
NOTE: An implementation may need to resolve identifier iteratively to obtain the primary time zone identifier.
Let record be the Time Zone Identifier Record { [[Identifier]]: identifier, [[PrimaryIdentifier]]: primary }.
Append record to result.
Assert: result contains a Time Zone Identifier Recordr such that r.[[Identifier]] is "UTC" and r.[[PrimaryIdentifier]] is "UTC".
Return result.
21.4.1.24 SystemTimeZoneIdentifier ( )
The implementation-defined abstract operation SystemTimeZoneIdentifier takes no arguments and returns a String.
이는 호스트 환경의 현재 타임존을 나타내는 문자열을 반환한다. 그 문자열은 IsTimeZoneOffsetString이 참을 반환하는 UTC 오프셋을 나타내는 문자열이거나 주요 타임존 식별자 중 하나이다.
It performs the following steps when called:
If the implementation only supports the UTC time zone, return "UTC".
Let systemTimeZoneString be the String representing the host environment's current time zone, either a primary time zone identifier or an offset time zone identifier.
예: 호스트 환경이 사용자가 US 동부 시간을 선택한 시스템 상의 브라우저라면, SystemTimeZoneIdentifier는 "America/New_York"을 반환한다.
21.4.1.25 LocalTime ( t )
The abstract operation LocalTime takes argument t (a finite time value) and returns an integral Number.
이는 t를 UTC에서 로컬 시간으로 변환한다.
결과를 결정하기 위해 해당 시각에 적용되는 표준시 및 서머타임에 대한 로컬 정치적 규칙을 사용해야 한다.
It performs the following steps when called:
이 절에서 요구되는 바와 같이 구현체는 IANA Time Zone Database의 시간대 정보를 사용하는 것이 요구되며(권장), 이를 통해 로컬 정치적 규칙을 반영해야 한다.
Note 3
음의 타임존 전환(예: 서머타임 종료)에서는 두 다른 입력 시간 값 tUTC들이 같은 로컬 시간 tlocal으로 변환될 수 있다(즉 반복되는 시간이 보인다).
LocalTime(UTC(tlocal))는 항상 tlocal과 같지 않을 수 있다. 마찬가지로 UTC(LocalTime(tUTC))는 항상 tUTC과 같지 않을 수 있다.
21.4.1.26 UTC ( t )
The abstract operation UTC takes argument t (a Number) and returns a time value.
이는 t를 로컬 시간에서 UTC 시간 값으로 변환한다.
결과를 결정하기 위해 해당 시각에 적용되는 표준시 및 서머타임에 대한 로컬 정치적 규칙을 사용해야 한다.
It performs the following steps when called:
NOTE: The following steps ensure that when t represents local time repeating multiple times at a negative time zone transition (e.g. when the daylight saving time ends or the time zone adjustment is decreased due to a time zone rule change) or skipped local time at a positive time zone transition (e.g. when the daylight saving time starts or the time zone offset is increased due to a time zone rule change), t is interpreted using the time zone offset before the transition.
If possibleInstants is not empty, then
Let disambiguatedInstant be possibleInstants[0].
Else,
NOTE: t represents a local time skipped at a positive time zone transition (e.g. due to daylight saving time starting or a time zone rule change increasing the UTC offset).
입력 t는 명목상 시간 값이지만 어떤 Number 값도 될 수 있다.
알고리즘은 시간 값 범위로 t를 제한해서는 안 되며, 이는 지역 UTC 오프셋과 관계없이 시간 값 범위의 경계에 해당하는 입력을 지원하기 위함이다.
예를 들어, 최대 시간 값은 8.64 × 1015로 "+275760-09-13T00:00:00Z"에 해당한다.
지역 시간대 오프셋이 그 순간 UTC보다 1시간 앞선 환경에서는, 이는 더 큰 입력 8.64 × 1015 + 3.6 × 106로 표현되며 "+275760-09-13T01:00:00+01:00"에 해당한다.
타임존 인식 구현체(및 권장되는 다른 구현체들)는 IANA Time Zone Database의 시간대 정보를 사용하는 것이 요구된다.
2017년 11월 5일 1:30 AM America/New_York는 두 번 반복되지만(시계 되돌림), 그것은 1:30 AM UTC-04로 해석되어야 한다(UTC-05가 아니라).
UTC(TimeClip(MakeDate(MakeDay(2017, 10, 5), MakeTime(1, 30, 0, 0)))), 여기서 offsetMs는 -4 × msPerHour이다.
2017년 3월 12일 2:30 AM America/New_York은 존재하지 않지만, 그것은 2:30 AM UTC-05(즉 3:30 AM UTC-04와 동등)로 해석되어야 한다.
UTC(TimeClip(MakeDate(MakeDay(2017, 2, 12), MakeTime(2, 30, 0, 0)))), 여기서 offsetMs는 -5 × msPerHour이다.
Note 2
UTC(LocalTime(tUTC))는 항상 tUTC와 같지 않을 수 있다. 마찬가지로 LocalTime(UTC(tlocal))는 항상 tlocal와 같지 않을 수 있다.
21.4.1.27 MakeTime ( hour, min, sec, ms )
The abstract operation MakeTime takes arguments hour (a Number), min (a Number), sec (a Number), and ms (a Number) and returns a Number. 이는 밀리초 수를 계산한다. It performs the following steps when called:
If hour is not finite, min is not finite, sec is not finite, or ms is not finite, return NaN.
MakeTime의 산술은 부동소수점 산술이며 결합법칙이 성립하지 않으므로 연산은 올바른 순서로 수행되어야 한다.
21.4.1.28 MakeDay ( year, month, date )
The abstract operation MakeDay takes arguments year (a Number), month (a Number), and date (a Number) and returns a finite Number or NaN. 이는 일수(days)를 계산한다. It performs the following steps when called:
If year is not finite, month is not finite, or date is not finite, return NaN.
Find a finite time value t such that YearFromTime(t) is ym, MonthFromTime(t) is mn, and DateFromTime(t) is 1𝔽; but if this is not possible (because some argument is out of range), return NaN.
The abstract operation MakeDate takes arguments day (a Number) and time (a Number) and returns a finite Number or NaN. 이는 밀리초 수를 계산한다. It performs the following steps when called:
If day is not finite or time is not finite, return NaN.
The abstract operation MakeFullYear takes argument year (a Number) and returns an integral Number or NaN. 이는 year의 정수 부분과 연관된 완전 연도(full year)를 반환한다. 0에서 99 사이의 값은 1900년 시작 이후의 연도로 해석된다. 프로레프틱 그레고리력과 정렬을 위해 "full year"는 연도 0(기원전 1년) 시작 이후의 전체 연도 수로 정의된다. It performs the following steps when called:
ECMAScript는 ISO 8601 달력 날짜 확장 형식의 단순화에 기반한 날짜-시간 문자열 교환 포맷을 정의한다. 형식은 다음과 같다: YYYY-MM-DDTHH:mm:ss.sssZ
요소들은 다음과 같다:
YYYY
프로레프틱 그레고리력에서 연도를 네 자리 십진수로 0000에서 9999까지 표현하거나, 확장 연도로서 부호(+) 또는 (-)와 여섯 자리 십진수를 사용하는 형태일 수 있다.
-
문자열 내에 문자 "-" (하이픈)이 두 번 문자 그대로 나타난다.
MM
연도의 월을 01(1월)에서 12(12월)까지 두 자리 십진수로 나타낸다.
DD
월의 일을 01에서 31까지 두 자리 십진수로 나타낸다.
T
시간 요소의 시작을 나타내기 위해 문자열에 "T"가 문자 그대로 나타난다.
HH
자정 이후 지난 완전한 시간 수를 00에서 24까지 두 자리 십진수로 나타낸다.
:
문자열 내에 문자 ":" (콜론)이 두 번 문자 그대로 나타난다.
mm
시간의 시작 이후의 완전한 분 수를 00에서 59까지 두 자리 십진수로 나타낸다.
ss
분의 시작 이후의 완전한 초 수를 00에서 59까지 두 자리 십진수로 나타낸다.
.
문자열 내에 문자 "." (점)이 문자 그대로 나타난다.
sss
초의 시작 이후의 완전한 밀리초 수를 세 자리 십진수로 나타낸다.
Z
UTC 오프셋 표현으로 "Z" (오프셋 없는 UTC) 또는 "+" 또는 "-" 뒤에 시간 표현 HH:mm이 오는 형태로 지정된다(이는 로컬 시간이 UTC보다 앞서거나 뒤처짐을 나타내는 ISO 8601 타임존 오프셋 문자열 형식의 부분집합이다).
이 형식은 날짜 전용 형태도 포함한다:
YYYY
YYYY-MM
YYYY-MM-DD
또한 위의 날짜 전용 형태 중 하나에 선택적 UTC 오프셋 표현이 추가된 다음 시간 형태들 중 하나를 바로 이어붙인 “date-time” 형태들도 포함한다:
THH:mm
THH:mm:ss
THH:mm:ss.sss
범위를 벗어나거나 형식에 맞지 않는 요소가 포함된 문자열은 이 형식의 유효한 인스턴스가 아니다.
Note 1
모든 날은 자정에서 시작하고 끝나므로 00:00과 24:00 두 표기법을 사용하여 하나 날짜와 연관된 두 자정을 구별할 수 있다. 이는 다음 두 표기가 정확히 동일한 시간을 가리킨다는 것을 의미한다: 1995-02-04T24:00와 1995-02-05T00:00. 후자의 형태를 "날의 끝"으로 해석하는 것은 ISO 8601과 일치한다(ISO 8601은 시간 간격을 기술할 때 이를 예약하고 단일 시점을 표현할 때는 허용하지 않음에도 불구하고).
Note 2
CET, EST 등과 같은 민간 약어에 대한 국제 표준은 존재하지 않으며, 같은 약어가 서로 다른 타임존에 대해 사용되기도 한다. 이 이유로 ISO 8601과 이 형식은 모두 숫자 기반의 타임존 오프셋 표현을 지정한다.
21.4.1.32.1 확장 연도
시간 값 범위인 약 ±273,790년을 완전히 다루려면 9999년 이전 또는 이후의 연도를 표현해야 한다. ISO 8601은 연도 표기의 확장을 허용하지만 교환 당사자 간 합의에 의해서만 허용한다. 단순화된 ECMAScript 형식에서 그러한 확장 연도 표기는 6자리여야 하며 항상 + 또는 - 기호로 접두된다. 연도 0은 양수로 간주되어 반드시 + 기호로 접두되어야 한다. 연도 0을 -000000으로 표기하는 것은 유효하지 않다. 확장 연도를 사용한 Date Time String Format에 맞는 문자열이 시간 값 범위를 벗어나는 순간을 나타내면 Date.parse는 인식 불가능한 것으로 취급하고 구현체 특정 동작이나 휴리스틱에 의존하지 않고 NaN을 반환한다.
Note
확장 연도를 포함한 날짜-시간 값의 예:
-271821-04-20T00:00:00Z
기원전 271822년
-000001-01-01T00:00:00Z
기원전 2년
+000000-01-01T00:00:00Z
기원전 1년
+000001-01-01T00:00:00Z
서기 1년
+001970-01-01T00:00:00Z
서기 1970년
+002009-12-15T00:00:00Z
서기 2009년
+275760-09-13T00:00:00Z
서기 275760년
21.4.1.33 타임존 오프셋 문자열 형식
ECMAScript는 ISO 8601에서 파생된 UTC 오프셋을 위한 문자열 교환 형식을 정의한다.
형식은 다음 문법으로 설명된다.
The abstract operation IsTimeZoneOffsetString takes argument offsetString (a String) and returns a Boolean. 반환값은 offsetString이 UTCOffset 문법에 부합하는지 여부를 나타낸다. It performs the following steps when called:
The abstract operation ParseTimeZoneOffsetString takes argument offsetString (a String) and returns an integer. 반환값은 문자열 offsetString에 해당하는 UTC 오프셋을 나노초 단위의 정수로 나타낸 것이다. It performs the following steps when called:
이 함수는 인자에 ToString 연산자를 적용한다. ToString이 abrupt completion으로 끝나면 그 Completion Record가 즉시 반환된다. 그렇지 않으면 이 함수는 결과 String을 날짜와 시간으로 해석한다; 이 함수는 해당 날짜와 시간에 대응하는 UTC 시간 값인 Number를 반환한다. String은 그 내용에 따라 로컬 시간, UTC 시간, 또는 어떤 다른 시간대의 시간으로 해석될 수 있다. 이 함수는 먼저 확장 연도를 포함하여 Date Time String Format(21.4.1.32)에 설명된 형식에 따라 String을 파싱하려고 시도한다. String이 그 형식에 부합하지 않으면, 함수는 구현별 휴리스틱 또는 구현별 날짜 형식으로 대체할 수 있다. 인식할 수 없거나 범위를 벗어난 형식 요소 값을 포함하는 String은 이 함수가 NaN을 반환하게 해야 한다.
String이 Date Time String Format에 부합하면, 부재한 형식 요소를 대체 값이 대신한다. MM 또는 DD 요소가 부재하면 "01"이 사용된다. HH, mm, 또는 ss 요소가 부재하면 "00"이 사용된다. sss 요소가 부재하면 "000"이 사용된다. UTC 오프셋 표현이 부재하면, 날짜 전용 형식은 UTC 시간으로 해석되고 날짜-시간 형식은 로컬 시간으로 해석된다.
x가 ECMAScript의 특정 구현에서 밀리초 양이 0인 Date이면, 참조된 모든 속성이 초기값을 가진 경우, 다음 표현식들은 모두 그 구현에서 같은 숫자 값을 생성해야 한다:
은 앞의 세 표현식과 같은 Number 값을 생성할 필요가 없으며, 일반적으로 Date Time String Format(21.4.1.32)에 부합하지 않고 그 구현에서 toString 또는 toUTCString 메서드로 생성될 수 없는 임의의 String 값이 주어졌을 때 이 함수가 생성하는 값은 구현 정의이다.
min이 존재하지 않으면, 이 메서드는 min이 getMinutes() 값을 가지고 존재하는 것처럼 동작한다. sec이 존재하지 않으면, sec이 getSeconds() 값을 가지고 존재하는 것처럼 동작한다. ms가 존재하지 않으면, ms가 getMilliseconds() 값을 가지고 존재하는 것처럼 동작한다.
min이 존재하지 않으면, 이 메서드는 min이 getUTCMinutes() 값을 가지고 존재하는 것처럼 동작한다. sec이 존재하지 않으면, sec이 getUTCSeconds() 값을 가지고 존재하는 것처럼 동작한다. ms가 존재하지 않으면, ms가 getUTCMilliseconds() 값을 가지고 존재하는 것처럼 동작한다.
21.4.4.31 Date.prototype.setUTCMilliseconds ( ms )
weekday, ",", 코드 단위 0x0020 (SPACE), day, 코드 단위 0x0020 (SPACE), month, 코드 단위 0x0020 (SPACE), yearSign, paddedYear, 코드 단위 0x0020 (SPACE), 및 TimeString(tv)의 문자열 연결을 반환한다.
21.4.4.45 Date.prototype [ %Symbol.toPrimitive% ] ( hint )
이 메서드는 ECMAScript 언어 연산자가 Date를 원시 값으로 변환하기 위해 호출한다. hint에 허용되는 값은 "default", "number", 및 "string"이다. Date는 내장 ECMAScript 객체들 중에서 "default"를 "string"과 동등한 것으로 취급한다는 점에서 고유하다. 다른 모든 내장 ECMAScript 객체들은 "default"를 "number"와 동등한 것으로 취급한다.
String str 안의 인덱스 position에 있는 코드 단위의 수치 값에 대한 Number 값을 반환한다.
Note 2
이 메서드는 의도적으로 제네릭이다; 이 메서드는 자신의 this 값이 String 객체일 것을 요구하지 않는다. 따라서 메서드로 사용하기 위해 다른 종류의 객체로 이전될 수 있다.
22.1.3.4 String.prototype.codePointAt ( pos )
Note 1
이 메서드는 이 객체를 String으로 변환한 결과인 String 안의 인덱스 pos에 있는 문자열 요소에서 시작하는 UTF-16으로 인코딩된 코드 포인트(6.1.4)의 수치 값인 0x10FFFF𝔽 이하의 음이 아닌 정수 Number를 반환한다. 그 인덱스에 요소가 없으면 결과는 undefined이다. 유효한 UTF-16 서로게이트 쌍이 pos에서 시작하지 않으면, 결과는 pos에 있는 코드 단위이다.
searchString이 이 객체를 String으로 변환한 결과의 부분 문자열로서, position 이상인 하나 이상의 인덱스에 나타나면, 이 함수는 true를 반환한다; 그렇지 않으면 false를 반환한다. position이 undefined이면, 전체 String을 검색하기 위해 0이 가정된다.
Note 2
첫 번째 인자가 RegExp이면 예외를 던지도록 지정된 것은 그러한 인자 값을 허용하는 확장을 미래 판에서 정의할 수 있게 하기 위한 것이다.
Note 3
이 메서드는 의도적으로 제네릭이다; 이 메서드는 자신의 this 값이 String 객체일 것을 요구하지 않는다. 따라서 메서드로 사용하기 위해 다른 종류의 객체로 이전될 수 있다.
22.1.3.9 String.prototype.indexOf ( searchString [ , position ] )
Note 1
searchString이 이 객체를 String으로 변환한 결과의 부분 문자열로서, position 이상인 하나 이상의 인덱스에 나타나면, 그러한 가장 작은 인덱스가 반환된다; 그렇지 않으면 -1𝔽이 반환된다. position이 undefined이면, 전체 String을 검색하기 위해 +0𝔽이 가정된다.
22.1.3.11 String.prototype.lastIndexOf ( searchString [ , position ] )
Note 1
searchString이 이 객체를 String으로 변환한 결과의 부분 문자열로서, position 이하인 하나 이상의 인덱스에 나타나면, 그러한 가장 큰 인덱스가 반환된다; 그렇지 않으면 -1𝔽이 반환된다. position이 undefined이면, 전체 String을 검색하기 위해 String 값의 길이가 가정된다.
ECMA-402 국제화 API를 포함하는 ECMAScript 구현은 ECMA-402 명세에 지정된 대로 이 메서드를 구현해야 한다. ECMAScript 구현이 ECMA-402 API를 포함하지 않는 경우 이 메서드에 대한 다음 명세가 사용된다:
이 메서드는 this 값(String str로 변환됨)과 that(String thatValue로 변환됨)의 구현 정의 로캘 민감 String 비교 결과를 나타내는 NaN이 아닌 Number를 반환한다. 결과는 호스트 환경의 현재 로캘 관례에 따른 String 값의 정렬 순서에 대응하도록 의도되어 있으며, str이 thatValue보다 앞에 정렬되면 음수, str이 thatValue보다 뒤에 정렬되면 양수, 그 밖의 모든 경우에는 0(str과 thatValue 사이에 상대적 순서가 없음을 나타냄)이 된다.
이 메서드의 선택적 두 번째 및 세 번째 매개변수의 의미는 ECMA-402 명세에 정의되어 있다; ECMA-402 지원을 포함하지 않는 구현은 그 매개변수 위치에 다른 어떤 해석도 부여해서는 안 된다.
실제 반환 값은 추가 정보를 인코딩할 수 있도록 구현 정의이지만, 두 인자의 메서드로 간주될 때 이 메서드는 모든 String의 집합에 대한 전순서를 정의하는 일관된 비교자여야 한다. 이 메서드는 또한 Unicode Standard에 따른 정준 동등성을 인식하고 존중해야 하며, 구별 가능한 String들이 정준적으로 동등할 때 +0𝔽을 반환하는 것도 포함한다.
Note 1
후자는 두 인자의 함수를 요구하므로, 이 메서드 자체는 Array.prototype.sort에 대한 인자로 직접 적합하지 않다.
Note 2
이 메서드는 ECMAScript 환경이 호스트 환경으로부터 이용할 수 있는 어떤 언어 및/또는 로캘 민감 비교 기능에 의존할 수 있으며, 호스트 환경의 현재 로캘 관례에 따라 비교하도록 의도되어 있다. 그러나 비교 기능과 관계없이, 이 메서드는 Unicode Standard에 따른 정준 동등성을 인식하고 존중해야 한다. 예를 들어, 다음 비교들은 모두 +0𝔽을 반환해야 한다:
// Å ANGSTROM SIGN vs.// Å LATIN CAPITAL LETTER A + COMBINING RING ABOVE"\u212B".localeCompare("A\u030A")
// Ω OHM SIGN vs.// Ω GREEK CAPITAL LETTER OMEGA"\u2126".localeCompare("\u03A9")
// ṩ LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE vs.// ṩ LATIN SMALL LETTER S + COMBINING DOT ABOVE + COMBINING DOT BELOW"\u1E69".localeCompare("s\u0307\u0323")
// ḍ̇ LATIN SMALL LETTER D WITH DOT ABOVE + COMBINING DOT BELOW vs.// ḍ̇ LATIN SMALL LETTER D WITH DOT BELOW + COMBINING DOT ABOVE"\u1E0B\u0323".localeCompare("\u1E0D\u0307")
// 가 HANGUL CHOSEONG KIYEOK + HANGUL JUNGSEONG A vs.// 가 HANGUL SYLLABLE GA"\u1100\u1161".localeCompare("\uAC00")
이 메서드는 this 값을 나타내는 String을 regexpOrPattern에 대해 정규 표현식 매칭하고, 매치 결과를 산출하는 반복자를 반환한다. 각 매치 결과는 String의 매치된 부분을 첫 번째 요소로 포함하고, 이어서 캡처 그룹에 의해 매치된 부분들을 포함하는 Array이다. 정규 표현식이 전혀 매치되지 않으면, 반환된 반복자는 어떤 매치 결과도 산출하지 않는다.
The abstract operation StringPaddingBuiltinsImpl takes arguments thisValue (an ECMAScript language value), maxLength (an ECMAScript language value), fillString (an ECMAScript language value), and placement (start or end) and returns either a normal completion containing a String or a throw completion. It performs the following steps when called:
The abstract operation StringPad takes arguments str (a String), maxLength (a non-negative integer), fillString (a String), and placement (start or end) and returns a String. It performs the following steps when called:
stringLength를 str의 길이라고 하자.
maxLength ≤ stringLength이면, str을 반환한다.
fillString이 빈 String이면, str을 반환한다.
fillLen을 maxLength - stringLength라고 하자.
truncatedStringFiller를 fillString의 반복 연결로 구성되고 길이 fillLen으로 잘린 String 값이라고 하자.
placement가 start이면, truncatedStringFiller와 str의 문자열 연결을 반환한다.
str과 truncatedStringFiller의 문자열 연결을 반환한다.
Note 1
인자 maxLength는 str의 길이보다 작을 수 없도록 클램프된다.
Note 2
인자 fillString의 기본값은 " " (코드 단위 0x0020 SPACE로 구성된 String 값)이다.
22.1.3.17.3 ToZeroPaddedDecimalString ( n, minLength )
The abstract operation ToZeroPaddedDecimalString takes arguments n (a non-negative integer) and minLength (a non-negative integer) and returns a String. It performs the following steps when called:
The abstract operation GetSubstitution takes arguments matched (a String), str (a String), position (a non-negative integer), captures (a List of either Strings or undefined), namedCaptures (an Object or undefined), and replacementTemplate (a String) and returns either a normal completion containing a String or a throw completion. 이 추상 연산의 목적상, 십진 숫자는 0x0030 (DIGIT ZERO)부터 0x0039 (DIGIT NINE)까지의 포함 구간에 있는 코드 단위이다. It performs the following steps when called:
이 메서드는 이 객체를 String으로 변환한 결과의 부분 문자열들이 저장된 Array를 반환한다. 부분 문자열들은 separator의 출현을 왼쪽에서 오른쪽으로 검색하여 결정된다; 이러한 출현들은 반환된 배열 안의 어떤 String의 일부도 아니지만, String 값을 나누는 역할을 한다. separator의 값은 임의 길이의 String일 수도 있고, RegExp처럼 %Symbol.split% 메서드를 가진 객체일 수도 있다.
separator의 값은 빈 String일 수 있다. 이 경우 separator는 입력 String의 시작이나 끝에 있는 빈 부분 문자열과 매치되지 않으며, 이전 구분자 매치의 끝에 있는 빈 부분 문자열과도 매치되지 않는다. separator가 빈 String이면, String은 개별 코드 단위 요소들로 분할된다; 결과 배열의 길이는 String의 길이와 같으며, 각 부분 문자열은 하나의 코드 단위를 포함한다.
this 값이 빈 String이거나 빈 String으로 변환되는 경우, 결과는 separator가 빈 String과 매치될 수 있는지에 따라 달라진다. 매치될 수 있으면 결과 배열은 요소를 포함하지 않는다. 그렇지 않으면 결과 배열은 빈 String인 하나의 요소를 포함한다.
separator가 undefined이면, 결과 배열은 this 값(String으로 변환됨)인 하나의 String만 포함한다. limit이 undefined가 아니면, 출력 배열은 limit개 이하의 요소만 포함하도록 잘린다.
Note 2
이 메서드는 의도적으로 제네릭이다; 이 메서드는 자신의 this 값이 String 객체일 것을 요구하지 않는다. 따라서 메서드로 사용하기 위해 다른 종류의 객체로 이전될 수 있다.
22.1.3.24 String.prototype.startsWith ( searchString [ , position ] )
position이 undefined이면 pos를 0이라고 하자; 그렇지 않으면 pos를 ? ToIntegerOrInfinity(position)라고 하자.
start를 pos를 0과 len 사이로 클램프한 결과라고 하자.
searchLength를 searchStr의 길이라고 하자.
searchLength = 0이면, true를 반환한다.
end를 start + searchLength라고 하자.
end > len이면, false를 반환한다.
substring을 str의 start부터 end까지의 부분 문자열이라고 하자.
substring이 searchStr이면, true를 반환한다.
false를 반환한다.
Note 1
첫 번째 인자가 RegExp이면 예외를 던지도록 지정된 것은 그러한 인자 값을 허용하는 확장을 미래 판에서 정의할 수 있게 하기 위한 것이다.
Note 2
이 메서드는 의도적으로 제네릭이다; 이 메서드는 자신의 this 값이 String 객체일 것을 요구하지 않는다. 따라서 메서드로 사용하기 위해 다른 종류의 객체로 이전될 수 있다.
22.1.3.25 String.prototype.substring ( start, end )
이 메서드는 이 객체를 String으로 변환한 결과의 부분 문자열을 반환한다. 이 부분 문자열은 인덱스 start에서 시작하여 String의 인덱스 end까지 진행하되 end는 포함하지 않는다(또는 end가 undefined이면 String의 끝까지). 결과는 String 객체가 아니라 String 값이다.
어느 인자든 NaN이거나 음수이면 0으로 대체된다; 어느 인자든 String의 길이보다 엄격히 크면 String의 길이로 대체된다.
결과는 Unicode Character Database의 로캘 비민감 대소문자 매핑에 따라 도출되어야 한다(이는 UnicodeData.txt 파일뿐만 아니라 그와 함께 제공되는 SpecialCasing.txt 파일의 모든 로캘 비민감 매핑도 명시적으로 포함한다).
Note 1
일부 코드 포인트의 대소문자 매핑은 여러 코드 포인트를 생성할 수 있다. 이 경우 결과 String은 원본 String과 같은 길이가 아닐 수 있다. toUpperCase와 toLowerCase 모두 문맥 민감 동작을 가지므로, 이 메서드들은 대칭적이지 않다. 다시 말해, s.toUpperCase().toLowerCase()는 반드시 s.toLowerCase()와 같지는 않다.
Note 2
이 메서드는 의도적으로 제네릭이다; 이 메서드는 자신의 this 값이 String 객체일 것을 요구하지 않는다. 따라서 메서드로 사용하기 위해 다른 종류의 객체로 이전될 수 있다.
이 메서드는 의도적으로 제네릭이다; 이 메서드는 자신의 this 값이 String 객체일 것을 요구하지 않는다. 따라서 메서드로 사용하기 위해 다른 종류의 객체로 이전될 수 있다.
22.1.3.32.1 TrimString ( string, where )
The abstract operation TrimString takes arguments string (an ECMAScript language value) and where (start, end, or start+end) and returns either a normal completion containing a String or a throw completion. 이 연산은 6.1.4에 설명된 대로 string을 UTF-16으로 인코딩된 코드 포인트들의 시퀀스로 해석한다. It performs the following steps when called:
trimmedString을 str의 선행 및 후행 공백 문자가 모두 제거된 복사본인 String 값이라고 하자.
trimmedString을 반환한다.
공백 문자의 정의는 WhiteSpace와 LineTerminator의 합집합이다. Unicode 코드 포인트가 Unicode 일반 범주 “Space_Separator” (“Zs”)에 속하는지 결정할 때, 코드 단위 시퀀스는 6.1.4에 지정된 대로 UTF-16으로 인코딩된 코드 포인트 시퀀스로 해석된다.
22.1.3.33 String.prototype.trimEnd ( )
이 메서드는 6.1.4에 설명된 대로 String 값을 UTF-16으로 인코딩된 코드 포인트들의 시퀀스로 해석한다.
The abstract operation ThisStringValue takes argument value (an ECMAScript language value) and returns either a normal completion containing a String or a throw completion. It performs the following steps when called:
String 인스턴스는 String 특수 객체이며 그러한 객체에 대해 지정된 내부 메서드를 가진다. String 인스턴스는 String 프로토타입 객체로부터 속성을 상속한다. String 인스턴스는 또한 [[StringData]] 내부 슬롯을 가진다. [[StringData]] 내부 슬롯은 이 String 객체가 나타내는 String 값이다.
String 인스턴스는 "length" 속성과, 정수 인덱스 이름을 가진 열거 가능한 속성들의 집합을 가진다.
22.1.4.1 length
이 String 객체가 나타내는 String 값의 요소 개수.
String 객체가 초기화되면, 이 속성은 변하지 않는다. 이 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 속성 특성을 가진다.
22.1.5 String Iterator 객체
String Iterator는 특정 String 인스턴스 객체에 대한 특정 반복을 나타내는 객체이다. String Iterator 객체에는 이름 있는 생성자가 없다. 대신, String Iterator 객체는 String 인스턴스 객체의 특정 메서드를 호출하여 생성된다.
The abstract operation CountLeftCapturingParensWithin takes argument node (a Parse Node) and returns a non-negative integer. 이 연산은 node 안의 왼쪽 캡처 괄호의 수를 반환한다. 왼쪽 캡처 괄호는 Atom::(GroupSpecifieroptDisjunction) 생성식의 ( 터미널과 일치한 임의의 ( 패턴 문자이다.
The abstract operation CountLeftCapturingParensBefore takes argument node (a Parse Node) and returns a non-negative integer. 이 연산은 둘러싸는 패턴 안에서 node의 왼쪽에 나타나는 왼쪽 캡처 괄호의 수를 반환한다.
22.2.1.4 Static Semantics: MightBothParticipate ( x, y )
The abstract operation MightBothParticipate takes arguments x (a Parse Node) and y (a Parse Node) and returns a Boolean. It performs the following steps when called:
The abstract operation GroupSpecifiersThatMatch takes argument thisGroupName (a GroupName Parse Node) and returns a List of GroupSpecifierParse Nodes. It performs the following steps when called:
The syntax-directed operation RegExpIdentifierCodePoints takes no arguments and returns a List of code points. It is defined piecewise over the following productions:
The syntax-directed operation RegExpIdentifierCodePoint takes no arguments and returns a code point. It is defined piecewise over the following productions:
정규 표현식 패턴은 아래에 설명된 과정을 사용하여 Abstract Closure로 변환된다. 구현은 결과가 동일한 한, 아래에 나열된 알고리즘보다 더 효율적인 알고리즘을 사용하는 것이 권장된다. Abstract Closure는 RegExp 객체의 [[RegExpMatcher]] 내부 슬롯 값으로 사용된다.
Pattern은 관련 플래그가 u도 v도 포함하지 않으면 BMP 패턴이다. 그렇지 않으면 Unicode 패턴이다. BMP 패턴은 Basic Multilingual Plane 범위의 Unicode 코드 포인트인 16비트 값의 시퀀스로 구성된 것으로 해석되는 String에 대해 매치한다. Unicode 패턴은 UTF-16을 사용해 인코딩된 Unicode 코드 포인트들로 구성된 것으로 해석되는 String에 대해 매치한다. BMP 패턴의 동작을 설명하는 문맥에서 “character”는 단일 16비트 Unicode BMP 코드 포인트를 의미한다. Unicode 패턴의 동작을 설명하는 문맥에서 “character”는 UTF-16으로 인코딩된 코드 포인트(6.1.4)를 의미한다. 어느 문맥에서든 “character value”는 대응하는 인코딩되지 않은 코드 포인트의 수치 값을 의미한다.
예를 들어, 단일 비-BMP 문자 U+1D11E (MUSICAL SYMBOL G CLEF)로 소스 텍스트에 표현된 패턴을 생각해 보자. Unicode 패턴으로 해석되면, 이는 단일 코드 포인트 U+1D11E로 구성된 단일 요소(character) List가 된다. 그러나 BMP 패턴으로 해석되면, 먼저 UTF-16으로 인코딩되어 코드 단위 0xD834와 0xDD1E로 구성된 두 요소 List를 생성한다.
패턴은 비-BMP 문자가 UTF-16으로 인코딩된 ECMAScript String 값으로 RegExp 생성자에 전달된다. 예를 들어, 단일 문자 MUSICAL SYMBOL G CLEF 패턴은 String 값으로 표현될 때 요소가 코드 단위 0xD834와 0xDD1E인 길이 2의 String이다. 따라서 두 패턴 문자로 구성된 BMP 패턴으로 처리하기 위해서는 문자열에 대한 추가 변환이 필요하지 않다. 그러나 Unicode 패턴으로 처리하기 위해서는 UTF16SurrogatePairToCodePoint를 사용하여 유일한 요소가 단일 패턴 문자인 코드 포인트 U+1D11E인 List를 생성해야 한다.
구현은 실제로 UTF-16으로 또는 UTF-16에서 이러한 변환을 수행하지 않을 수 있지만, 이 명세의 의미론은 패턴 매칭 결과가 그러한 변환이 수행된 것과 같을 것을 요구한다.
22.2.2.1 표기법
아래 설명은 다음 내부 데이터 구조를 사용한다:
CharSetElement는 다음 두 엔티티 중 하나이다:
regexpRecord.[[UnicodeSets]]가 false이면, CharSetElement는 위의 Pattern Semantics의 의미에서의 character이다.
regexpRecord.[[UnicodeSets]]가 true이면, CharSetElement는 위의 Pattern Semantics의 의미에서의 character들을 요소로 가지는 시퀀스이다. 여기에는 빈 시퀀스, 하나의 character로 된 시퀀스, 둘 이상의 character로 된 시퀀스가 포함된다. 편의를 위해, 이러한 종류의 CharSetElement를 다룰 때 개별 character는 하나의 character로 된 시퀀스와 상호 교환적으로 취급된다.
CharSet는 CharSetElement들의 수학적 집합이다.
CaptureRange는 캡처에 포함된 문자 범위를 나타내는 Record { [[StartIndex]], [[EndIndex]] }이다. 여기서 [[StartIndex]]는 input 안에서 그 범위의 시작 인덱스(포함)를 나타내는 정수이고, [[EndIndex]]는 input 안에서 그 범위의 끝 인덱스(제외)를 나타내는 정수이다. 어떤 CaptureRange에 대해서도, 이 인덱스들은 [[StartIndex]] ≤ [[EndIndex]]라는 불변식을 만족해야 한다.
MatchState는 Record { [[Input]], [[EndIndex]], [[Captures]] }이다. 여기서 [[Input]]은 매치되는 String을 나타내는 character들의 List이고, [[EndIndex]]는 정수이며, [[Captures]]는 패턴의 각 왼쪽 캡처 괄호마다 하나씩 있는 값의 List이다. MatchState는 정규 표현식 매칭 알고리즘에서 부분 매치 상태를 나타내는 데 사용된다. [[EndIndex]]는 지금까지 패턴이 매치한 마지막 입력 character의 인덱스에 1을 더한 값이고, [[Captures]]는 캡처 괄호의 결과를 보관한다. [[Captures]]의 nth 요소는 nth 캡처 괄호 집합이 캡처한 character 범위를 나타내는 CaptureRange이거나, nth 캡처 괄호 집합에 아직 도달하지 않았으면 undefined이다. 백트래킹 때문에, 매칭 과정 중 언제든 많은 MatchState가 사용 중일 수 있다.
The syntax-directed operation CompilePattern takes argument regexpRecord (a RegExp Record) and returns a Abstract Closure that takes a List of characters and a non-negative integer and returns either a MatchState or failure. It is defined piecewise over the following productions:
cap을 1부터 regexpRecord.[[CapturingGroupsCount]]까지 인덱스되는, regexpRecord.[[CapturingGroupsCount]]개의 undefined 값으로 된 List라고 하자.
x를 MatchState { [[Input]]: input, [[EndIndex]]: index, [[Captures]]: cap }라고 하자.
m(x, c)를 반환한다.
Note
Pattern은 Abstract Closure 값으로 컴파일된다. 그러면 RegExpBuiltinExec는 이 절차를 character들의 List와 그 List 안의 오프셋에 적용하여, 패턴이 그 List 안의 정확히 그 오프셋에서 시작하여 매치되는지, 그리고 매치된다면 캡처 괄호들의 값이 무엇인지 결정할 수 있다. 22.2.2의 알고리즘들은 패턴 컴파일이 SyntaxError 예외를 던질 수 있도록 설계되어 있다; 반면 패턴이 성공적으로 컴파일된 뒤에는 character들의 List에서 매치를 찾기 위해 결과 Abstract Closure를 적용해도 예외를 던질 수 없다(메모리 부족처럼 어디서든 발생할 수 있는 구현 정의 예외는 제외).
22.2.2.3 Runtime Semantics: CompileSubpattern
The syntax-directed operation CompileSubpattern takes arguments regexpRecord (a RegExp Record) and direction (forward or backward) and returns a Matcher.
| 정규 표현식 연산자는 두 대안을 구분한다. 패턴은 먼저 왼쪽 Alternative(|regular expression|의 후속 부분이 뒤따름)를 매치하려고 시도한다; 실패하면 오른쪽 Disjunction(|regular expression|의 후속 부분이 뒤따름)를 매치하려고 시도한다. 왼쪽 Alternative, 오른쪽 Disjunction, 그리고 후속 부분 모두 선택 지점을 가지면, 왼쪽 Alternative의 다음 선택으로 넘어가기 전에 후속 부분의 모든 선택이 시도된다. 왼쪽 Alternative의 선택이 소진되면, 왼쪽 Alternative 대신 오른쪽 Disjunction이 시도된다. |에 의해 건너뛴 패턴 부분 안의 캡처 괄호는 String 대신 undefined 값을 생성한다. 따라서 예를 들어,
연속된 Term들은 input의 연속된 부분들을 동시에 매치하려고 시도한다. direction이 forward이면, 왼쪽 Alternative, 오른쪽 Term, 그리고 정규 표현식의 후속 부분 모두 선택 지점을 가지는 경우, 오른쪽 Term의 다음 선택으로 넘어가기 전에 후속 부분의 모든 선택이 시도되고, 왼쪽 Alternative의 다음 선택으로 넘어가기 전에 오른쪽 Term의 모든 선택이 시도된다. direction이 backward이면, Alternative와 Term의 평가 순서가 반대로 된다.
The abstract operation RepeatMatcher takes arguments m (a Matcher), min (a non-negative integer), max (a non-negative integer or +∞), greedy (a Boolean), matchState (a MatchState), continue (a MatcherContinuation), parenIndex (a non-negative integer), and parenCount (a non-negative integer) and returns either a MatchState or failure. It performs the following steps when called:
max = 0이면 continue(matchState)를 반환한다.
d를 m, min, max, greedy, matchState, continue, parenIndex, 및 parenCount를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수 (y)를 가진 새로운 MatcherContinuation이라고 하자:
min = 0이고 y.[[EndIndex]] = matchState.[[EndIndex]]이면 failure를 반환한다.
min = 0이면 min2를 0이라고 하자; 그렇지 않으면 min2를 min - 1이라고 하자.
max = +∞이면 max2를 +∞라고 하자; 그렇지 않으면 max2를 max - 1이라고 하자.
RepeatMatcher(m, min2, max2, greedy, y, continue, parenIndex, parenCount)를 반환한다.
cap을 matchState.[[Captures]]의 사본이라고 하자.
parenIndex + 1부터 parenIndex + parenCount까지의 포함 구간에 있는 각 정수k에 대해, cap[k]를 undefined로 설정한다.
input을 matchState.[[Input]]이라고 하자.
e를 matchState.[[EndIndex]]라고 하자.
xr를 MatchState { [[Input]]: input, [[EndIndex]]: e, [[Captures]]: cap }라고 하자.
min ≠ 0이면 m(xr, d)를 반환한다.
greedy가 false이면,
z를 continue(matchState)라고 하자.
z가 failure가 아니면 z를 반환한다.
m(xr, d)를 반환한다.
z를 m(xr, d)라고 하자.
z가 failure가 아니면 z를 반환한다.
continue(matchState)를 반환한다.
Note 1
Quantifier가 뒤따르는 Atom은 Quantifier가 지정한 횟수만큼 반복된다. Quantifier는 비탐욕적일 수 있으며, 이 경우 Atom 패턴은 후속 부분을 여전히 매치하면서 가능한 한 적은 횟수로 반복된다. 또는 탐욕적일 수 있으며, 이 경우 Atom 패턴은 후속 부분을 여전히 매치하면서 가능한 한 많은 횟수로 반복된다. 반복되는 것은 Atom이 매치하는 입력 문자 시퀀스가 아니라 Atom 패턴이므로, Atom의 서로 다른 반복은 서로 다른 입력 부분 문자열과 매치할 수 있다.
Note 2
Atom과 정규 표현식의 후속 부분 모두 선택 지점을 가지면, Atom은 먼저 가능한 한 많은 횟수(또는 비탐욕적인 경우 가능한 한 적은 횟수)로 매치된다. Atom의 마지막 반복의 다음 선택으로 넘어가기 전에 후속 부분의 모든 선택이 시도된다. Atom의 마지막(nth) 반복의 모든 선택은 Atom의 끝에서 두 번째((n - 1)st) 반복의 다음 선택으로 넘어가기 전에 시도된다; 그 시점에서 Atom의 더 많거나 더 적은 반복이 이제 가능하다는 것이 드러날 수 있다; 이들은 (다시, 가능한 한 적게 또는 가능한 한 많이 시작하여) 소진된 뒤 Atom의 (n - 1)st 반복의 다음 선택으로 넘어가고, 이런 식으로 계속된다.
다음과 비교해 보라
/a[a-z]{2,4}/.exec("abcdefghi")
이는 "abcde"를 반환하는 반면
/a[a-z]{2,4}?/.exec("abcdefghi")
이는 "abc"를 반환한다.
또한 다음을 생각해 보라
/(aa|aabaac|ba|b|c)*/.exec("aabaac")
이는 위의 선택 지점 순서에 따라 배열
["aaba", "ba"]
를 반환하고 다음 중 어느 것도 반환하지 않는다:
["aabaac", "aabaac"]
["aabaac", "c"]
위의 선택 지점 순서는 두 수(단항 표기법으로 표현됨)의 최대공약수를 계산하는 정규 표현식을 작성하는 데 사용될 수 있다. 다음 예는 10과 15의 gcd를 계산한다:
The abstract operation MatchTwoAlternatives takes arguments m1 (a Matcher) and m2 (a Matcher) and returns a Matcher. It performs the following steps when called:
m1과 m2를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수 (matchState, continue)를 가진 새로운 Matcher를 반환한다:
The abstract operation MatchSequence takes arguments m1 (a Matcher), m2 (a Matcher), and direction (forward or backward) and returns a Matcher. It performs the following steps when called:
direction이 forward이면,
m1과 m2를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수 (matchState, continue)를 가진 새로운 Matcher를 반환한다:
z를 MatchState { [[Input]]: input, [[EndIndex]]: xe, [[Captures]]: cap }라고 하자.
continue(z)를 반환한다.
Note 3
형식 (?=Disjunction)는 너비가 0인 양의 전방탐색을 지정한다. 성공하려면 Disjunction 안의 패턴이 현재 위치에서 매치되어야 하지만, 후속 부분을 매치하기 전에 현재 위치는 전진하지 않는다. Disjunction이 현재 위치에서 여러 방식으로 매치될 수 있으면, 첫 번째 것만 시도된다. 다른 정규 표현식 연산자와 달리, (?= 형식 안으로의 백트래킹은 없다(이 특이한 동작은 Perl에서 상속되었다). 이는 Disjunction이 캡처 괄호를 포함하고 패턴의 후속 부분이 그 캡처들에 대한 역참조를 포함할 때만 중요하다.
형식 (?!Disjunction)는 너비가 0인 음의 전방탐색을 지정한다. 성공하려면 Disjunction 안의 패턴이 현재 위치에서 매치에 실패해야 한다. 후속 부분을 매치하기 전에 현재 위치는 전진하지 않는다. Disjunction은 캡처 괄호를 포함할 수 있지만, 그에 대한 역참조는 Disjunction 자체 안에서만 의미가 있다. 패턴의 다른 곳에서 이 캡처 괄호들에 대한 역참조는 음의 전방탐색이 패턴 성공을 위해 실패해야 하므로 항상 undefined를 반환한다. 예를 들어,
/(.*?)a(?!(a+)b\2c)\2(.*)/.exec("baaabaac")
는 어떤 양수 n개의 a, b, 또 다른 n개의 a(첫 번째 \2로 지정됨), 그리고 c가 바로 뒤따르지 않는 a를 찾는다. 두 번째 \2는 음의 전방탐색 밖에 있으므로 undefined와 매치하여 항상 성공한다. 전체 표현식은 배열을 반환한다:
The abstract operation IsWordChar takes arguments regexpRecord (a RegExp Record), input (a List of characters), and e (an integer) and returns a Boolean. It performs the following steps when called:
The syntax-directed operation CompileQuantifier takes no arguments and returns a Record with fields [[Min]] (a non-negative integer), [[Max]] (a non-negative integer or +∞), and [[Greedy]] (a Boolean). It is defined piecewise over the following productions:
The syntax-directed operation CompileQuantifierPrefix takes no arguments and returns a Record with fields [[Min]] (a non-negative integer) and [[Max]] (a non-negative integer or +∞). It is defined piecewise over the following productions:
regexpRecord.[[UnicodeSets]]가 false이거나 cs의 모든 CharSetElement가 단일 character로 구성되어 있으면(cs가 비어 있는 경우 포함), CharacterSetMatcher(regexpRecord, cs, cc.[[Invert]], direction)를 반환한다.
r을 CaptureRange { [[StartIndex]]: ye, [[EndIndex]]: xe }라고 하자.
cap[parenIndex + 1]을 r로 설정한다.
z를 MatchState { [[Input]]: input, [[EndIndex]]: ye, [[Captures]]: cap }라고 하자.
c(z)를 반환한다.
m(x, d)를 반환한다.
Note 2
형식 (Disjunction)의 괄호는 Disjunction 패턴의 구성요소를 함께 그룹화하고 매치 결과를 저장하는 두 역할을 모두 한다. 결과는 역참조(\ 뒤에 0이 아닌 십진수가 옴)에서 사용되거나, replace String에서 참조되거나, 정규 표현식 매칭 Abstract Closure에서 배열의 일부로 반환될 수 있다. 괄호의 캡처 동작을 억제하려면 대신 형식 (?:Disjunction)를 사용한다.
형식 \ 뒤에 0이 아닌 십진수 n이 오는 escape sequence는 nth 캡처 괄호 집합의 결과(22.2.2.1)와 매치한다. 정규 표현식의 캡처 괄호가 n개보다 적으면 오류이다. 정규 표현식의 캡처 괄호가 n개 이상이지만 nth 것이 아무것도 캡처하지 않아 undefined이면, 역참조는 항상 성공한다.
regexpRecord.[[UnicodeSets]]가 false이거나 cs의 모든 CharSetElement가 단일 character로 구성되어 있으면(cs가 비어 있는 경우 포함), CharacterSetMatcher(regexpRecord, cs, false, direction)를 반환한다.
22.2.2.7.1 CharacterSetMatcher ( regexpRecord, charSet, invert, direction )
The abstract operation CharacterSetMatcher takes arguments regexpRecord (a RegExp Record), charSet (a CharSet), invert (a Boolean), and direction (forward or backward) and returns a Matcher. It performs the following steps when called:
Canonicalize(regexpRecord, a)가 cc인 정확히 하나의 character a를 포함하는 CharSetElement가 charSet 안에 존재하면 found를 true라고 하자; 그렇지 않으면 found를 false라고 하자.
invert가 false이고 found가 false이면 failure를 반환한다.
invert가 true이고 found가 true이면 failure를 반환한다.
cap을 x.[[Captures]]라고 하자.
y를 MatchState { [[Input]]: input, [[EndIndex]]: f, [[Captures]]: cap }라고 하자.
c(y)를 반환한다.
22.2.2.7.2 BackreferenceMatcher ( regexpRecord, ns, direction )
The abstract operation BackreferenceMatcher takes arguments regexpRecord (a RegExp Record), ns (a List of positive integers), and direction (forward or backward) and returns a Matcher. It performs the following steps when called:
regexpRecord, ns, 및 direction을 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수 (x, c)를 가진 새로운 Matcher를 반환한다:
0(포함)부터 len(제외)까지의 구간에 있는 정수i 중 Canonicalize(regexpRecord, input[rs + i])가 Canonicalize(regexpRecord, input[g + i])가 아닌 것이 존재하면 failure를 반환한다.
y를 MatchState { [[Input]]: input, [[EndIndex]]: f, [[Captures]]: cap }라고 하자.
c(y)를 반환한다.
22.2.2.7.3 Canonicalize ( regexpRecord, ch )
The abstract operation Canonicalize takes arguments regexpRecord (a RegExp Record) and ch (a character) and returns a character. It performs the following steps when called:
HasEitherUnicodeFlag(regexpRecord)가 true인 대소문자 비구분 매치에서는, 모든 character가 비교되기 직전에 Unicode Standard가 제공하는 simple 매핑을 사용해 암묵적으로 case-fold된다. simple 매핑은 항상 단일 코드 포인트로 매핑하므로, 예를 들어 ß (U+00DF LATIN SMALL LETTER SHARP S)를 ss나 SS로 매핑하지 않는다. 그러나 Basic Latin 블록 밖의 코드 포인트를 그 안의 코드 포인트로 매핑할 수는 있다. 예를 들어, ſ (U+017F LATIN SMALL LETTER LONG S)는 s (U+0073 LATIN SMALL LETTER S)로 case-fold되고 K (U+212A KELVIN SIGN)는 k (U+006B LATIN SMALL LETTER K)로 case-fold된다. 이러한 코드 포인트를 포함하는 String들은 /[a-z]/ui와 같은 정규 표현식에 의해 매치된다.
HasEitherUnicodeFlag(regexpRecord)가 false인 대소문자 비구분 매치에서는, 매핑이 toCasefold가 아니라 Unicode Default Case Conversion 알고리즘 toUppercase에 기반하므로 몇 가지 미묘한 차이가 생긴다. 예를 들어, Ω (U+2126 OHM SIGN)는 toUppercase에 의해 자기 자신으로 매핑되지만 toCasefold에 의해 Ω (U+03A9 GREEK CAPITAL LETTER OMEGA)와 함께 ω (U+03C9 GREEK SMALL LETTER OMEGA)로 매핑되므로, "\u2126"는 /[ω]/ui와 /[\u03A9]/ui에는 매치되지만 /[ω]/i나 /[\u03A9]/i에는 매치되지 않는다. 또한 Basic Latin 블록 밖의 어떤 코드 포인트도 그 안의 코드 포인트로 매핑되지 않으므로, "\u017F ſ" 및 "\u212A K"와 같은 String은 /[a-z]/i에 매치되지 않는다.
The abstract operation UpdateModifiers takes arguments regexpRecord (a RegExp Record), add (a String), and remove (a String) and returns a RegExp Record. It performs the following steps when called:
The syntax-directed operation CompileCharacterClass takes argument regexpRecord (a RegExp Record) and returns a Record with fields [[CharSet]] (a CharSet) and [[Invert]] (a Boolean). It is defined piecewise over the following productions:
패턴이 대소문자를 무시하더라도, 범위의 두 끝의 대소문자는 어떤 character가 그 범위에 속하는지 결정하는 데 중요하다. 따라서 예를 들어, 패턴 /[E-F]/i는 문자 E, F, e, f에만 매치하는 반면, 패턴 /[E-f]/i는 Unicode Basic Latin 블록의 모든 대문자와 소문자뿐만 아니라 기호 [, \, ], ^, _, 및 `에도 매치한다.
Note 4
- character는 리터럴로 취급될 수도 있고 범위를 나타낼 수도 있다. ClassContents의 첫 번째 또는 마지막 character이거나, 범위 지정의 시작 또는 끝 한계이거나, 범위 지정 바로 뒤에 오면 리터럴로 취급된다.
ClassAtom은 \b, \B, 및 역참조를 제외하고 정규 표현식의 나머지에서 허용되는 어떤 escape sequence든 사용할 수 있다. CharacterClass 안에서 \b는 백스페이스 character를 의미하고, \B와 역참조는 오류를 일으킨다. ClassAtom 안에서 역참조를 사용하면 오류가 발생한다.
단일 character U+0008 (BACKSPACE)를 포함하는 CharSet을 반환한다.
22.2.2.9.1 CharacterRange ( charSet, otherSet )
The abstract operation CharacterRange takes arguments charSet (a CharSet) and otherSet (a CharSet) and returns a CharSet. It performs the following steps when called:
Assert: charSet과 otherSet은 각각 정확히 하나의 character를 포함한다.
i부터 j까지의 포함 구간에 있는 character value를 가진 모든 character를 포함하는 CharSet을 반환한다.
22.2.2.9.2 HasEitherUnicodeFlag ( regexpRecord )
The abstract operation HasEitherUnicodeFlag takes argument regexpRecord (a RegExp Record) and returns a Boolean. It performs the following steps when called:
The abstract operation WordCharacters takes argument regexpRecord (a RegExp Record) and returns a CharSet. \b, \B, \w, 및 \W의 목적상 "word characters"로 간주되는 character들을 포함하는 CharSet을 반환한다. It performs the following steps when called:
basicWordChars를 ASCII word characters 안의 모든 character를 포함하는 CharSet이라고 하자.
extraWordChars를 basicWordChars 안에 없지만 Canonicalize(regexpRecord, c)가 basicWordChars 안에 있는 모든 character c를 포함하는 CharSet이라고 하자.
Assert: HasEitherUnicodeFlag(regexpRecord)가 true이고 regexpRecord.[[IgnoreCase]]가 true인 경우가 아니면 extraWordChars는 비어 있다.
basicWordChars와 extraWordChars의 합집합을 반환한다.
22.2.2.9.4 AllCharacters ( regexpRecord )
The abstract operation AllCharacters takes argument regexpRecord (a RegExp Record) and returns a CharSet. 정규 표현식 플래그에 따른 “all characters”의 집합을 반환한다. It performs the following steps when called:
The abstract operation MaybeSimpleCaseFolding takes arguments regexpRecord (a RegExp Record) and charSet (a CharSet) and returns a CharSet. regexpRecord.[[UnicodeSets]]가 false이거나 regexpRecord.[[IgnoreCase]]가 false이면, charSet을 반환한다. 그렇지 않으면, Unicode Character Database의 파일 CaseFolding.txt에 있는 Simple Case Folding (scf(cp)) 정의(각각 단일 코드 포인트를 다른 단일 코드 포인트로 매핑함)를 사용하여 charSet의 각 CharSetElement를 character별로 정준 형식으로 매핑하고, 그 결과 CharSet을 반환한다. It performs the following steps when called:
The abstract operation CharacterComplement takes arguments regexpRecord (a RegExp Record) and complement (a CharSet) and returns a CharSet. It performs the following steps when called:
22.2.2.9.7 UnicodeMatchProperty ( regexpRecord, p )
The abstract operation UnicodeMatchProperty takes arguments regexpRecord (a RegExp Record) and p (ECMAScript source text) and returns a Unicode property name. It performs the following steps when called:
The abstract operation UnicodeMatchPropertyValue takes arguments p (ECMAScript source text) and v (ECMAScript source text) and returns a Unicode property value. It performs the following steps when called:
The syntax-directed operation CompileClassSetString takes argument regexpRecord (a RegExp Record) and returns a sequence of characters. It is defined piecewise over the following productions:
The abstract operation RegExpCreate takes arguments pattern (an ECMAScript language value) and flags (a String or undefined) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:
The abstract operation RegExpAlloc takes argument newTarget (a constructor) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:
The abstract operation RegExpInitialize takes arguments obj (an Object), pattern (an ECMAScript language value), and flags (an ECMAScript language value) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:
regexpRecord를 RegExp Record { [[IgnoreCase]]: i, [[Multiline]]: m, [[DotAll]]: s, [[Unicode]]: u, [[UnicodeSets]]: v, [[CapturingGroupsCount]]: capturingGroupsCount }라고 하자.
22.2.3.4 Static Semantics: ParsePattern ( patternText, u, v )
The abstract operation ParsePattern takes arguments patternText (a sequence of Unicode code points), u (a Boolean), and v (a Boolean) and returns a Parse Node or a non-empty List of SyntaxError objects.
pattern이 StringLiteral을 사용해 제공되면, String이 이 함수에 의해 처리되기 전에 일반적인 escape sequence 치환이 수행된다. pattern이 이 함수에 의해 인식되어야 하는 escape sequence를 포함해야 하는 경우, StringLiteral의 내용이 형성될 때 U+005C (REVERSE SOLIDUS) 코드 포인트가 제거되지 않도록 StringLiteral 안에서 escape되어야 한다.
NOTE: 선행 숫자를 escape하면 출력이 \0 문자 escape 또는 \1과 같은 DecimalEscape 뒤에서 사용될 수 있는 패턴 텍스트와 대응하며, 앞선 escape sequence의 확장으로 해석되지 않고 여전히 str과 매치되도록 보장한다. 선행 ASCII 문자를 escape하는 것은 \c 뒤의 문맥에 대해 같은 일을 한다.
이름이 비슷하지만, EscapeRegExpPattern과 RegExp.escape는 비슷한 동작을 수행하지 않는다. 전자는 문자열로 표현하기 위해 패턴을 escape하는 반면, 이 함수는 패턴 안에서 표현하기 위해 문자열을 escape한다.
22.2.5.1.1 EncodeForRegExpEscape ( cp )
The abstract operation EncodeForRegExpEscape takes argument cp (a code point) and returns a String. 이 연산은 cp와 매치하기 위한 Pattern을 나타내는 String을 반환한다. cp가 공백 문자이거나 ASCII 구두점이면, 반환값은 escape sequence이다. 그렇지 않으면, 반환값은 cp 자체의 String 표현이다. It performs the following steps when called:
sticky가 true이면, 코드 단위 0x0079 (LATIN SMALL LETTER Y)를 codeUnits에 추가한다.
코드 단위가 ListcodeUnits의 요소인 String 값을 반환한다. codeUnits가 요소를 가지지 않으면, 빈 String이 반환된다.
22.2.6.4.1 RegExpHasFlag ( regexp, codeUnit )
The abstract operation RegExpHasFlag takes arguments regexp (an ECMAScript language value) and codeUnit (a code unit) and returns either a normal completion containing either a Boolean or undefined, or a throw completion. It performs the following steps when called:
? Set(regexp, "lastIndex", 𝔽(nextIndex), true)를 수행한다.
matchCount를 matchCount + 1로 설정한다.
이 메서드의 "name" 속성의 값은 "[Symbol.match]"이다.
Note
%Symbol.match% 속성은 정규 표현식의 기본 동작을 가진 객체를 식별하기 위해 IsRegExp추상 연산에서 사용된다. %Symbol.match% 속성이 없거나, 그러한 속성이 존재하지만 그 값이 Boolean으로 강제 변환될 때 true가 아닌 경우, 그 객체가 정규 표현식 객체로 사용되도록 의도되지 않았음을 나타낸다.
NOTE: captureNumber = 1이면, 앞 단계는 첫 번째 요소를 captures 안에 넣는다(인덱스 0). 더 일반적으로, captureNumberth 캡처(captureNumberth 캡처 괄호 집합이 캡처한 문자들)는 captures[captureNumber - 1]에 있다.
replacementString을 ? GetSubstitution(matched, str, position, captures, namedCaptures, replaceValue)라고 하자.
position ≥ nextSourcePosition이면,
NOTE: position은 보통 뒤로 이동해서는 안 된다. 만약 이동한다면, 이는 제대로 동작하지 않는 RegExp 서브클래스이거나 접근으로 촉발된 부수 효과를 사용해 regexp의 global 플래그 또는 다른 특성을 변경했음을 나타낸다. 이러한 경우, 대응하는 치환은 무시된다.
accumulatedResult를 accumulatedResult, str의 nextSourcePosition부터 position까지의 부분 문자열, 및 replacementString의 문자열 연결로 설정한다.
The abstract operation EscapeRegExpPattern takes arguments pattern (a String) and flags (a String) and returns a String. It performs the following steps when called:
flags가 "v"를 포함하면,
patternSymbol을 Pattern[+UnicodeMode, +UnicodeSetsMode]라고 하자.
그렇지 않고 flags가 "u"를 포함하면,
patternSymbol을 Pattern[+UnicodeMode, ~UnicodeSetsMode]라고 하자.
그렇지 않으면,
patternSymbol을 Pattern[~UnicodeMode, ~UnicodeSetsMode]라고 하자.
escapedPattern을 UTF-16으로 인코딩된 Unicode 코드 포인트(6.1.4)로 해석된 pattern과 동등한 patternSymbol의 형식을 가지며, 특정 코드 포인트가 아래 설명된 대로 escape된 String이라고 하자. escapedPattern은 pattern과 다를 수도 있고 다르지 않을 수도 있다; 그러나 escapedPattern을 patternSymbol로 평가하여 생기는 Abstract Closure는 생성된 객체의 [[RegExpMatcher]] 내부 슬롯이 제공하는 Abstract Closure와 동일하게 동작해야 한다. 같은 pattern 및 flags 값으로 이 추상 연산을 여러 번 호출하면 동일한 결과를 생성해야 한다.
패턴 안에 나타나는 코드 포인트 / 또는 임의의 LineTerminator는, "/", escapedPattern, "/", 및 flags의 문자열 연결이 (적절한 어휘 문맥에서) 생성된 정규 표현식과 동일하게 동작하는 RegularExpressionLiteral로 파싱될 수 있도록 필요에 따라 escapedPattern에서 escape되어야 한다. 예를 들어, pattern이 "/"이면, escapedPattern은 그 밖의 가능성 중 "\/" 또는 "\u002F"일 수 있지만 "/"일 수는 없다. 왜냐하면 flags가 뒤따르는 ///는 RegularExpressionLiteral이 아니라 SingleLineComment로 파싱되기 때문이다. pattern이 빈 String이면, escapedPattern을 "(?:)"로 두어 이 명세를 만족할 수 있다.
escapedPattern을 반환한다.
Note
이름이 비슷하지만, RegExp.escape와 EscapeRegExpPattern은 비슷한 동작을 수행하지 않는다. 전자는 패턴 안에서 표현하기 위해 문자열을 escape하는 반면, 이 함수는 문자열로 표현하기 위해 패턴을 escape한다.
이 메서드는 string을 String으로 변환한 결과의 부분 문자열들이 저장된 Array를 반환한다. 부분 문자열들은 this 값 정규 표현식의 매치를 왼쪽에서 오른쪽으로 검색하여 결정된다; 이러한 출현들은 반환된 배열 안의 어떤 String의 일부도 아니지만, String 값을 나누는 역할을 한다.
this 값은 빈 정규 표현식이거나 빈 String과 매치할 수 있는 정규 표현식일 수 있다. 이 경우, 정규 표현식은 입력 String의 시작이나 끝에 있는 빈 부분 문자열과 매치하지 않으며, 이전 구분자 매치의 끝에 있는 빈 부분 문자열과도 매치하지 않는다. (예를 들어, 정규 표현식이 빈 String과 매치하면, String은 개별 코드 단위 요소들로 나뉜다; 결과 배열의 길이는 String의 길이와 같고, 각 부분 문자열은 하나의 코드 단위를 포함한다.) 백트래킹이 그 인덱스에서 비어 있지 않은 부분 문자열 매치를 산출할 수 있더라도, String의 주어진 인덱스에서 첫 번째 매치만 고려된다. (예를 들어, /a*?/[Symbol.split]("ab")는 배열 ["a", "b"]로 평가되는 반면, /a*/[Symbol.split]("ab")는 배열 ["","b"]로 평가된다.)
string이 빈 String이거나 빈 String으로 변환되는 경우, 결과는 정규 표현식이 빈 String과 매치할 수 있는지에 따라 달라진다. 매치할 수 있으면 결과 배열은 요소를 포함하지 않는다. 그렇지 않으면 결과 배열은 빈 String인 하나의 요소를 포함한다.
정규 표현식이 캡처 괄호를 포함하면, separator가 매치될 때마다 캡처 괄호의 결과(undefined 결과 포함)가 출력 배열에 삽입된다. 예를 들어,
The abstract operation RegExpExec takes arguments regexp (an Object) and str (a String) and returns either a normal completion containing either an Object or null, or a throw completion. It performs the following steps when called:
호출 가능한 "exec" 속성을 찾지 못하면 이 알고리즘은 내장 RegExp 매칭 알고리즘 사용을 시도하는 것으로 대체된다. 이는 정규 표현식을 사용하는 대부분의 내장 알고리즘이 "exec"의 동적 속성 조회를 수행하지 않았던 이전 판을 위해 작성된 코드와 호환되는 동작을 제공한다.
22.2.7.2 RegExpBuiltinExec ( regexp, str )
The abstract operation RegExpBuiltinExec takes arguments regexp (an initialized RegExp instance) and str (a String) and returns either a normal completion containing either an Array exotic object or null, or a throw completion. It performs the following steps when called:
length를 str의 길이라고 하자.
lastIndex를 ℝ(? ToLength(! Get(regexp, "lastIndex")))라고 하자.
flags를 regexp.[[OriginalFlags]]라고 하자.
flags가 "g"를 포함하면 global을 true라고 하자; 그렇지 않으면 global을 false라고 하자.
flags가 "y"를 포함하면 sticky를 true라고 하자; 그렇지 않으면 sticky를 false라고 하자.
flags가 "d"를 포함하면 hasIndices를 true라고 하자; 그렇지 않으면 hasIndices를 false라고 하자.
global이 false이고 sticky가 false이면, lastIndex를 0으로 설정한다.
matcher를 regexp.[[RegExpMatcher]]라고 하자.
flags가 "u"를 포함하거나 flags가 "v"를 포함하면 fullUnicode를 true라고 하자; 그렇지 않으면 fullUnicode를 false라고 하자.
matchSucceeded를 false라고 하자.
fullUnicode가 true이면 input을 StringToCodePoints(str)라고 하자; 그렇지 않으면 input을 str의 요소인 코드 단위들을 요소로 가지는 List라고 하자.
capturedValue가 undefined가 아니면 s를 matchedGroupNames에 추가한다.
NOTE: s라는 이름의 그룹이 여러 개 있으면, 이 시점에서 groups는 이미 s 속성을 가질 수 있다. 그러나 groups는 모든 속성이 쓰기 가능한 데이터 속성인 보통 객체이므로, CreateDataPropertyOrThrow 호출은 그럼에도 성공하는 것이 보장된다.
The abstract operation AdvanceStringIndex takes arguments str (a String), index (a non-negative integer), and unicode (a Boolean) and returns a non-negative integer. It performs the following steps when called:
The abstract operation GetStringIndex takes arguments str (a String) and codePointIndex (a non-negative integer) and returns a non-negative integer. 이 연산은 6.1.4에 설명된 대로 str을 UTF-16으로 인코딩된 코드 포인트들의 시퀀스로 해석하고, 그러한 인덱스가 존재할 때 코드 포인트 인덱스 codePointIndex에 대응하는 코드 단위 인덱스를 반환한다. 그렇지 않으면 str의 길이를 반환한다. It performs the following steps when called:
The abstract operation GetMatchString takes arguments str (a String) and match (a Match Record) and returns a String. It performs the following steps when called:
str의 match.[[StartIndex]]부터 match.[[EndIndex]]까지의 부분 문자열을 반환한다.
22.2.7.7 GetMatchIndexPair ( str, match )
The abstract operation GetMatchIndexPair takes arguments str (a String) and match (a Match Record) and returns an Array. It performs the following steps when called:
The abstract operation MakeMatchIndicesIndexPairArray takes arguments str (a String), indices (a List of either Match Records or undefined), groupNames (a List of either Strings or undefined), and hasGroups (a Boolean) and returns an Array. It performs the following steps when called:
NOTE: name이라는 이름의 그룹이 여러 개 있으면, 이 시점에서 groups는 이미 name 속성을 가질 수 있다. 그러나 groups는 모든 속성이 쓰기 가능한 데이터 속성인 보통 객체이므로, CreateDataPropertyOrThrow 호출은 그럼에도 성공하는 것이 보장된다.
RegExp 인스턴스는 RegExp 프로토타입 객체로부터 속성을 상속하는 보통 객체이다. RegExp 인스턴스는 [[OriginalSource]], [[OriginalFlags]], [[RegExpRecord]], 및 [[RegExpMatcher]] 내부 슬롯을 가진다. [[RegExpMatcher]] 내부 슬롯의 값은 RegExp 객체의 Pattern에 대한 Abstract Closure 표현이다.
Note
ECMAScript 2015 이전에는 RegExp 인스턴스가 자기 자신의 데이터 속성 "source", "global", "ignoreCase", 및 "multiline"을 가지는 것으로 지정되었다. 이제 그 속성들은 RegExp.prototype의 접근자 속성으로 지정된다.
RegExp 인스턴스는 또한 다음 속성을 가진다:
22.2.8.1 lastIndex
"lastIndex" 속성의 값은 다음 매치를 시작할 String 인덱스를 지정한다. 이 값은 사용될 때 정수 Number로 강제 변환된다(22.2.7.2를 보라). 이 속성은 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } 속성 특성을 가져야 한다.
22.2.9 RegExp String Iterator 객체
RegExp String Iterator는 어떤 특정 String 인스턴스 객체에 대한 특정 반복을, 어떤 특정 RegExp 인스턴스 객체에 대해 매치하면서 나타내는 객체이다. RegExp String Iterator 객체에는 이름 있는 생성자가 없다. 대신, RegExp String Iterator 객체는 RegExp 인스턴스 객체의 특정 메서드를 호출하여 생성된다.
The abstract operation CreateRegExpStringIterator takes arguments regexp (an Object), str (a String), global (a Boolean), and fullUnicode (a Boolean) and returns an Object. It performs the following steps when called:
생성자가 아니라 함수로 호출될 때도 새로운 Array를 생성하고 초기화한다. 따라서 함수 호출 Array(…)는 같은 인자를 가진 객체 생성 표현식 new Array(…)와 동등하다.
인자의 개수와 타입에 따라 동작이 달라지는 함수이다.
클래스 정의의 extends 절의 값으로 사용될 수 있다. 특수 Array 동작을 상속하려는 서브클래스 생성자는 Array 특수 객체인 서브클래스 인스턴스를 초기화하기 위해 Array 생성자에 대한 super 호출을 포함해야 한다. 그러나 대부분의 Array.prototype 메서드는 자신의 this 값이 Array 특수 객체인지에 의존하지 않는 제네릭 메서드이다.
23.1.1.1 Array ( ...values )
이 함수는 호출될 때 다음 단계를 수행한다:
NewTarget이 undefined이면, newTarget을 활성 함수 객체라고 하자; 그렇지 않으면 newTarget을 NewTarget이라고 하자.
단계 6에서 "length" 속성을 명시적으로 설정하는 것은, items의 마지막 비어 있지 않은 요소에 뒤따르는 빈 슬롯이 있거나 array가 내장 Array가 아닐 때 길이가 올바르도록 보장하기 위한 것이다.
Note 2
이 메서드는 의도적으로 제네릭이다; 이 메서드는 자신의 this 값이 Array일 것을 요구하지 않는다. 따라서 메서드로 사용하기 위해 다른 종류의 객체로 이전될 수 있다.
23.1.3.2.1 IsConcatSpreadable ( obj )
The abstract operation IsConcatSpreadable takes argument obj (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:
callback은 세 개의 인자를 받아 Boolean 값으로 강제 변환될 수 있는 값을 반환하는 함수여야 한다. every는 callback이 false를 반환하는 요소를 찾을 때까지 배열에 존재하는 각 요소에 대해 오름차순으로 한 번씩 callback을 호출한다. 그러한 요소를 찾으면, every는 즉시 false를 반환한다. 그렇지 않으면, every는 true를 반환한다. callback은 실제로 존재하는 배열 요소에 대해서만 호출되며, 배열의 누락된 요소에 대해서는 호출되지 않는다.
thisArg 매개변수가 제공되면, callback의 각 호출에서 this 값으로 사용된다. 제공되지 않으면, 대신 undefined가 사용된다.
callback은 세 개의 인자, 즉 요소의 값, 요소의 인덱스, 그리고 순회 중인 객체와 함께 호출된다.
every는 호출 대상 객체를 직접 변경하지 않지만, callback 호출에 의해 객체가 변경될 수 있다.
every가 처리하는 요소의 범위는 callback의 첫 호출 전에 설정된다. every 호출이 시작된 뒤 배열에 추가되는 요소는 callback이 방문하지 않는다. 배열의 기존 요소가 변경되면, callback에 전달되는 값은 every가 해당 요소를 방문하는 시점의 값이 된다; every 호출이 시작된 뒤 방문되기 전에 삭제되는 요소는 방문되지 않는다. every는 수학의 "for all" 한정자처럼 동작한다. 특히 빈 배열에 대해서는 true를 반환한다.
callback은 세 개의 인자를 받아 Boolean 값으로 강제 변환될 수 있는 값을 반환하는 함수여야 한다. filter는 배열의 각 요소에 대해 오름차순으로 한 번씩 callback을 호출하고, callback이 true를 반환하는 모든 값으로 새 배열을 구성한다. callback은 실제로 존재하는 배열 요소에 대해서만 호출되며, 배열의 누락된 요소에 대해서는 호출되지 않는다.
thisArg 매개변수가 제공되면, callback의 각 호출에서 this 값으로 사용된다. 제공되지 않으면, 대신 undefined가 사용된다.
callback은 세 개의 인자, 즉 요소의 값, 요소의 인덱스, 그리고 순회 중인 객체와 함께 호출된다.
filter는 호출 대상 객체를 직접 변경하지 않지만, callback 호출에 의해 객체가 변경될 수 있다.
filter가 처리하는 요소의 범위는 callback의 첫 호출 전에 설정된다. filter 호출이 시작된 뒤 배열에 추가되는 요소는 callback이 방문하지 않는다. 배열의 기존 요소가 변경되면 callback에 전달되는 값은 filter가 해당 요소를 방문하는 시점의 값이 된다; filter 호출이 시작된 뒤 방문되기 전에 삭제되는 요소는 방문되지 않는다.
이 메서드는 predicate가 true로 강제 변환되는 값을 반환하는 요소를 찾을 때까지 배열의 각 요소에 대해 오름차순 인덱스 순서로 한 번씩 predicate를 호출한다. 그러한 요소를 찾으면, find는 즉시 그 요소 값을 반환한다. 그렇지 않으면, find는 undefined를 반환한다.
이 메서드는 predicate가 true로 강제 변환되는 값을 반환하는 요소를 찾을 때까지 배열의 각 요소에 대해 오름차순 인덱스 순서로 한 번씩 predicate를 호출한다. 그러한 요소를 찾으면, findIndex는 즉시 그 요소 값의 인덱스를 반환한다. 그렇지 않으면, findIndex는 -1을 반환한다.
이 메서드는 predicate가 true로 강제 변환되는 값을 반환하는 요소를 찾을 때까지 배열의 각 요소에 대해 내림차순 인덱스 순서로 한 번씩 predicate를 호출한다. 그러한 요소를 찾으면, findLast는 즉시 그 요소 값을 반환한다. 그렇지 않으면, findLast는 undefined를 반환한다.
이 메서드는 predicate가 true로 강제 변환되는 값을 반환하는 요소를 찾을 때까지 배열의 각 요소에 대해 내림차순 인덱스 순서로 한 번씩 predicate를 호출한다. 그러한 요소를 찾으면, findLastIndex는 즉시 그 요소 값의 인덱스를 반환한다. 그렇지 않으면, findLastIndex는 -1을 반환한다.
The abstract operation FindViaPredicate takes arguments obj (an Object), len (a non-negative integer), direction (ascending or descending), predicate (an ECMAScript language value), and thisArg (an ECMAScript language value) and returns either a normal completion containing a Record with fields [[Index]] (an integral Number) and [[Value]] (an ECMAScript language value) or a throw completion.
obj는 배열 유사 객체 또는 TypedArray여야 한다. 이 연산은 direction이 나타내는 대로 오름차순 인덱스 순서 또는 내림차순 인덱스 순서로 obj의 각 요소에 대해 한 번씩 predicate를 호출하며, predicate가 true로 강제 변환되는 값을 반환하는 요소를 찾을 때까지 계속한다. 그 시점에서 이 연산은 찾은 요소의 인덱스와 값을 제공하는 Record를 반환한다. 그러한 요소를 찾지 못하면, 이 연산은 인덱스로 -1𝔽, 값으로 undefined를 지정하는 Record를 반환한다.
predicate는 함수여야 한다. 배열의 요소에 대해 호출될 때, 요소의 값, 요소의 인덱스, 그리고 순회 중인 객체라는 세 인자가 전달된다. 그 반환값은 Boolean 값으로 강제 변환된다.
thisArg는 predicate의 각 호출에서 this 값으로 사용된다.
이 연산은 호출 대상 객체를 직접 변경하지 않지만, predicate 호출에 의해 객체가 변경될 수 있다.
처리되는 요소의 범위는 predicate의 첫 호출 전, 순회가 시작되기 직전에 설정된다. 이후 배열에 추가되는 요소는 predicate가 방문하지 않는다. 배열의 기존 요소가 변경되면, predicate에 전달되는 값은 이 연산이 해당 요소를 방문하는 시점의 값이 된다. 순회가 시작된 뒤 방문되기 전에 삭제되는 요소는 여전히 방문되며, 프로토타입에서 조회되거나 undefined가 된다.
The abstract operation FlattenIntoArray takes arguments target (an Object), source (an Object), sourceLen (a non-negative integer), start (a non-negative integer), and depth (a non-negative integer or +∞) and optional arguments mapperFunction (a function object) and thisArg (an ECMAScript language value) and returns either a normal completion containing a non-negative integer or a throw completion. It performs the following steps when called:
Assert: mapperFunction이 존재하면, IsCallable(mapperFunction)는 true이고, thisArg가 존재하며, depth는 1이다.
callback은 세 개의 인자를 받는 함수여야 한다. forEach는 배열에 존재하는 각 요소에 대해 오름차순으로 한 번씩 callback을 호출한다. callback은 실제로 존재하는 배열 요소에 대해서만 호출되며, 배열의 누락된 요소에 대해서는 호출되지 않는다.
thisArg 매개변수가 제공되면, callback의 각 호출에서 this 값으로 사용된다. 제공되지 않으면, 대신 undefined가 사용된다.
callback은 세 개의 인자, 즉 요소의 값, 요소의 인덱스, 그리고 순회 중인 객체와 함께 호출된다.
forEach는 호출 대상 객체를 직접 변경하지 않지만, callback 호출에 의해 객체가 변경될 수 있다.
forEach가 처리하는 요소의 범위는 callback의 첫 호출 전에 설정된다. forEach 호출이 시작된 뒤 배열에 추가되는 요소는 callback이 방문하지 않는다. 배열의 기존 요소가 변경되면, callback에 전달되는 값은 forEach가 해당 요소를 방문하는 시점의 값이 된다; forEach 호출이 시작된 뒤 방문되기 전에 삭제되는 요소는 방문되지 않는다.
이 메서드는 SameValueZero 알고리즘을 사용해 searchElement를 배열의 요소들과 오름차순으로 비교하고, 어느 위치에서든 발견되면 true를 반환한다; 그렇지 않으면 false를 반환한다.
선택적 두 번째 인자 fromIndex의 기본값은 +0𝔽이다(즉, 전체 배열을 검색한다). 이 값이 배열의 길이보다 크거나 같으면, false가 반환된다. 즉 배열을 검색하지 않는다. -0𝔽보다 작으면, fromIndex를 계산하기 위해 배열 끝으로부터의 오프셋으로 사용된다. 계산된 인덱스가 +0𝔽 이하이면, 전체 배열을 검색한다.
이 메서드는 의도적으로 제네릭이다; 이 메서드는 자신의 this 값이 Array일 것을 요구하지 않는다. 따라서 메서드로 사용하기 위해 다른 종류의 객체로 이전될 수 있다.
Note 3
이 메서드는 유사한 indexOf 메서드와 의도적으로 두 가지 점에서 다르다. 첫째, IsStrictlyEqual 대신 SameValueZero 알고리즘을 사용하므로 NaN 배열 요소를 감지할 수 있다. 둘째, 누락된 배열 요소를 건너뛰지 않고 undefined로 취급한다.
이 메서드는 IsStrictlyEqual 알고리즘을 사용해 searchElement를 배열의 요소들과 오름차순으로 비교하고, 하나 이상의 인덱스에서 발견되면 그러한 가장 작은 인덱스를 반환한다; 그렇지 않으면 -1𝔽을 반환한다.
Note 1
선택적 두 번째 인자 fromIndex의 기본값은 +0𝔽이다(즉, 전체 배열을 검색한다). 이 값이 배열의 길이보다 크거나 같으면, -1𝔽이 반환된다. 즉 배열을 검색하지 않는다. -0𝔽보다 작으면, 배열 끝으로부터의 오프셋을 계산하는 데 사용된다. 계산된 인덱스가 +0𝔽 이하이면, 전체 배열을 검색한다.
이 메서드는 IsStrictlyEqual 알고리즘을 사용해 searchElement를 배열의 요소들과 내림차순으로 비교하고, 하나 이상의 인덱스에서 발견되면 그러한 가장 큰 인덱스를 반환한다; 그렇지 않으면 -1𝔽을 반환한다.
선택적 두 번째 인자 fromIndex의 기본값은 배열의 길이에서 1을 뺀 값이다(즉, 전체 배열을 검색한다). 이 값이 배열의 길이보다 크거나 같으면, 전체 배열을 검색한다. -0𝔽보다 작으면, 배열 끝으로부터의 오프셋을 계산하는 데 사용된다. 계산된 인덱스가 -0𝔽보다 작으면, -1𝔽이 반환된다.
callback은 세 개의 인자를 받는 함수여야 한다. map은 배열의 각 요소에 대해 오름차순으로 한 번씩 callback을 호출하고, 그 결과로 새 Array를 구성한다. callback은 실제로 존재하는 배열 요소에 대해서만 호출되며, 배열의 누락된 요소에 대해서는 호출되지 않는다.
thisArg 매개변수가 제공되면, callback의 각 호출에서 this 값으로 사용된다. 제공되지 않으면, 대신 undefined가 사용된다.
callback은 세 개의 인자, 즉 요소의 값, 요소의 인덱스, 그리고 순회 중인 객체와 함께 호출된다.
map은 호출 대상 객체를 직접 변경하지 않지만, callback 호출에 의해 객체가 변경될 수 있다.
map이 처리하는 요소의 범위는 callback의 첫 호출 전에 설정된다. map 호출이 시작된 뒤 배열에 추가되는 요소는 callback이 방문하지 않는다. 배열의 기존 요소가 변경되면, callback에 전달되는 값은 map이 해당 요소를 방문하는 시점의 값이 된다; map 호출이 시작된 뒤 방문되기 전에 삭제되는 요소는 방문되지 않는다.
callback은 네 개의 인수를 받는 함수여야 한다. reduce는 initialValue가 제공되지 않는 한 첫 번째 요소를 건너뛰고, 배열에 존재하는 각 요소에 대해 오름차순으로 callback을 한 번씩 호출한다.
callback은 네 개의 인자, 즉 previousValue(callback의 이전 호출에서 온 값), currentValue(현재 요소의 값), currentIndex, 그리고 순회 중인 객체와 함께 호출된다. callback이 처음 호출될 때, previousValue와 currentValue는 두 값 중 하나일 수 있다. reduce 호출에서 initialValue가 제공되었다면, previousValue는 initialValue가 되고 currentValue는 배열의 첫 번째 값이 된다. initialValue가 제공되지 않았다면, previousValue는 배열의 첫 번째 값이 되고 currentValue는 두 번째 값이 된다. 배열이 요소를 포함하지 않고 initialValue가 제공되지 않으면 TypeError이다.
reduce는 호출 대상 객체를 직접 변경하지 않지만, callback 호출에 의해 객체가 변경될 수 있다.
reduce가 처리하는 요소의 범위는 callback의 첫 호출 전에 설정된다. reduce 호출이 시작된 뒤 배열에 추가되는 요소는 callback이 방문하지 않는다. 배열의 기존 요소가 변경되면, callback에 전달되는 값은 reduce가 해당 요소를 방문하는 시점의 값이 된다; reduce 호출이 시작된 뒤 방문되기 전에 삭제되는 요소는 방문되지 않는다.
callback은 네 개의 인수를 받는 함수여야 한다. reduceRight는 initialValue가 제공되지 않는 한 첫 번째 호출을 건너뛰고, 배열에 존재하는 각 요소에 대해 내림차순으로 callback을 한 번씩 호출한다.
callback은 네 개의 인자, 즉 previousValue(callback의 이전 호출에서 온 값), currentValue(현재 요소의 값), currentIndex, 그리고 순회 중인 객체와 함께 호출된다. 함수가 처음 호출될 때, previousValue와 currentValue는 두 값 중 하나일 수 있다. reduceRight 호출에서 initialValue가 제공되었다면, previousValue는 initialValue가 되고 currentValue는 배열의 마지막 값이 된다. initialValue가 제공되지 않았다면, previousValue는 배열의 마지막 값이 되고 currentValue는 끝에서 두 번째 값이 된다. 배열이 요소를 포함하지 않고 initialValue가 제공되지 않으면 TypeError이다.
reduceRight는 호출 대상 객체를 직접 변경하지 않지만, callback 호출에 의해 객체가 변경될 수 있다.
reduceRight가 처리하는 요소의 범위는 callback의 첫 호출 전에 설정된다. reduceRight 호출이 시작된 뒤 배열에 추가되는 요소는 callback이 방문하지 않는다. 배열의 기존 요소가 callback에 의해 변경되면, callback에 전달되는 값은 reduceRight가 해당 요소를 방문하는 시점의 값이 된다; reduceRight 호출이 시작된 뒤 방문되기 전에 삭제되는 요소는 방문되지 않는다.
이 메서드는 의도적으로 제네릭이다; 이 메서드는 자신의 this 값이 Array일 것을 요구하지 않는다. 따라서 메서드로 사용하기 위해 다른 종류의 객체로 이전될 수 있다.
23.1.3.28 Array.prototype.slice ( start, end )
이 메서드는 배열의 요소 start부터 요소 end 전까지(end가 undefined이면 배열의 끝까지)의 요소들을 포함하는 배열을 반환한다. start가 음수이면, 배열의 길이인 length에 대해 length + start로 취급된다. end가 음수이면, 배열의 길이인 length에 대해 length + end로 취급된다.
callback은 세 개의 인자를 받아 Boolean 값으로 강제 변환될 수 있는 값을 반환하는 함수여야 한다. some은 callback이 true를 반환하는 요소를 찾을 때까지 배열에 존재하는 각 요소에 대해 오름차순으로 한 번씩 callback을 호출한다. 그러한 요소를 찾으면, some은 즉시 true를 반환한다. 그렇지 않으면, some은 false를 반환한다. callback은 실제로 존재하는 배열 요소에 대해서만 호출되며, 배열의 누락된 요소에 대해서는 호출되지 않는다.
thisArg 매개변수가 제공되면, callback의 각 호출에서 this 값으로 사용된다. 제공되지 않으면, 대신 undefined가 사용된다.
callback은 세 개의 인자, 즉 요소의 값, 요소의 인덱스, 그리고 순회 중인 객체와 함께 호출된다.
some은 호출 대상 객체를 직접 변경하지 않지만, callback 호출에 의해 객체가 변경될 수 있다.
some이 처리하는 요소의 범위는 callback의 첫 호출 전에 설정된다. some 호출이 시작된 뒤 배열에 추가되는 요소는 callback이 방문하지 않는다. 배열의 기존 요소가 변경되면, callback에 전달되는 값은 some이 해당 요소를 방문하는 시점의 값이 된다; some 호출이 시작된 뒤 방문되기 전에 삭제되는 요소는 방문되지 않는다. some은 수학의 "exists" 한정자처럼 동작한다. 특히 빈 배열에 대해서는 false를 반환한다.
존재하지 않는 속성 값은 항상 undefined 속성 값보다 크게 비교되고, undefined는 항상 다른 어떤 값보다도 크게 비교되므로(CompareArrayElements를 보라), undefined 속성 값은 항상 결과의 끝으로 정렬되고, 그 뒤에 존재하지 않는 속성 값이 온다.
The abstract operation SortIndexedProperties takes arguments obj (an Object), len (a non-negative integer), sortCompare (an Abstract Closure with two parameters), and holes (skip-holes or read-through-holes) and returns either a normal completion containing a List of ECMAScript language values or a throw completion. It performs the following steps when called:
itemCount보다 작은 음이 아닌 정수들의 어떤 수학적 순열 π가 존재하여, itemCount보다 작은 모든 음이 아닌 정수j에 대해 요소 old[j]가 new[π(j)]와 정확히 같아야 한다.
그러면 itemCount보다 각각 작은 모든 음이 아닌 정수j와 k에 대해, ℝ(sortCompare(old[j], old[k])) < 0이면 π(j) < π(k)이다.
그리고 j < k < itemCount인 모든 음이 아닌 정수j와 k에 대해, ℝ(sortCompare(old[j], old[k])) = 0이면 π(j) < π(k)이다; 즉 정렬은 안정적이다.
여기서 표기 old[j]는 단계 4가 실행되기 전의 items[j]를 가리키기 위해 사용되고, 표기 new[j]는 단계 4가 실행된 후의 items[j]를 가리키기 위해 사용된다.
Abstract Closure 또는 함수 comparator는 값들의 집합 values에 대해 다음 요구사항이 그 집합 values 안의 모든 값 a, b, 및 c(같은 값일 수도 있음)에 대해 충족되면 일관된 비교자이다: 표기 a <Cb는 ℝ(comparator(a, b)) < 0을 의미하고; a =Cb는 ℝ(comparator(a, b)) = 0을 의미하며; a >Cb는 ℝ(comparator(a, b)) > 0을 의미한다.
comparator(a, b)를 호출하면 특정 값 쌍 a와 b를 두 인자로 받았을 때 항상 같은 값 v를 반환한다. 또한 v는 Number이고, v는 NaN이 아니다. 이는 주어진 a와 b 쌍에 대해 a <Cb, a =Cb, a >Cb 중 정확히 하나가 참임을 함의한다.
comparator(a, b)를 호출해도 obj나 obj의 프로토타입 체인상의 어떤 객체도 변경하지 않는다.
a =Ca (반사성)
a =Cb이면, b =Ca (대칭성)
a =Cb이고 b =Cc이면, a =Cc (=C의 추이성)
a <Cb이고 b <Cc이면, a <Cc (<C의 추이성)
a >Cb이고 b >Cc이면, a >Cc (>C의 추이성)
Note
위 조건들은 comparator가 집합 values를 동치류로 나누고 그 동치류들이 전순서화됨을 보장하기 위한 필요충분조건이다.
23.1.3.30.2 CompareArrayElements ( x, y, comparator )
The abstract operation CompareArrayElements takes arguments x (an ECMAScript language value), y (an ECMAScript language value), and comparator (a function object or undefined) and returns either a normal completion containing a Number or an abrupt completion. It performs the following steps when called:
x가 undefined이고 y가 undefined이면, +0𝔽을 반환한다.
x가 undefined이면, 1𝔽을 반환한다.
y가 undefined이면, -1𝔽을 반환한다.
comparator가 undefined가 아니면,
result를 ? ToNumber(? Call(comparator, undefined, « x, y »))라고 하자.
elementStr을 ? ToString(? Invoke(element, "toLocaleString"))라고 하자.
result를 result와 elementStr의 문자열 연결로 설정한다.
k를 k + 1로 설정한다.
result를 반환한다.
Note 2
이 메서드는 배열의 요소들을 그들의 toLocaleString 메서드를 사용해 String으로 변환한 뒤, 구현 정의 로캘 민감 구분자 String의 출현으로 구분하여 이 String들을 연결한다. 이 메서드는 toString과 유사하지만, 호스트 환경의 현재 로캘 관례에 대응하는 로캘 민감 결과를 산출하도록 의도되어 있다는 점이 다르다.
Note 3
이 메서드는 의도적으로 제네릭이다; 이 메서드는 자신의 this 값이 Array일 것을 요구하지 않는다. 따라서 메서드로 사용하기 위해 다른 종류의 객체로 이전될 수 있다.
이 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성 특성을 가진다.
Note
이 객체의 자기 자신의 속성 이름들은 ECMAScript 2015 명세 이전에는 Array.prototype의 표준 속성으로 포함되지 않았던 속성 이름들이다. 이러한 이름들은, 이 이름들 중 하나를 외부 스코프의 바인딩으로 사용하고 그 바인딩이 바인딩 객체가 Array인 with 문에 의해 가려질 수 있는 기존 코드의 동작을 보존하기 위해, with 문 바인딩 목적상 무시된다.
"with"가 unscopableList에 포함되지 않는 이유는 이미 reserved word이기 때문이다.
23.1.4 Array 인스턴스의 속성
Array 인스턴스는 Array 특수 객체이며 그러한 객체에 대해 지정된 내부 메서드를 가진다. Array 인스턴스는 Array 프로토타입 객체로부터 속성을 상속한다.
Array 인스턴스는 "length" 속성과, 배열 인덱스 이름을 가진 열거 가능한 속성들의 집합을 가진다.
23.1.4.1 length
Array 인스턴스의 "length" 속성은 그 값이 배열 인덱스인 이름을 가진 모든 configurable 자기 자신의 속성 이름보다 항상 수치적으로 큰 데이터 속성이다.
"length" 속성은 처음에 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } 속성 특성을 가진다.
Note
"length" 속성의 값을 줄이면, 배열 인덱스가 이전 길이 값과 새 길이 값 사이에 있는 자기 자신의 배열 요소가 삭제되는 부수 효과가 있다. 그러나 non-configurable 속성은 삭제될 수 없다. Array의 "length" 속성을 배열의 기존 non-configurable array-indexed 속성 중 가장 큰 수치 자기 자신의 속성 이름보다 작거나 같은 수치 값으로 설정하려고 하면, 길이는 그 non-configurable 수치 자기 자신의 속성 이름보다 1 큰 수치 값으로 설정된다. 10.4.2.1를 보라.
23.1.5 Array Iterator 객체
Array Iterator는 어떤 특정 Array 인스턴스 객체에 대한 특정 반복을 나타내는 객체이다. Array Iterator 객체에는 이름 있는 생성자가 없다. 대신, Array Iterator 객체는 Array 인스턴스 객체의 특정 메서드를 호출하여 생성된다.
23.1.5.1 CreateArrayIterator ( array, kind )
The abstract operation CreateArrayIterator takes arguments array (an Object) and kind (key+value, key, or value) and returns an Object. 이 연산은 그러한 반복자를 반환하는 Array 메서드를 위한 반복자 객체를 생성하는 데 사용된다. It performs the following steps when called:
TypedArray는 기반 바이너리 데이터 버퍼(25.1)의 배열 유사 뷰를 제공한다. TypedArray 요소 타입은 TypedArray 인스턴스의 모든 요소가 가지는 기반 바이너리 스칼라 데이터 타입이다. 지원되는 각 요소 타입마다 Table 70에 나열된 서로 다른 TypedArray 생성자가 있다. Table 70의 각 생성자는 대응하는 서로 다른 프로토타입 객체를 가진다.
The abstract operation SetTypedArrayFromArrayLike takes arguments target (a TypedArray), targetOffset (a non-negative integer or +∞), and source (an ECMAScript language value, but not a TypedArray) and returns either a normal completion containing unused or a throw completion. 이 연산은 source에서 값을 읽어 targetOffset 인덱스부터 시작하여 target 안에 여러 값을 설정한다. It performs the following steps when called:
The abstract operation SetTypedArrayFromTypedArray takes arguments target (a TypedArray), targetOffset (a non-negative integer or +∞), and source (a TypedArray) and returns either a normal completion containing unused or a throw completion. 이 연산은 source에서 값을 읽어 targetOffset 인덱스부터 시작하여 target 안에 여러 값을 설정한다. It performs the following steps when called:
IsSharedArrayBuffer(srcBuffer)가 true이고, IsSharedArrayBuffer(targetBuffer)가 true이고, srcBuffer.[[ArrayBufferData]]가 targetBuffer.[[ArrayBufferData]]이면 sameSharedArrayBuffer를 true라고 하자; 그렇지 않으면 sameSharedArrayBuffer를 false라고 하자.
이는 아래에 설명된 점을 제외하고 23.1.3.30에 정의된 Array.prototype.sort의 요구사항과 같은 요구사항을 구현하는 별개의 메서드이다. 이 메서드의 구현은 this 값이 고정 길이를 가지며 정수 인덱스 속성이 희소하지 않은 객체라는 지식을 사용해 최적화될 수 있다.
이 메서드는 제네릭이 아니다. this 값은 [[TypedArrayName]] 내부 슬롯을 가진 객체여야 한다.
호출될 때 다음 단계를 수행한다:
comparator가 undefined가 아니고 IsCallable(comparator)가 false이면, TypeError 예외를 던진다.
sortedList를 ? SortIndexedProperties(obj, len, sortCompare, read-through-holes)라고 하자.
j를 0이라고 하자.
j < len인 동안 반복한다,
! Set(obj, ! ToString(𝔽(j)), sortedList[j], true)를 수행한다.
j를 j + 1로 설정한다.
obj를 반환한다.
Note
NaN은 항상 다른 어떤 값보다도 크게 비교되므로(CompareTypedArrayElements를 보라), comparator가 제공되지 않으면 NaN 속성 값은 항상 결과의 끝으로 정렬된다.
23.2.3.30 %TypedArray%.prototype.subarray ( start, end )
이 메서드는 요소 타입이 이 TypedArray의 요소 타입이고 ArrayBuffer가 이 TypedArray의 ArrayBuffer이며, start(포함)부터 end(제외)까지의 구간에 있는 요소들을 참조하는 새로운 TypedArray를 반환한다. start 또는 end 중 하나가 음수이면, 처음부터가 아니라 배열의 끝으로부터의 인덱스를 가리킨다.
이는 23.1.3.32에 정의된 Array.prototype.toLocaleString과 같은 알고리즘을 구현하는 별개의 메서드이지만, "length"의 [[Get]]을 수행하는 대신 TypedArrayLength가 호출된다는 점이 다르다. 이 알고리즘의 구현은 기반 버퍼가 크기 조절 가능하지 않을 때 this 값이 고정 길이를 가지며 정수 인덱스 속성이 희소하지 않다는 지식을 사용해 최적화될 수 있다. 그러나 그러한 최적화는 알고리즘의 지정된 동작에 관찰 가능한 변경을 도입해서는 안 된다.
The abstract operation ValidateTypedArray takes arguments obj (an ECMAScript language value) and order (seq-cst or unordered) and returns either a normal completion containing a TypedArray With Buffer Witness Record or a throw completion. It performs the following steps when called:
The abstract operation TypedArrayElementSize takes argument obj (a TypedArray) and returns a non-negative integer. It performs the following steps when called:
obj.[[TypedArrayName]]에 대해 Table 70에 지정된 Element Size 값을 반환한다.
23.2.4.6 TypedArrayElementType ( obj )
The abstract operation TypedArrayElementType takes argument obj (a TypedArray) and returns a TypedArray element type. It performs the following steps when called:
obj.[[TypedArrayName]]에 대해 Table 70에 지정된 Element Type 값을 반환한다.
23.2.4.7 CompareTypedArrayElements ( x, y, comparator )
The abstract operation CompareTypedArrayElements takes arguments x (a Number or a BigInt), y (a Number or a BigInt), and comparator (a function object or undefined) and returns either a normal completion containing a Number or an abrupt completion. It performs the following steps when called:
달리 명시된 경우를 제외하고, Table 70에서 TypedArray 대신 생성자 이름으로 사용되는 이름만 다를 뿐 아래에 설명된 구조를 가지는 내재 객체이다.
인자의 개수와 타입에 따라 동작이 달라지는 함수이다. TypedArray 호출의 실제 동작은 전달된 인자의 개수와 종류에 의존한다.
함수로 호출되도록 의도되지 않았으며, 그런 방식으로 호출되면 예외를 던진다.
클래스 정의의 extends 절의 값으로 사용될 수 있다. 지정된 TypedArray 동작을 상속하려는 서브클래스 생성자는 %TypedArray%.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성하고 초기화하기 위해 TypedArray 생성자에 대한 super 호출을 포함해야 한다.
23.2.5.1TypedArray ( ...args )
각 TypedArray 생성자는 호출될 때 다음 단계를 수행한다:
NewTarget이 undefined이면, TypeError 예외를 던진다.
constructorName을 이 TypedArray 생성자에 대해 Table 70에 지정된 Constructor Name 값의 String 값이라고 하자.
proto를 "%TypedArray.prototype%"라고 하자.
numberOfArgs를 args의 요소 개수라고 하자.
numberOfArgs = 0이면, ? AllocateTypedArray(constructorName, NewTarget, proto, 0)를 반환한다.
The abstract operation AllocateTypedArray takes arguments constructorName (a String which is the name of a TypedArrayconstructor in Table 70), newTarget (a constructor), and defaultProto (a String) and optional argument length (a non-negative integer) and returns either a normal completion containing a TypedArray or a throw completion. TypedArray 생성자의 인스턴스를 검증하고 생성하는 데 사용된다. length 인자가 전달되면, 그 길이의 ArrayBuffer도 할당되어 새 TypedArray 인스턴스와 연결된다. AllocateTypedArray는 TypedArray가 사용하는 공통 의미론을 제공한다. It performs the following steps when called:
The abstract operation InitializeTypedArrayFromTypedArray takes arguments obj (a TypedArray) and srcArray (a TypedArray) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:
The abstract operation InitializeTypedArrayFromArrayBuffer takes arguments obj (a TypedArray), buffer (an ArrayBuffer or a SharedArrayBuffer), byteOffset (an ECMAScript language value), and length (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:
The abstract operation InitializeTypedArrayFromArrayLike takes arguments obj (a TypedArray) and arrayLike (an Object, but not a TypedArray or an ArrayBuffer) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:
The abstract operation AllocateTypedArrayBuffer takes arguments obj (a TypedArray) and length (a non-negative integer) and returns either a normal completion containing unused or a throw completion. obj에 ArrayBuffer를 할당하고 연결한다. It performs the following steps when called:
[[ViewedArrayBuffer]]나 TypedArray 인스턴스 객체에 특유한 다른 어떤 내부 슬롯도 가지지 않는다.
23.2.7.1TypedArray.prototype.BYTES_PER_ELEMENT
TypedArray.prototype.BYTES_PER_ELEMENT의 값은 TypedArray에 대해 Table 70에 지정된 Element Size 값이다.
이 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 속성 특성을 가진다.
23.2.7.2TypedArray.prototype.constructor
주어진 TypedArray 생성자의 프로토타입의 "constructor" 속성의 초기값은 생성자 자체이다.
23.2.8TypedArray 인스턴스의 속성
TypedArray 인스턴스는 TypedArray이다. 각 TypedArray 인스턴스는 대응하는 TypedArray 프로토타입 객체로부터 속성을 상속한다. 각 TypedArray 인스턴스는 다음 내부 슬롯을 가진다: [[ViewedArrayBuffer]], [[TypedArrayName]], [[ContentType]], [[ByteLength]], [[ByteOffset]], 및 [[ArrayLength]].
23.3 Uint8Array 객체
Uint8Array는 위에 설명된 TypedArray의 특정 종류이다. 또한 Uint8Array 생성자(23.3.1)와 Uint8Array 프로토타입 객체(23.3.2)에는 추가 메서드가 있다.
The abstract operation ValidateUint8Array takes argument ta (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:
The abstract operation GetUint8ArrayBytes takes argument ta (a Uint8Array) and returns either a normal completion containing a List of byte values or a throw completion. It performs the following steps when called:
byte를 ℝ(GetValueFromBuffer(buffer, byteIndex, uint8, true, unordered))라고 하자.
byte를 bytes에 추가한다.
index를 index + 1로 설정한다.
bytes를 반환한다.
23.3.3.3 SetUint8ArrayBytes ( into, bytes )
The abstract operation SetUint8ArrayBytes takes arguments into (a Uint8Array) and bytes (a List of byte values) and returns unused. It performs the following steps when called:
offset을 into.[[ByteOffset]]이라고 하자.
len을 bytes의 요소 개수라고 하자.
index를 0이라고 하자.
index < len인 동안 반복한다,
byte를 bytes[index]라고 하자.
byteIndexInBuffer를 index + offset이라고 하자.
SetValueInBuffer(into.[[ViewedArrayBuffer]], byteIndexInBuffer, uint8, 𝔽(byte), true, unordered)를 수행한다.
index를 index + 1로 설정한다.
unused를 반환한다.
23.3.3.4 SkipAsciiWhitespace ( string, index )
The abstract operation SkipAsciiWhitespace takes arguments string (a String) and index (a non-negative integer) and returns a non-negative integer. It performs the following steps when called:
length를 string의 길이라고 하자.
index < length인 동안 반복한다,
char를 string 안의 인덱스 index에 있는 코드 단위라고 하자.
char가 0x0009 (TAB), 0x000A (LF), 0x000C (FF), 0x000D (CR), 또는 0x0020 (SPACE) 중 하나가 아니면,
The abstract operation DecodeFinalBase64Chunk takes arguments chunk (a String of length 2 or 3) and throwOnExtraBits (a Boolean) and returns either a normal completion containing a List of byte values, or a throw completion. It performs the following steps when called:
The abstract operation DecodeFullLengthBase64Chunk takes argument chunk (a String of length 4) and returns a List of byte values of length 3.
표준 base64 알파벳은 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"이다. 즉 Unicode Basic Latin 블록의 모든 문자와 숫자에 대응하는 코드 단위들과 "+" 및 "/"를 요소로 가지는 String이다.
byteSequence를 chunk를 base64로 디코딩한 결과인 고유한 3바이트 시퀀스라고 하자(즉, RFC 4648의 4절에 지정된 base64 인코딩을 byteSequence에 적용하면 chunk가 생성되는 그러한 시퀀스).
The abstract operation FromBase64 takes arguments string (a String), alphabet ("base64" or "base64url"), and lastChunkHandling ("loose", "strict", or "stop-before-partial") and optional argument maxLength (a non-negative integer) and returns a Record with fields [[Read]] (an integer), [[Bytes]] (a List of byte values), and [[Error]] (a SyntaxError object or none). It performs the following steps when called:
maxLength가 존재하지 않으면,
maxLength를 253 - 1로 설정한다.
NOTE: 입력이 String이므로, String의 길이는 253 - 1 문자로 제한되고, 출력은 입력이 가진 문자 수보다 많은 바이트를 요구하지 않으므로, 이 한계에는 결코 도달할 수 없다. 그러나 유한 값을 사용하는 것이 편집상 편리하다.
NOTE: 아래 알고리즘에서 검증과 디코딩의 순서는 관찰 가능하지 않다. 구현은 가장 효율적인 어떤 순서로든, 가능하면 검증과 디코딩을 인터리브하여 수행하는 것이 권장된다.
Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: none }를 반환한다.
23.3.3.8 FromHex ( string [ , maxLength ] )
The abstract operation FromHex takes argument string (a String) and optional argument maxLength (a non-negative integer) and returns a Record with fields [[Read]] (an integer), [[Bytes]] (a List of byte values), and [[Error]] (a SyntaxError object or none). It performs the following steps when called:
Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: error }를 반환한다.
read < length이고 bytes의 요소 개수 < maxLength인 동안 반복한다,
hexits를 string의 read부터 read + 2까지의 부분 문자열이라고 하자.
hexits가 "0123456789abcdefABCDEF" 안에 있지 않은 코드 단위를 포함하면,
error를 새로 생성된 SyntaxError 객체라고 하자.
Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: error }를 반환한다.
read를 read + 2로 설정한다.
byte를 10부터 15까지의 값을 가진 숫자에 대해 문자 A부터 F 및 a부터 f를 사용하여, base-16 표기법으로 hexits가 나타내는 정수 값이라고 하자.
byte를 bytes에 추가한다.
Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: none }를 반환한다.
24 키 기반 컬렉션
24.1 Map 객체
Map은 키와 값이 모두 임의의 ECMAScript 언어 값일 수 있는 키/값 쌍의 컬렉션이다. 서로 다른 키 값은 Map의 컬렉션 안에서 하나의 키/값 쌍에만 나타날 수 있다. 서로 다른 키 값은 SameValueZero 비교 알고리즘의 의미론을 사용하여 구별된다.
Map은 평균적으로 컬렉션의 요소 수에 대해 준선형보다 빠른 접근 시간을 제공하는 해시 테이블이나 다른 메커니즘을 사용하여 구현되어야 한다. 이 명세에서 사용되는 자료 구조는 Map의 요구되는 관찰 가능한 의미론을 설명하기 위한 것일 뿐이다. 실행 가능한 구현 모델로 의도된 것이 아니다.
클래스 정의의 extends 절의 값으로 사용될 수 있다. 지정된 Map 동작을 상속하려는 서브클래스 생성자는 Map.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성하고 초기화하기 위해 Map 생성자에 대한 super 호출을 포함해야 한다.
The abstract operation AddEntriesFromIterable takes arguments target (an Object), iterable (an ECMAScript language value, but not undefined or null), and adder (a function object) and returns either a normal completion containing an Object or a throw completion. adder는 target을 수신자로 하여 호출된다. It performs the following steps when called:
iteratorRecord를 ? GetIterator(iterable, sync)라고 하자.
callback은 두 인자를 받는 함수여야 한다. groupBy는 items의 각 요소에 대해 오름차순으로 한 번씩 callback을 호출하고, 새로운 Map을 구성한다. callback이 반환한 각 값은 Map에서 키로 사용된다. 그러한 각 키에 대해, 결과 Map은 그 키를 키로 하고 callback이 그 키를 반환한 모든 요소를 포함하는 배열을 값으로 하는 엔트리를 가진다.
callback은 요소의 값과 요소의 인덱스라는 두 인자와 함께 호출된다.
groupBy의 반환값은 Map이다.
이 함수는 호출될 때 다음 단계를 수행한다:
groups를 ? GroupBy(items, callback, collection)이라고 하자.
callback은 세 인자를 받는 함수여야 한다. forEach는 Map에 존재하는 각 키/값 쌍에 대해 키 삽입 순서대로 한 번씩 callback을 호출한다. callback은 실제로 존재하는 Map의 키에 대해서만 호출되며, Map에서 삭제된 키에 대해서는 호출되지 않는다.
thisArg 매개변수가 제공되면, callback의 각 호출에서 this 값으로 사용된다. 제공되지 않으면, 대신 undefined가 사용된다.
callback은 항목의 값, 항목의 키, 그리고 순회 중인 Map이라는 세 인자와 함께 호출된다.
forEach는 호출 대상 객체를 직접 변경하지 않지만, callback 호출에 의해 객체가 변경될 수 있다. Map의 [[MapData]]의 각 엔트리는 한 번만 방문된다. forEach 호출이 시작된 뒤 추가된 새 키도 방문된다. 어떤 키가 방문된 뒤 삭제되고 forEach 호출이 완료되기 전에 다시 추가되면 그 키는 다시 방문된다. forEach 호출이 시작된 뒤 방문되기 전에 삭제된 키는 forEach 호출이 완료되기 전에 그 키가 다시 추가되지 않는 한 방문되지 않는다.
이 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성 특성을 가진다.
24.1.4 Map 인스턴스의 속성
Map 인스턴스는 Map 프로토타입 객체로부터 속성을 상속하는 보통 객체이다. Map 인스턴스는 또한 [[MapData]] 내부 슬롯을 가진다.
24.1.5 Map Iterator 객체
Map Iterator는 어떤 특정 Map 인스턴스 객체에 대한 특정 반복을 나타내는 객체이다. Map Iterator 객체에는 이름 있는 생성자가 없다. 대신, Map Iterator 객체는 Map 인스턴스 객체의 특정 메서드를 호출하여 생성된다.
24.1.5.1 CreateMapIterator ( map, kind )
The abstract operation CreateMapIterator takes arguments map (an ECMAScript language value) and kind (key+value, key, or value) and returns either a normal completion containing a Generator or a throw completion. 그러한 반복자를 반환하는 Map 메서드를 위한 iterator 객체를 생성하는 데 사용된다. It performs the following steps when called:
이 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성 특성을 가진다.
24.2 Set 객체
Set 객체는 ECMAScript 언어 값의 컬렉션이다. Set은 서로 다른 각 값을 최대 한 번만 포함할 수 있다. 서로 다른 값은 SameValueZero 비교 알고리즘의 의미론을 사용하여 구별된다.
Set 객체는 평균적으로 컬렉션의 요소 수에 대해 준선형보다 빠른 접근 시간을 제공하는 해시 테이블이나 다른 메커니즘을 사용하여 구현되어야 한다. 이 명세에서 사용되는 자료 구조는 Set 객체의 요구되는 관찰 가능한 의미론을 설명하기 위한 것일 뿐이다. 실행 가능한 구현 모델로 의도된 것이 아니다.
24.2.1 Set 객체를 위한 추상 연산
24.2.1.1 Set Records
Set Record는 Set 또는 유사 객체의 인터페이스를 캡슐화하는 데 사용되는 Record 값이다.
The abstract operation GetSetRecord takes argument obj (an ECMAScript language value) and returns either a normal completion containing a Set Record or a throw completion. It performs the following steps when called:
새로운 Set Record { [[SetObject]]: obj, [[Size]]: intSize, [[Has]]: has, [[Keys]]: keys }를 반환한다.
24.2.1.3 SetDataHas ( setData, value )
The abstract operation SetDataHas takes arguments setData (a List of either ECMAScript language values or empty) and value (an ECMAScript language value) and returns a Boolean. It performs the following steps when called:
The abstract operation SetDataIndex takes arguments setData (a List of either ECMAScript language values or empty) and value (an ECMAScript language value) and returns a non-negative integer or not-found. It performs the following steps when called:
The abstract operation SetDataSize takes argument setData (a List of either ECMAScript language values or empty) and returns a non-negative integer. It performs the following steps when called:
클래스 정의의 extends 절의 값으로 사용될 수 있다. 지정된 Set 동작을 상속하려는 서브클래스 생성자는 Set.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성하고 초기화하기 위해 Set 생성자에 대한 super 호출을 포함해야 한다.
callback은 세 인자를 받는 함수여야 한다. forEach는 Set 객체에 존재하는 각 값에 대해 값 삽입 순서대로 한 번씩 callback을 호출한다. callback은 실제로 존재하는 Set의 값에 대해서만 호출되며, set에서 삭제된 키에 대해서는 호출되지 않는다.
thisArg 매개변수가 제공되면, callback의 각 호출에서 this 값으로 사용된다. 제공되지 않으면, 대신 undefined가 사용된다.
callback은 세 인자와 함께 호출된다: 첫 두 인자는 Set에 포함된 값이다. 두 인자 모두에 같은 값이 전달된다. 순회 중인 Set 객체가 세 번째 인자로 전달된다.
callback은 Map과 Array의 forEach 메서드가 사용하는 콜백 함수와 일관되도록 세 인자와 함께 호출된다. Set의 경우, 각 항목 값은 키이자 값으로 간주된다.
forEach는 호출 대상 객체를 직접 변경하지 않지만, callback 호출에 의해 객체가 변경될 수 있다.
각 값은 보통 한 번만 방문된다. 그러나 어떤 값이 방문된 뒤 삭제되고 forEach 호출이 완료되기 전에 다시 추가되면 그 값은 다시 방문된다. forEach 호출이 시작된 뒤 방문되기 전에 삭제된 값은 forEach 호출이 완료되기 전에 그 값이 다시 추가되지 않는 한 방문되지 않는다. forEach 호출이 시작된 뒤 추가된 새 값은 방문된다.
이 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성 특성을 가진다.
24.2.5 Set 인스턴스의 속성
Set 인스턴스는 Set 프로토타입 객체로부터 속성을 상속하는 보통 객체이다. Set 인스턴스는 또한 [[SetData]] 내부 슬롯을 가진다.
24.2.6 Set Iterator 객체
Set Iterator는 아래에 정의된 구조를 가지는 보통 객체로, 어떤 특정 Set 인스턴스 객체에 대한 특정 반복을 나타낸다. Set Iterator 객체에는 이름 있는 생성자가 없다. 대신, Set Iterator 객체는 Set 인스턴스 객체의 특정 메서드를 호출하여 생성된다.
24.2.6.1 CreateSetIterator ( set, kind )
The abstract operation CreateSetIterator takes arguments set (an ECMAScript language value) and kind (key+value or value) and returns either a normal completion containing a Generator or a throw completion. 그러한 반복자를 반환하는 Set 메서드를 위한 iterator 객체를 생성하는 데 사용된다. It performs the following steps when called:
이 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성 특성을 가진다.
24.3 WeakMap 객체
WeakMap은 키가 객체 및/또는 심벌이고 값은 임의의 ECMAScript 언어 값일 수 있는 키/값 쌍의 컬렉션이다. WeakMap은 특정 키를 가진 키/값 쌍을 포함하는지 조회할 수 있지만, 키로 보유한 값들을 열거하는 메커니즘은 제공되지 않는다. 특정 조건에서는 live가 아닌 값들이 9.9.3에 설명된 대로 WeakMap 키에서 제거된다.
구현은 WeakMap의 키/값 쌍이 접근 불가능해진 시점과 그 키/값 쌍이 WeakMap에서 제거되는 시점 사이에 임의로 결정된 지연을 부과할 수 있다. 이 지연이 ECMAScript 프로그램에 관찰 가능하다면, 프로그램 실행에 영향을 줄 수 있는 비결정성의 원천이 될 것이다. 그러므로 ECMAScript 구현은 관찰자가 관찰되는 키를 제시할 것을 요구하지 않는 방식으로 WeakMap의 키를 관찰할 수단을 제공해서는 안 된다.
WeakMap은 평균적으로 컬렉션의 키/값 쌍 수에 대해 준선형보다 빠른 접근 시간을 제공하는 해시 테이블이나 다른 메커니즘을 사용하여 구현되어야 한다. 이 명세에서 사용되는 자료 구조는 WeakMap의 요구되는 관찰 가능한 의미론을 설명하기 위한 것일 뿐이다. 실행 가능한 구현 모델로 의도된 것이 아니다.
Note
WeakMap과 WeakSet은, WeakMap 또는 WeakSet 인스턴스가 없었다면 객체 또는 심벌이 다른 방식으로 접근 불가능해져 구현의 가비지 컬렉션 메커니즘에 의해 자원 회수 대상이 되었을 경우 메모리 자원을 “누수”하지 않는 방식으로, 객체 또는 심벌에 상태를 동적으로 연결하는 메커니즘을 제공하기 위한 것이다. 이 특성은 WeakMap 또는 WeakSet 인스턴스에서 키로의 역방향 객체별/심벌별 매핑을 사용하여 달성할 수 있다. 또는 각 WeakMap 또는 WeakSet 인스턴스가 내부적으로 키와 값 데이터를 저장할 수도 있지만, 이 접근 방식은 WeakMap 또는 WeakSet 구현과 가비지 컬렉터 사이의 조정을 요구한다. 다음 참조들은 WeakMap과 WeakSet 구현에 유용할 수 있는 메커니즘을 설명한다:
Barry Hayes. 1997. Ephemerons: a new finalization mechanism. In Proceedings of the 12th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications (OOPSLA '97), A. Michael Berman (Ed.). ACM, New York, NY, USA, 176-183, http://doi.acm.org/10.1145/263698.263733.
클래스 정의의 extends 절의 값으로 사용될 수 있다. 지정된 WeakMap 동작을 상속하려는 서브클래스 생성자는 WeakMap.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성하고 초기화하기 위해 WeakMap 생성자에 대한 super 호출을 포함해야 한다.
이 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성 특성을 가진다.
24.3.4 WeakMap 인스턴스의 속성
WeakMap 인스턴스는 WeakMap 프로토타입 객체로부터 속성을 상속하는 보통 객체이다. WeakMap 인스턴스는 또한 [[WeakMapData]] 내부 슬롯을 가진다.
24.4 WeakSet 객체
WeakSet은 객체 및/또는 심벌의 컬렉션이다. 서로 다른 객체 또는 심벌은 WeakSet의 컬렉션의 요소로 한 번만 나타날 수 있다. WeakSet은 특정 값을 포함하는지 조회할 수 있지만, 보유한 값들을 열거하는 메커니즘은 제공되지 않는다. 특정 조건에서는 live가 아닌 값들이 9.9.3에 설명된 대로 WeakSet 요소에서 제거된다.
구현은 WeakSet에 포함된 값이 접근 불가능해진 시점과 그 값이 WeakSet에서 제거되는 시점 사이에 임의로 결정된 지연을 부과할 수 있다. 이 지연이 ECMAScript 프로그램에 관찰 가능하다면, 프로그램 실행에 영향을 줄 수 있는 비결정성의 원천이 될 것이다. 그러므로 ECMAScript 구현은 관찰자가 관찰되는 값을 제시할 것을 요구하지 않는 방식으로 WeakSet이 특정 값을 포함하는지 결정할 수단을 제공해서는 안 된다.
WeakSet은 평균적으로 컬렉션의 요소 수에 대해 준선형보다 빠른 접근 시간을 제공하는 해시 테이블이나 다른 메커니즘을 사용하여 구현되어야 한다. 이 명세에서 사용되는 자료 구조는 WeakSet의 요구되는 관찰 가능한 의미론을 설명하기 위한 것일 뿐이다. 실행 가능한 구현 모델로 의도된 것이 아니다.
클래스 정의의 extends 절의 값으로 사용될 수 있다. 지정된 WeakSet 동작을 상속하려는 서브클래스 생성자는 WeakSet.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성하고 초기화하기 위해 WeakSet 생성자에 대한 super 호출을 포함해야 한다.
이 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성 특성을 가진다.
24.4.4 WeakSet 인스턴스의 속성
WeakSet 인스턴스는 WeakSet 프로토타입 객체로부터 속성을 상속하는 보통 객체이다. WeakSet 인스턴스는 또한 [[WeakSetData]] 내부 슬롯을 가진다.
24.5 키 기반 컬렉션을 위한 추상 연산
24.5.1 CanonicalizeKeyedCollectionKey ( key )
The abstract operation CanonicalizeKeyedCollectionKey takes argument key (an ECMAScript language value) and returns an ECMAScript language value. It performs the following steps when called:
key가 -0𝔽이면, +0𝔽을 반환한다.
key를 반환한다.
25 구조화된 데이터
25.1 ArrayBuffer 객체
25.1.1 표기법
이 절, 25.4, 그리고 29의 아래 설명들은 read-modify-write 수정 함수 내부 자료 구조를 사용한다.
The abstract operation AllocateArrayBuffer takes arguments constructor (a constructor) and byteLength (a non-negative integer) and optional argument maxByteLength (a non-negative integer or empty) and returns either a normal completion containing an ArrayBuffer or a throw completion. ArrayBuffer를 생성하는 데 사용된다. It performs the following steps when called:
Let slots be « [[ArrayBufferData]], [[ArrayBufferByteLength]], [[ArrayBufferDetachKey]] ».
If maxByteLength is present and maxByteLength is not empty, let allocatingResizableBuffer be true; else let allocatingResizableBuffer be false.
If allocatingResizableBuffer is true, then
If byteLength > maxByteLength, throw a RangeError exception.
If it is not possible to create a Data Blockblock consisting of maxByteLength bytes, throw a RangeError exception.
NOTE: Resizable ArrayBuffers are designed to be implementable with in-place growth. Implementations may throw if, for example, virtual memory cannot be reserved up front.
Set obj.[[ArrayBufferMaxByteLength]] to maxByteLength.
Return obj.
25.1.3.2 ArrayBufferByteLength ( arrayBuffer, order )
The abstract operation ArrayBufferByteLength takes arguments arrayBuffer (an ArrayBuffer or SharedArrayBuffer) and order (seq-cst or unordered) and returns a non-negative integer. It performs the following steps when called:
The abstract operation ArrayBufferCopyAndDetach takes arguments arrayBuffer (an ECMAScript language value), newLength (an ECMAScript language value), and preserveResizability (preserve-resizability or fixed-length) and returns either a normal completion containing an ArrayBuffer or a throw completion. It performs the following steps when called:
The abstract operation IsDetachedBuffer takes argument arrayBuffer (an ArrayBuffer or a SharedArrayBuffer) and returns a Boolean. It performs the following steps when called:
The abstract operation DetachArrayBuffer takes argument arrayBuffer (an ArrayBuffer) and optional argument key (anything) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:
The abstract operation CloneArrayBuffer takes arguments srcBuffer (an ArrayBuffer or a SharedArrayBuffer), srcByteOffset (a non-negative integer), and srcLength (a non-negative integer) and returns either a normal completion containing an ArrayBuffer or a throw completion. srcByteOffset에서 시작해 srcLength 바이트 동안 이어지는 범위에 있는 srcBuffer의 데이터를 복사한 데이터를 가진 새로운 ArrayBuffer를 생성한다. It performs the following steps when called:
The abstract operation GetArrayBufferMaxByteLengthOption takes argument options (an ECMAScript language value) and returns either a normal completion containing either a non-negative integer or empty, or a throw completion. It performs the following steps when called:
options가 Object가 아니면, empty를 반환한다.
maxByteLength를 ? Get(options, "maxByteLength")라고 하자.
The host-defined abstract operation HostResizeArrayBuffer takes arguments buffer (an ArrayBuffer) and newByteLength (a non-negative integer) and returns either a normal completion containing either handled or unhandled, or a throw completion. 호스트에게 buffer의 구현 정의 크기 조절을 수행할 기회를 제공한다. 호스트가 buffer의 크기 조절을 처리하지 않기로 선택하면, 기본 동작을 위해 unhandled를 반환할 수 있다.
이 추상 연산이 handled와 함께 정상 완료하면, buffer.[[ArrayBufferByteLength]]는 newByteLength이다.
HostResizeArrayBuffer의 기본 구현은 NormalCompletion(unhandled)를 반환하는 것이다.
25.1.3.9 IsFixedLengthArrayBuffer ( arrayBuffer )
The abstract operation IsFixedLengthArrayBuffer takes argument arrayBuffer (an ArrayBuffer or a SharedArrayBuffer) and returns a Boolean. It performs the following steps when called:
arrayBuffer가 [[ArrayBufferMaxByteLength]] 내부 슬롯을 가지면, false를 반환한다.
true를 반환한다.
25.1.3.10 IsUnsignedElementType ( type )
The abstract operation IsUnsignedElementType takes argument type (a TypedArray element type) and returns a Boolean. 인자 type이 부호 없는 TypedArray 요소 타입인지 검증한다. It performs the following steps when called:
type이 uint8, uint8clamped, uint16, uint32, 또는 biguint64 중 하나이면, true를 반환한다.
false를 반환한다.
25.1.3.11 IsUnclampedIntegerElementType ( type )
The abstract operation IsUnclampedIntegerElementType takes argument type (a TypedArray element type) and returns a Boolean. 인자 type이 uint8clamped를 포함하지 않는 Integer TypedArray 요소 타입인지 검증한다. It performs the following steps when called:
type이 int8, uint8, int16, uint16, int32, 또는 uint32 중 하나이면, true를 반환한다.
false를 반환한다.
25.1.3.12 IsBigIntElementType ( type )
The abstract operation IsBigIntElementType takes argument type (a TypedArray element type) and returns a Boolean. 인자 type이 BigInt TypedArray 요소 타입인지 검증한다. It performs the following steps when called:
type이 biguint64 또는 bigint64이면, true를 반환한다.
false를 반환한다.
25.1.3.13 IsNoTearConfiguration ( type, order )
The abstract operation IsNoTearConfiguration takes arguments type (a TypedArray element type) and order (seq-cst, unordered, or init) and returns a Boolean. It performs the following steps when called:
The abstract operation RawBytesToNumeric takes arguments type (a TypedArray element type), rawBytes (a List of byte values), and isLittleEndian (a Boolean) and returns a Number or a BigInt. It performs the following steps when called:
elementSize를 요소 타입 type에 대해 Table 70에 지정된 Element Size 값이라고 하자.
isLittleEndian이 false이면, rawBytes 요소들의 순서를 뒤집는다.
type이 float16이면,
value를 rawBytes의 바이트 요소들이 연결되어 IEEE 754-2019 binary16 값의 리틀 엔디언 비트 문자열 인코딩으로 해석된 것이라고 하자.
value가 NaN이면, NaN을 반환한다.
value에 대응하는 Number 값을 반환한다.
type이 float32이면,
value를 rawBytes의 바이트 요소들이 연결되어 IEEE 754-2019 binary32 값의 리틀 엔디언 비트 문자열 인코딩으로 해석된 것이라고 하자.
value가 NaN이면, NaN을 반환한다.
value에 대응하는 Number 값을 반환한다.
type이 float64이면,
value를 rawBytes의 바이트 요소들이 연결되어 IEEE 754-2019 binary64 값의 리틀 엔디언 비트 문자열 인코딩으로 해석된 것이라고 하자.
25.1.3.15 GetRawBytesFromSharedBlock ( block, byteIndex, type, isTypedArray, order )
The abstract operation GetRawBytesFromSharedBlock takes arguments block (a Shared Data Block), byteIndex (a non-negative integer), type (a TypedArray element type), isTypedArray (a Boolean), and order (seq-cst or unordered) and returns a List of byte values. It performs the following steps when called:
elementSize를 요소 타입 type에 대해 Table 70에 지정된 Element Size 값이라고 하자.
The abstract operation GetValueFromBuffer takes arguments arrayBuffer (an ArrayBuffer or SharedArrayBuffer), byteIndex (a non-negative integer), type (a TypedArray element type), isTypedArray (a Boolean), and order (seq-cst or unordered) and optional argument isLittleEndian (a Boolean) and returns a Number or a BigInt. It performs the following steps when called:
The abstract operation NumericToRawBytes takes arguments type (a TypedArray element type), value (a Number or a BigInt), and isLittleEndian (a Boolean) and returns a List of byte values. It performs the following steps when called:
type이 float16이면,
rawBytes를 value를 roundTiesToEven 모드를 사용하여 IEEE 754-2019 binary16 형식으로 변환한 결과인 2바이트를 요소로 가지는 List라고 하자. 바이트들은 리틀 엔디언 순서로 배치된다. value가 NaN이면, rawBytes는 구현이 선택한 임의의 IEEE 754-2019 binary16 형식 NaN 인코딩으로 설정될 수 있다. 구현은 구현이 구별할 수 있는 각 NaN 값에 대해 항상 같은 인코딩을 선택해야 한다.
그렇지 않고 type이 float32이면,
rawBytes를 value를 roundTiesToEven 모드를 사용하여 IEEE 754-2019 binary32 형식으로 변환한 결과인 4바이트를 요소로 가지는 List라고 하자. 바이트들은 리틀 엔디언 순서로 배치된다. value가 NaN이면, rawBytes는 구현이 선택한 임의의 IEEE 754-2019 binary32 형식 NaN 인코딩으로 설정될 수 있다. 구현은 구현이 구별할 수 있는 각 NaN 값에 대해 항상 같은 인코딩을 선택해야 한다.
그렇지 않고 type이 float64이면,
rawBytes를 value의 IEEE 754-2019 binary64 형식 인코딩인 8바이트를 요소로 가지는 List라고 하자. 바이트들은 리틀 엔디언 순서로 배치된다. value가 NaN이면, rawBytes는 구현이 선택한 임의의 IEEE 754-2019 binary64 형식 NaN 인코딩으로 설정될 수 있다. 구현은 구현이 구별할 수 있는 각 NaN 값에 대해 항상 같은 인코딩을 선택해야 한다.
그렇지 않으면,
n을 요소 타입 type에 대해 Table 70에 지정된 Element Size 값이라고 하자.
conversionOperation을 요소 타입 type에 대해 Table 70의 “Conversion Operation” 열에 이름이 지정된 추상 연산이라고 하자.
The abstract operation SetValueInBuffer takes arguments arrayBuffer (an ArrayBuffer or SharedArrayBuffer), byteIndex (a non-negative integer), type (a TypedArray element type), value (a Number or a BigInt), isTypedArray (a Boolean), and order (seq-cst, unordered, or init) and optional argument isLittleEndian (a Boolean) and returns unused. It performs the following steps when called:
rawBytes의 개별 바이트들을 block[byteIndex]에서 시작하여 block에 저장한다.
unused를 반환한다.
25.1.3.19 GetModifySetValueInBuffer ( arrayBuffer, byteIndex, type, value, op )
The abstract operation GetModifySetValueInBuffer takes arguments arrayBuffer (an ArrayBuffer or a SharedArrayBuffer), byteIndex (a non-negative integer), type (a TypedArray element type), value (a Number or a BigInt), and op (a read-modify-write modification function) and returns a Number or a BigInt. It performs the following steps when called:
rawBytesRead를 요소들이 비결정적으로 선택된 바이트 값인 길이 elementSize의 List라고 하자.
NOTE: 구현에서 rawBytesRead는 기반 하드웨어에서 load-link, load-exclusive 또는 read-modify-write 명령의 피연산자 결과이다. 비결정성은 약한 일관성을 가진 하드웨어의 관찰 가능한 동작을 설명하기 위한 메모리 모델의 의미론적 규정이다.
rmwEvent를 ReadModifyWriteSharedMemory { [[Order]]: seq-cst, [[NoTear]]: true, [[Block]]: block, [[ByteIndex]]: byteIndex, [[ElementSize]]: elementSize, [[Payload]]: rawBytes, [[ModifyOp]]: op }라고 하자.
rmwEvent를 eventsRecord.[[EventList]]에 추가한다.
Chosen Value Record { [[Event]]: rmwEvent, [[ChosenValue]]: rawBytesRead }를 execution.[[ChosenValues]]에 추가한다.
그렇지 않으면,
rawBytesRead를 block[byteIndex]로 시작하는 elementSize개의 바이트 시퀀스를 요소로 가지는 길이 elementSize의 List라고 하자.
rawBytesModified를 op(rawBytesRead, rawBytes)라고 하자.
rawBytesModified의 개별 바이트들을 block[byteIndex]에서 시작하여 block에 저장한다.
클래스 정의의 extends 절의 값으로 사용될 수 있다. 지정된 ArrayBuffer 동작을 상속하려는 서브클래스 생성자는 ArrayBuffer.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성하고 초기화하기 위해 ArrayBuffer 생성자에 대한 super 호출을 포함해야 한다.
이 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성 특성을 가진다.
25.1.7 ArrayBuffer 인스턴스의 속성
ArrayBuffer 인스턴스는 ArrayBuffer 프로토타입 객체로부터 속성을 상속한다. 각 ArrayBuffer 인스턴스는 [[ArrayBufferData]] 내부 슬롯, [[ArrayBufferByteLength]] 내부 슬롯, 그리고 [[ArrayBufferDetachKey]] 내부 슬롯을 가진다. 크기 조절 가능 ArrayBuffer 인스턴스는 각각 [[ArrayBufferMaxByteLength]] 내부 슬롯을 가진다.
[[ArrayBufferData]]가 null인 ArrayBuffer 인스턴스는 detached된 것으로 간주되며, ArrayBuffer 인스턴스에 포함된 데이터에 접근하거나 수정하는 모든 연산자는 실패한다.
[[ArrayBufferDetachKey]]가 undefined 이외의 값으로 설정된 ArrayBuffer 인스턴스는 모든 DetachArrayBuffer 호출이 동일한 "detach key"를 인자로 전달해야 하며, 그렇지 않으면 TypeError가 발생한다. 이 내부 슬롯은 이 명세의 알고리즘이 아니라 특정 임베딩 환경에 의해서만 설정된다.
가능한 경우 프로그램은 배포 환경에서 테스트할 것을 권장한다. 사용 가능한 물리 메모리의 양은 하드웨어 장치마다 크게 다르다. 마찬가지로 가상 메모리 서브시스템도 하드웨어 장치와 운영 체제마다 크게 다르다. 64비트 데스크톱 웹 브라우저에서 메모리 부족 오류 없이 실행되는 애플리케이션이 32비트 모바일 웹 브라우저에서는 메모리가 부족해질 수 있다.
크기 조절 가능 ArrayBuffer에 대한 "maxByteLength" 옵션 값을 선택할 때는 애플리케이션에 가능한 가장 작은 크기를 선택할 것을 권장한다. "maxByteLength"가 1,073,741,824(230 바이트 또는 1GiB)를 초과하지 않을 것을 권장한다.
특정 최대 크기에 대해 크기 조절 가능 ArrayBuffer를 성공적으로 생성했다고 해서 향후 resize가 성공한다는 보장은 없다는 점에 유의하라.
크기 조절 가능 ArrayBuffer는 resize 시 복사, 가상 메모리를 미리 예약하는 제자리 증가, 또는 생성자의 "maxByteLength" 옵션의 서로 다른 값에 대해 두 방식을 조합하여 구현할 수 있다.
웹 브라우저와 같이 호스트가 멀티 테넌트(즉, 많은 ECMAScript 애플리케이션을 동시에 실행)이고 구현이 가상 메모리를 예약하여 제자리 증가를 구현하기로 선택한 경우, 단일 애플리케이션이 가상 메모리 주소 공간을 고갈시킬 가능성을 줄이고 상호 운용성 위험을 줄이기 위해 32비트와 64비트 구현 모두 "maxByteLength" ≥ 1GiB에서 1.5GiB 사이의 값에 대해 예외를 던질 것을 권장한다.
임베디드 장치처럼 MMU가 없는 환경에서 실행되는 호스트와 같이 가상 메모리가 없거나, 호스트가 복사를 통해서만 크기 조절을 구현하는 경우, "maxByteLength" 옵션에 대해 어떤 Number 값도 허용할 수 있다. 그러나 요청된 크기의 메모리 블록을 결코 할당할 수 없다면 RangeError를 던질 것을 권장한다. 예를 들어 요청된 크기가 장치에서 사용 가능한 최대 메모리 양보다 큰 경우가 그렇다.
25.2 SharedArrayBuffer 객체
25.2.1 고정 길이 및 증가 가능 SharedArrayBuffer 객체
고정 길이 SharedArrayBuffer는 생성 후 바이트 길이가 변경될 수 없는 SharedArrayBuffer이다.
The abstract operation AllocateSharedArrayBuffer takes arguments constructor (a constructor) and byteLength (a non-negative integer) and optional argument maxByteLength (a non-negative integer or empty) and returns either a normal completion containing a SharedArrayBuffer or a throw completion. SharedArrayBuffer를 생성하는 데 사용된다. It performs the following steps when called:
Let slots be « [[ArrayBufferData]] ».
If maxByteLength is present and maxByteLength is not empty, let allocatingGrowableBuffer be true; else let allocatingGrowableBuffer be false.
If allocatingGrowableBuffer is true, then
If byteLength > maxByteLength, throw a RangeError exception.
Append [[ArrayBufferByteLengthData]] and [[ArrayBufferMaxByteLength]] to slots.
Set obj.[[ArrayBufferByteLengthData]] to byteLengthBlock.
Set obj.[[ArrayBufferMaxByteLength]] to maxByteLength.
Else,
Set obj.[[ArrayBufferByteLength]] to byteLength.
Return obj.
25.2.2.2 IsSharedArrayBuffer ( obj )
The abstract operation IsSharedArrayBuffer takes argument obj (an ArrayBuffer or a SharedArrayBuffer) and returns a Boolean. 객체가 SharedArrayBuffer인지 테스트한다. It performs the following steps when called:
The abstract operation IsGrowableSharedArrayBuffer takes argument obj (an ArrayBuffer or a SharedArrayBuffer) and returns a Boolean. 객체가 증가 가능 SharedArrayBuffer인지 테스트한다. It performs the following steps when called:
IsSharedArrayBuffer(obj)가 true이고 obj가 [[ArrayBufferByteLengthData]] 내부 슬롯을 가지면, true를 반환한다.
The host-defined abstract operation HostGrowSharedArrayBuffer takes arguments buffer (a SharedArrayBuffer) and newByteLength (a non-negative integer) and returns either a normal completion containing either handled or unhandled, or a throw completion. 호스트에게 buffer의 구현 정의 증가를 수행할 기회를 제공한다. 호스트가 buffer의 증가를 처리하지 않기로 선택하면, 기본 동작을 위해 unhandled를 반환할 수 있다.
HostGrowSharedArrayBuffer의 구현은 다음 요구사항을 준수해야 한다:
이 추상 연산이 unhandled와 함께 정상 완료하지 않고, newByteLength < buffer의 현재 바이트 길이이거나 newByteLength > buffer.[[ArrayBufferMaxByteLength]]이면, RangeError 예외를 던진다.
위 두 번째 요구사항은 buffer의 현재 바이트 길이를 어떻게 또는 언제 읽는지에 대해 의도적으로 모호하다. 바이트 길이는 기반 하드웨어에서 원자적 read-modify-write 연산을 통해 갱신되어야 하므로, load-link/store-conditional 또는 load-exclusive/store-exclusive 명령 쌍을 사용하는 아키텍처는 쌍을 이루는 명령들을 명령 스트림에서 가깝게 유지하고자 할 수 있다. 따라서 SharedArrayBuffer.prototype.grow ( newLength ) 자체는 HostGrowSharedArrayBuffer를 호출하기 전에 newByteLength에 대한 경계 검사를 수행하지 않으며, 현재 바이트 길이가 언제 읽히는지에 대한 요구사항도 없다.
이는 0 ≤ newByteLength ≤ buffer.[[ArrayBufferMaxByteLength]]가 보장되는 HostResizeArrayBuffer와 대조된다.
HostGrowSharedArrayBuffer의 기본 구현은 NormalCompletion(unhandled)를 반환하는 것이다.
25.2.3 SharedArrayBuffer 생성자
SharedArrayBuffer 생성자는:
%SharedArrayBuffer%이다.
해당 속성이 존재한다면(아래 참조), 전역 객체의 "SharedArrayBuffer" 속성의 초기값이다.
생성자로 호출될 때 새로운 SharedArrayBuffer를 생성하고 초기화한다.
함수로 호출되도록 의도되지 않았으며, 그런 방식으로 호출되면 예외를 던진다.
클래스 정의의 extends 절의 값으로 사용될 수 있다. 지정된 SharedArrayBuffer 동작을 상속하려는 서브클래스 생성자는 SharedArrayBuffer.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성하고 초기화하기 위해 SharedArrayBuffer 생성자에 대한 super 호출을 포함해야 한다.
호스트가 SharedArrayBuffer에 대한 동시 접근을 제공하지 않을 때마다 전역 객체의 "SharedArrayBuffer" 속성을 생략할 수 있다.
Note
ArrayBuffer와 달리, SharedArrayBuffer는 detached될 수 없으며 그 내부 [[ArrayBufferData]] 슬롯은 결코 null이 아니다.
SharedArrayBuffer.prototype.grow에 대한 병렬 호출은 전체 순서화된다. 예를 들어 두 경쟁 호출 sab.grow(10)과 sab.grow(20)을 생각해 보라. 두 호출 중 하나는 반드시 경쟁에서 이긴다. sab.grow(10) 호출은 sab.grow(20)이 먼저 발생했더라도 결코 sab를 축소하지 않는다. 그 경우 대신 RangeError를 던진다.
25.2.5.4 get SharedArrayBuffer.prototype.growable
SharedArrayBuffer.prototype.growable은 set 접근자 함수가 undefined인 접근자 속성이다. 그 get 접근자 함수는 호출될 때 다음 단계를 수행한다:
이 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성 특성을 가진다.
25.2.6 SharedArrayBuffer 인스턴스의 속성
SharedArrayBuffer 인스턴스는 SharedArrayBuffer 프로토타입 객체로부터 속성을 상속한다. 각 SharedArrayBuffer 인스턴스는 [[ArrayBufferData]] 내부 슬롯을 가진다. 증가 가능하지 않은 SharedArrayBuffer 인스턴스는 각각 [[ArrayBufferByteLength]] 내부 슬롯을 가진다. 증가 가능한 SharedArrayBuffer 인스턴스는 각각 [[ArrayBufferByteLengthData]] 내부 슬롯과 [[ArrayBufferMaxByteLength]] 내부 슬롯을 가진다.
Note
SharedArrayBuffer 인스턴스는 ArrayBuffer 인스턴스와 달리 결코 detached되지 않는다.
가능한 경우 프로그램은 배포 환경에서 테스트할 것을 권장한다. 사용 가능한 물리 메모리의 양은 하드웨어 장치마다 크게 다르다. 마찬가지로 가상 메모리 서브시스템도 하드웨어 장치와 운영 체제마다 크게 다르다. 64비트 데스크톱 웹 브라우저에서 메모리 부족 오류 없이 실행되는 애플리케이션이 32비트 모바일 웹 브라우저에서는 메모리가 부족해질 수 있다.
증가 가능 SharedArrayBuffer에 대한 "maxByteLength" 옵션 값을 선택할 때는 애플리케이션에 가능한 가장 작은 크기를 선택할 것을 권장한다. "maxByteLength"가 1073741824, 즉 1GiB를 초과하지 않을 것을 권장한다.
증가 가능 SharedArrayBuffer 길이의 모든 로드가 동기화하는 seq-cst 로드는 아니다. 정수 인덱스 속성 접근, 예를 들어 u8[idx]의 경계 검사를 위한 길이 로드는 동기화하지 않는다. 일반적으로 명시적 동기화가 없으면, 한 속성 접근이 in-bound였다는 사실이 같은 agent의 후속 속성 접근도 in-bound임을 의미하지 않는다. 반대로 SharedArrayBuffer, %TypedArray%.prototype, 그리고 DataView.prototype의 length 및 byteLength getter를 통한 길이의 명시적 로드는 동기화한다. TypedArray가 완전히 out-of-bounds인지 확인하기 위해 내장 메서드가 수행하는 길이 로드도 동기화한다.
증가 연산은 증가 가능 SharedArrayBuffer에 대한 메모리 접근과 병렬로 발생할 수 있으므로, 메모리 모델의 제약은 unordered 접근조차도 "tear"하지 않을 것(값의 비트가 섞이지 않을 것)을 요구한다. 실제로 이는 증가 가능 SharedArrayBuffer의 기반 데이터 블록이 세계를 멈추지 않고는 복사 방식으로 증가될 수 없음을 의미한다. 세계를 멈추는 방식은 직렬화 지점을 도입하고 느리기 때문에 구현 전략으로 권장하지 않는다.
증가된 메모리는 병렬로 발생하는 모든 racy 접근을 포함하여, 생성 순간부터 0으로 채워진 것처럼 보여야 한다. 이는 zero-filled-on-demand 가상 메모리 페이지를 통해 달성하거나, 메모리를 수동으로 0으로 채우는 경우 신중한 동기화를 통해 달성할 수 있다.
증가 가능 SharedArrayBuffer의 TypedArray 뷰에 대한 정수 인덱스 속성 접근은, 기반 버퍼의 길이에 대해 정수 인덱스 속성 로드가 동기화하지 않기 때문에(위 프로그래머 지침 참조), 증가 불가능 SharedArrayBuffer의 TypedArray 뷰에 대한 접근과 유사하게 최적화 가능하도록 의도되어 있다. 예를 들어 속성 접근에 대한 경계 검사는 여전히 루프 밖으로 끌어올려질 수 있다.
DataView With Buffer Witness Record는 DataView와 함께 viewed buffer의 캐시된 바이트 길이를 캡슐화하는 데 사용되는 Record 값이다. 이는 viewed buffer가 증가 가능 SharedArrayBuffer일 때 바이트 길이 데이터 블록에 대해 단일 ReadSharedMemory 이벤트만 있도록 보장하는 데 도움을 주기 위해 사용된다.
DataView With Buffer Witness Records는 Table 72에 나열된 필드를 가진다.
Record가 생성되었을 때 객체의 [[ViewedArrayBuffer]]의 바이트 길이.
25.3.1.2 MakeDataViewWithBufferWitnessRecord ( obj, order )
The abstract operation MakeDataViewWithBufferWitnessRecord takes arguments obj (a DataView) and order (seq-cst or unordered) and returns a DataView With Buffer Witness Record. It performs the following steps when called:
The abstract operation GetViewByteLength takes argument viewRecord (a DataView With Buffer Witness Record) and returns a non-negative integer. It performs the following steps when called:
The abstract operation IsViewOutOfBounds takes argument viewRecord (a DataView With Buffer Witness Record) and returns a Boolean. It performs the following steps when called:
view를 viewRecord.[[Object]]라고 하자.
bufferByteLength를 viewRecord.[[CachedBufferByteLength]]라고 하자.
25.3.1.5 GetViewValue ( view, requestIndex, isLittleEndian, type )
The abstract operation GetViewValue takes arguments view (an ECMAScript language value), requestIndex (an ECMAScript language value), isLittleEndian (an ECMAScript language value), and type (a TypedArray element type) and returns either a normal completion containing either a Number or a BigInt, or a throw completion. DataView 인스턴스의 함수가 뷰의 버퍼에서 값을 가져오는 데 사용된다. It performs the following steps when called:
25.3.1.6 SetViewValue ( view, requestIndex, isLittleEndian, type, value )
The abstract operation SetViewValue takes arguments view (an ECMAScript language value), requestIndex (an ECMAScript language value), isLittleEndian (an ECMAScript language value), type (a TypedArray element type), and value (an ECMAScript language value) and returns either a normal completion containing undefined or a throw completion. DataView 인스턴스의 함수가 값을 뷰의 버퍼에 저장하는 데 사용된다. It performs the following steps when called:
클래스 정의의 extends 절의 값으로 사용될 수 있다. 지정된 DataView 동작을 상속하려는 서브클래스 생성자는 DataView.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성하고 초기화하기 위해 DataView 생성자에 대한 super 호출을 포함해야 한다.
이 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성 특성을 가진다.
25.3.5 DataView 인스턴스의 속성
DataView 인스턴스는 DataView 프로토타입 객체로부터 속성을 상속하는 보통 객체이다. 각 DataView 인스턴스는 [[DataView]], [[ViewedArrayBuffer]], [[ByteLength]], 그리고 [[ByteOffset]] 내부 슬롯을 가진다.
Note
[[DataView]] 내부 슬롯의 값은 이 명세 안에서 사용되지 않는다. 명세 안에서는 그 내부 슬롯의 단순한 존재가 DataView 생성자를 사용해 생성된 객체를 식별하는 데 사용된다.
[[Construct]] 내부 메서드를 가지지 않는다. new 연산자와 함께 생성자로 사용할 수 없다.
[[Call]] 내부 메서드를 가지지 않는다. 함수로 호출될 수 없다.
Atomics 객체는 공유 메모리 배열 셀에 대해 분할 불가능하게(원자적으로) 동작하는 함수와, agent가 primitive 이벤트를 기다리고 dispatch할 수 있게 하는 함수를 제공한다. 규율 있게 사용하면, Atomics 함수는 공유 메모리를 통해 통신하는 multi-agent 프로그램이 병렬 CPU에서도 잘 이해된 순서로 실행될 수 있게 한다. 공유 메모리 통신을 지배하는 규칙은 아래에 정의된 메모리 모델에 의해 제공된다.
Note
ECMAScript에서 공유 메모리를 프로그래밍하고 구현하기 위한 정보성 지침은 메모리 모델 절 끝의 노트를 보라.
25.4.1 Waiter Record
Waiter Record는 Atomics.wait 또는 Atomics.waitAsync의 특정 호출을 나타내는 데 사용되는 Record 값이다.
WaiterList 안에는 같은 agent signifier를 가진 여러 Waiter Record가 있을 수 있다.
agent cluster는 WaiterList Record들의 저장소를 가진다. 이 저장소는 (block, i)로 색인되며, 여기서 block은 Shared Data Block이고 i는 block의 메모리 안의 바이트 오프셋이다. WaiterList Record는 agent와 독립적이다. agent cluster 안의 어떤 agent에서든 (block, i)로 WaiterList Record 저장소를 조회하면 같은 WaiterList Record가 결과로 나온다.
각 WaiterList Record는 평가 중 그 WaiterList Record에 대한 독점 접근을 제어하는 critical section을 가진다. 한 번에 하나의 agent만 WaiterList Record의 critical section에 들어갈 수 있다. WaiterList Record의 critical section에 들어가고 나오는 것은 추상 연산EnterCriticalSection과 LeaveCriticalSection에 의해 제어된다. WaiterList Record에 대한 연산—대기 중인 agent 추가 및 제거, agent 목록 순회, 목록의 agent 일시 중단 및 알림, Synchronize 이벤트 설정 및 검색—은 WaiterList Record의 critical section에 들어간 agent만 수행할 수 있다.
The abstract operation ValidateIntegerTypedArray takes arguments typedArray (an ECMAScript language value) and waitable (a Boolean) and returns either a normal completion containing a TypedArray With Buffer Witness Record, or a throw completion. It performs the following steps when called:
The abstract operation ValidateAtomicAccess takes arguments taRecord (a TypedArray With Buffer Witness Record) and requestIndex (an ECMAScript language value) and returns either a normal completion containing a non-negative integer or a throw completion. It performs the following steps when called:
The abstract operation ValidateAtomicAccessOnIntegerTypedArray takes arguments typedArray (an ECMAScript language value) and requestIndex (an ECMAScript language value) and returns either a normal completion containing a non-negative integer or a throw completion. It performs the following steps when called:
The abstract operation RevalidateAtomicAccess takes arguments typedArray (a TypedArray) and byteIndexInBuffer (a non-negative integer) and returns either a normal completion containing unused or a throw completion. 이 연산은 Atomics 메서드에서 모든 인자 강제가 수행된 뒤 atomic 연산을 위한 backing buffer 내의 인덱스를 다시 검증한다. 인자 강제는 임의의 부수 효과를 가질 수 있고, 이로 인해 버퍼가 out of bounds가 될 수 있기 때문이다. 이 연산은 typedArray의 backing buffer가 SharedArrayBuffer일 때 예외를 던지지 않는다. It performs the following steps when called:
The abstract operation GetWaiterList takes arguments block (a Shared Data Block) and i (a non-negative integer that is evenly divisible by 4) and returns a WaiterList Record. It performs the following steps when called:
The abstract operation EnterCriticalSection takes argument waiterList (a WaiterList Record) and returns unused. It performs the following steps when called:
EnterCriticalSection은 critical section에 들어가려는 agent가 다른 agent가 그것을 떠날 때까지 기다려야 할 때 contention을 가진다. contention이 없을 때 EnterCriticalSection 호출의 FIFO 순서는 관찰 가능하다. contention이 있을 때 구현은 임의의 순서를 선택할 수 있지만, agent가 무기한 기다리게 해서는 안 된다.
25.4.3.7 LeaveCriticalSection ( waiterList )
The abstract operation LeaveCriticalSection takes argument waiterList (a WaiterList Record) and returns unused. It performs the following steps when called:
The abstract operation AddWaiter takes arguments waiterList (a WaiterList Record) and waiterRecord (a Waiter Record) and returns unused. It performs the following steps when called:
The abstract operation RemoveWaiter takes arguments waiterList (a WaiterList Record) and waiterRecord (a Waiter Record) and returns unused. It performs the following steps when called:
Assert: waiterList.[[Waiters]]는 waiterRecord를 포함한다.
waiterRecord를 waiterList.[[Waiters]]에서 제거한다.
unused를 반환한다.
25.4.3.10 RemoveWaiters ( waiterList, count )
The abstract operation RemoveWaiters takes arguments waiterList (a WaiterList Record) and count (a non-negative integer or +∞) and returns a List of Waiter Records. It performs the following steps when called:
The abstract operation SuspendThisAgent takes arguments waiterList (a WaiterList Record) and waiterRecord (a Waiter Record) and returns unused. It performs the following steps when called:
LeaveCriticalSection(waiterList)를 수행하고 waiterRecord.[[TimeoutTime]] 시간이 될 때까지 주변 agent를 일시 중단하되, critical section을 나간 뒤 suspension이 효력을 발생하기 전에 도착한 알림이 lost되지 않는 방식으로 결합 연산을 수행한다. 주변 agent는 timeout으로 인해 또는 다른 agent가 waiterList와 thisAgent를 인자로 NotifyWaiter를 호출하는 것(즉 Atomics.notify 호출을 통해)으로만 suspension에서 깨어날 수 있다.
The abstract operation NotifyWaiter takes arguments waiterList (a WaiterList Record) and waiterRecord (a Waiter Record) and returns unused. It performs the following steps when called:
The abstract operation EnqueueResolveInAgentJob takes arguments agentSignifier (an agent signifier), promiseCapability (a PromiseCapability Record), and resolution ("ok" or "timed-out") and returns unused. It performs the following steps when called:
resolveJob을 agentSignifier, promiseCapability, 그리고 resolution을 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수가 없는 새로운 JobAbstract Closure라고 하자:
The abstract operation DoWait takes arguments mode (sync or async), typedArray (an ECMAScript language value), index (an ECMAScript language value), value (an ECMAScript language value), and timeout (an ECMAScript language value) and returns either a normal completion containing either an Object, "not-equal", "timed-out", or "ok", or a throw completion. It performs the following steps when called:
waiterRecord를 새로운 Waiter Record { [[AgentSignifier]]: thisAgent, [[PromiseCapability]]: promiseCapability, [[TimeoutTime]]: timeoutTime, [[Result]]: "ok" }라고 하자.
The abstract operation EnqueueAtomicsWaitAsyncTimeoutJob takes arguments waiterList (a WaiterList Record) and waiterRecord (a Waiter Record) and returns unused. It performs the following steps when called:
timeoutJob을 waiterList와 waiterRecord를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수가 없는 새로운 JobAbstract Closure라고 하자:
The abstract operation AtomicCompareExchangeInSharedBlock takes arguments block (a Shared Data Block), byteIndexInBuffer (an integer), elementSize (a non-negative integer), expectedBytes (a List of byte values), and replacementBytes (a List of byte values) and returns a List of byte values. It performs the following steps when called:
rawBytesRead를 요소들이 비결정적으로 선택된 바이트 값인 길이 elementSize의 List라고 하자.
NOTE: 구현에서 rawBytesRead는 기반 하드웨어에서 load-link, load-exclusive 또는 read-modify-write 명령의 피연산자 결과이다. 비결정성은 약한 일관성을 가진 하드웨어의 관찰 가능한 동작을 설명하기 위한 메모리 모델의 의미론적 규정이다.
Chosen Value Record { [[Event]]: event, [[ChosenValue]]: rawBytesRead }를 execution.[[ChosenValues]]에 추가한다.
rawBytesRead를 반환한다.
25.4.3.17 AtomicReadModifyWrite ( typedArray, index, value, op )
The abstract operation AtomicReadModifyWrite takes arguments typedArray (an ECMAScript language value), index (an ECMAScript language value), value (an ECMAScript language value), and op (a read-modify-write modification function) and returns either a normal completion containing either a Number or a BigInt, or a throw completion. op는 바이트 값의 두 List 인자를 받아 바이트 값의 List를 반환한다. 이 연산은 값을 원자적으로 로드하고, 다른 값과 결합한 뒤, 그 결합을 저장한다. 로드된 값을 반환한다. It performs the following steps when called:
The abstract operation ByteListBitwiseOp takes arguments op (&, ^, or |), xBytes (a List of byte values), and yBytes (a List of byte values) and returns a List of byte values. 이 연산은 인자의 모든 바이트 값에 대해 비트 연산을 원자적으로 수행하고 바이트 값의 List를 반환한다. It performs the following steps when called:
resultByte를 xByte와 yByte에 비트 포함 OR 연산을 적용한 결과라고 하자.
i를 i + 1로 설정한다.
resultByte를 result에 추가한다.
result를 반환한다.
25.4.3.19 ByteListEqual ( xBytes, yBytes )
The abstract operation ByteListEqual takes arguments xBytes (a List of byte values) and yBytes (a List of byte values) and returns a Boolean. It performs the following steps when called:
xBytes와 yBytes가 같은 수의 요소를 가지지 않으면, false를 반환한다.
i를 0이라고 하자.
xBytes의 각 요소 xByte에 대해, 다음을 수행한다.
yByte를 yBytes[i]라고 하자.
xByte ≠ yByte이면, false를 반환한다.
i를 i + 1로 설정한다.
true를 반환한다.
25.4.4 Atomics.add ( typedArray, index, value )
이 함수는 호출될 때 다음 단계를 수행한다:
add를 typedArray를 캡처하고 호출될 때 원자적으로 다음 단계를 수행하는, 매개변수 (xBytes, yBytes)를 가진 새로운 read-modify-write 수정 함수라고 하자:
이 함수는 최적화 primitive이다. 직관은 크기 n 바이트의 datum에 대한 atomic primitive(compareExchange, load, store, add, sub, and, or, xor, 또는 exchange)의 원자적 단계가 주변 agent가 그 datum을 구성하는 n 바이트 외부의 lock을 획득하지 않고 수행된다면, Atomics.isLockFree(n)가 true를 반환한다는 것이다. 고성능 알고리즘은 이 함수를 사용하여 critical section에서 lock을 사용할지 atomic 연산을 사용할지 결정한다. atomic primitive가 lock-free가 아니면 알고리즘이 자체 locking을 제공하는 것이 종종 더 효율적이다.
Atomics.isLockFree(4)는 알려진 모든 관련 하드웨어에서 지원될 수 있으므로 항상 true를 반환한다. 이를 가정할 수 있으면 일반적으로 프로그램이 단순해진다.
이 함수가 반환하는 값과 관계없이 모든 atomic 연산은 원자적임이 보장된다. 예를 들어 연산 도중에 visible operation이 발생하는 일은 결코 없다(예: "tearing").
[[Construct]] 내부 메서드를 가지지 않는다. new 연산자와 함께 생성자로 사용할 수 없다.
[[Call]] 내부 메서드를 가지지 않는다. 함수로 호출될 수 없다.
JSON Data Interchange Format은 ECMA-404에 정의되어 있다. 이 명세에서 사용되는 JSON interchange format은 ECMA-404에 설명된 것과 정확히 같다. JSON.parse와 JSON.stringify의 적합한 구현은 형식에서 어떤 삭제나 확장도 없이 ECMA-404 명세에 설명된 정확한 interchange format을 지원해야 한다.
25.5.1 JSON.isRawJSON ( obj )
이 함수는 호출될 때 다음 단계를 수행한다:
obj가 Object이고 obj가 [[IsRawJSON]] 내부 슬롯을 가지면, true를 반환한다.
false를 반환한다.
25.5.2 JSON.parse ( text [ , reviver ] )
이 함수는 JSON 텍스트(JSON 형식의 String)를 구문 분석하고 ECMAScript 언어 값을 생성한다. JSON 형식은 ECMAScript 리터럴, Array Initializer, Object Initializer의 구문과 유사한 구문으로 리터럴, 배열, 객체를 표현한다. 구문 분석 후 JSON 객체는 ECMAScript 객체로 실현된다. JSON 배열은 ECMAScript Array 인스턴스로 실현된다. JSON 문자열, 숫자, 불리언, null은 ECMAScript String, Number, Boolean, 그리고 null로 실현된다.
선택적 reviver 매개변수는 결과를 필터링하고 변환할 수 있는 함수이다. parse에 의해 생성된 각 값에 대해, reviver는 세 인자(연관된 속성 키, 값, 그리고 context 객체)와 함께 호출된다. 속성이 수정되지 않았고 그 값이 primitive이면, 제공된 context 객체는 대응하는 Parse Node의 소스 텍스트를 포함하는 "source" 속성을 가진다. 호출이 undefined를 반환하면, 속성은 삭제된다. 그렇지 않으면, 속성은 반환값을 사용하도록 재정의된다.
The abstract operation ParseJSON takes argument text (a String) and returns either a normal completion containing a Record with fields [[ParseNode]] (a Parse Node) and [[Value]] (an ECMAScript language value), or a throw completion. It performs the following steps when called:
StringToCodePoints(text)가 ECMA-404에 지정된 유효한 JSON 텍스트가 아니면, SyntaxError 예외를 던진다.
Record { [[ParseNode]]: script, [[Value]]: result }를 반환한다.
JSON.parse의 적합한 구현이 JSON 문법을 확장하는 것은 허용되지 않는다. 구현이 수정되거나 확장된 JSON interchange format을 지원하고자 한다면, 다른 parse 함수를 정의하여 그렇게 해야 한다.
Note 1
유효한 JSON 텍스트는 ECMAScript PrimaryExpression 구문의 부분집합이다. 단계 1는 jsonString이 그 부분집합에 부합하는지 검증하고, 단계 8는 평가가 적절한 타입의 값을 반환함을 단언한다.
그러나 13.2.5.6가 ParseJSON 동안 다르게 동작하기 때문에, 동일한 소스 텍스트가 JSON으로 평가될 때와 PrimaryExpression으로 평가될 때 서로 다른 결과를 생성할 수 있다. 더 나아가, 객체 리터럴에서 중복 "__proto__" 속성에 대한 Early Error 역시 ParseJSON 동안 적용되지 않으므로, ParseJSON이 받아들이는 모든 텍스트가 문법과 일치함에도 PrimaryExpression으로 유효한 것은 아니다.
Note 2
객체 안에 중복 name String이 있는 경우, 같은 키에 대해 어휘적으로 앞서는 값은 덮어써진다.
25.5.2.2 JSON Parse Record
JSON Parse Record는 JSON 텍스트에서 구문 분석된 값의 초기 상태를 설명하는 데 사용되는 Record 값이다.
[[Value]]가 Array가 아닌 Object이면, 이는 [[Value]]의 엔트리에 대응하는 JSON Parse Record들을 포함한다. 그렇지 않으면, 이는 빈 List이다.
25.5.2.3 CreateJSONParseRecord ( parseNode, key, val )
The abstract operation CreateJSONParseRecord takes arguments parseNode (a Parse Node), key (a property name), and val (an ECMAScript language value) and returns a JSON Parse Record. JSON 텍스트에서 구문 분석된 parseNode와 그 평가에 의해 생성된 val을 재귀적으로 결합한다. It performs the following steps when called:
The abstract operation InternalizeJSONProperty takes arguments holder (an Object), name (a String), reviver (a function object), and parseRecord (a JSON Parse Record or empty) and returns either a normal completion containing an ECMAScript language value or a throw completion.
Note
이 알고리즘은 [[Delete]] 또는 CreateDataProperty가 false를 반환해도 의도적으로 예외를 던지지 않는다.
The abstract operation ShallowestContainedJSONValue takes argument root (a Parse Node) and returns a Parse Node or empty. root에 뿌리를 둔 parse tree에 대해 breadth-first search를 수행하고, JSON 값에 대응하는 nonterminal의 인스턴스인 첫 번째 노드를 반환하거나, 그러한 노드가 없으면 empty를 반환한다. It performs the following steps when called:
The syntax-directed operation JSONArrayLiteralContentNodes takes no arguments and returns a List of Parse Nodes. It is defined piecewise over the following productions:
jsonString의 첫 번째 코드 단위가 ASCII 소문자 코드 단위(0x0061부터 0x007A까지 포함), ASCII 숫자 코드 단위(0x0030부터 0x0039까지 포함), 0x0022 (QUOTATION MARK), 또는 0x002D (HYPHEN-MINUS) 중 어느 것도 아니면, SyntaxError 예외를 던진다.
jsonString의 마지막 코드 단위가 ASCII 소문자 코드 단위(0x0061부터 0x007A까지 포함), ASCII 숫자 코드 단위(0x0030부터 0x0039까지 포함), 또는 0x0022 (QUOTATION MARK) 중 어느 것도 아니면, SyntaxError 예외를 던진다.
25.5.4 JSON.stringify ( value [ , replacer [ , space ] ] )
이 함수는 ECMAScript 언어 값을 나타내는 UTF-16 인코딩 JSON 형식의 String 또는 undefined를 반환한다. 세 매개변수를 받을 수 있다. value 매개변수는 ECMAScript 언어 값으로, 보통 객체나 배열이지만 String, Boolean, Number 또는 null일 수도 있다. 선택적 replacer 매개변수는 객체와 배열이 stringified되는 방식을 변경하는 함수이거나, stringified될 객체 속성을 선택하기 위한 포함 목록으로 동작하는 String과 Number의 배열이다. 선택적 space 매개변수는 결과에 공백을 삽입하여 사람이 읽기 쉽게 할 수 있는 String 또는 Number이다.
JSON 구조는 임의의 깊이로 중첩될 수 있지만, 비순환이어야 한다. value가 순환 구조이거나 순환 구조를 포함하면, 이 함수는 TypeError 예외를 던져야 한다. 다음은 stringify할 수 없는 값의 예이다:
a = [];
a[0] = a;
my_text = JSON.stringify(a); // 이는 TypeError를 던져야 한다.
Note 2
Symbolic primitive 값은 다음과 같이 렌더링된다:
null 값은 JSON 텍스트에서 String 값 "null"로 렌더링된다.
undefined 값은 렌더링되지 않는다.
true 값은 JSON 텍스트에서 String 값 "true"로 렌더링된다.
false 값은 JSON 텍스트에서 String 값 "false"로 렌더링된다.
Note 3
String 값은 QUOTATION MARK (") 코드 단위로 감싸진다. 코드 단위 "와 \는 \ 접두사로 escape된다. 제어 문자 코드 단위는 escape sequence \uHHHH 또는 더 짧은 형식 \b (BACKSPACE), \f (FORM FEED), \n (LINE FEED), \r (CARRIAGE RETURN), \t (CHARACTER TABULATION)로 대체된다.
Note 4
유한한 숫자는 ToString(number)을 호출한 것처럼 stringify된다. 부호와 관계없이 NaN과 Infinity는 String 값 "null"로 표현된다.
Note 5
JSON 표현을 가지지 않는 값(예: undefined 및 함수)은 String을 생성하지 않는다. 대신 undefined 값을 생성한다. 배열에서 이러한 값은 String 값 "null"로 표현된다. 객체에서는 표현 불가능한 값으로 인해 해당 속성이 stringification에서 제외된다.
Note 6
객체는 U+007B (LEFT CURLY BRACKET) 뒤에 U+002C (COMMA)로 구분된 0개 이상의 속성이 오고, U+007D (RIGHT CURLY BRACKET)로 닫히는 방식으로 렌더링된다. 속성은 속성 이름을 나타내는 따옴표로 감싼 String, U+003A (COLON), 그리고 stringified된 속성 값이다. 배열은 여는 U+005B (LEFT SQUARE BRACKET) 뒤에 U+002C (COMMA)로 구분된 0개 이상의 값이 오고, 닫는 U+005D (RIGHT SQUARE BRACKET)로 렌더링된다.
25.5.4.1 JSON Serialization Record
JSON Serialization Record는 JSON 형식으로의 직렬화를 가능하게 하는 데 사용되는 Record 값이다.
The abstract operation SerializeJSONProperty takes arguments state (a JSON Serialization Record), key (a String), and holder (an Object) and returns either a normal completion containing either a String or undefined, or a throw completion. It performs the following steps when called:
The abstract operation QuoteJSONString takes argument value (a String) and returns a String. value를 0x0022 (QUOTATION MARK) 코드 단위로 감싸고 그 안의 특정 다른 코드 단위를 escape한다. 이 연산은 6.1.4에 설명된 대로 value를 UTF-16으로 인코딩된 코드 포인트의 시퀀스로 해석한다. It performs the following steps when called:
product를 코드 단위 0x0022 (QUOTATION MARK)만으로 구성된 String 값이라고 하자.
product를 product와 코드 단위 0x0022 (QUOTATION MARK)의 문자열 연결로 설정한다.
product를 반환한다.
Table 77: JSON 단일 문자 escape sequence
코드 포인트
Unicode 문자 이름
Escape Sequence
U+0008
BACKSPACE
\b
U+0009
CHARACTER TABULATION
\t
U+000A
LINE FEED (LF)
\n
U+000C
FORM FEED (FF)
\f
U+000D
CARRIAGE RETURN (CR)
\r
U+0022
QUOTATION MARK
\"
U+005C
REVERSE SOLIDUS
\\
25.5.4.4 UnicodeEscape ( constructor )
The abstract operation UnicodeEscape takes argument constructor (a code unit) and returns a String. constructor를 Unicode escape sequence로 나타낸다. It performs the following steps when called:
코드 단위 0x005C (REVERSE SOLIDUS), "u", 그리고 StringPad(hex, 4, "0", start)의 문자열 연결을 반환한다.
25.5.4.5 SerializeJSONObject ( state, value )
The abstract operation SerializeJSONObject takes arguments state (a JSON Serialization Record) and value (an Object) and returns either a normal completion containing a String or a throw completion. 객체를 직렬화한다. It performs the following steps when called:
state.[[Stack]]이 value를 포함하면, 구조가 순환적이므로 TypeError 예외를 던진다.
member를 member와 코드 단위 0x0020 (SPACE)의 문자열 연결로 설정한다.
member를 member와 strP의 문자열 연결로 설정한다.
member를 partial에 추가한다.
partial이 비어 있으면,
final을 "{}"라고 하자.
그렇지 않으면,
state.[[Gap]]이 빈 String이면,
properties를 partial의 모든 요소 String을 연결하되 인접한 각 String 쌍 사이에 코드 단위 0x002C (COMMA)를 넣어 형성된 String 값이라고 하자. 첫 번째 String 앞이나 마지막 String 뒤에는 쉼표를 삽입하지 않는다.
final을 "{", properties, 그리고 "}"의 문자열 연결이라고 하자.
그렇지 않으면,
separator를 코드 단위 0x002C (COMMA), 코드 단위 0x000A (LINE FEED), 그리고 state.[[Indent]]의 문자열 연결이라고 하자.
properties를 partial의 모든 요소 String을 연결하되 인접한 각 String 쌍 사이에 separator를 넣어 형성된 String 값이라고 하자. separator String은 첫 번째 String 앞이나 마지막 String 뒤에는 삽입하지 않는다.
final을 "{", 코드 단위 0x000A (LINE FEED), state.[[Indent]], properties, 코드 단위 0x000A (LINE FEED), stepBack, 그리고 "}"의 문자열 연결이라고 하자.
state.[[Stack]]의 마지막 요소를 제거한다.
state.[[Indent]]를 stepBack으로 설정한다.
final을 반환한다.
25.5.4.6 SerializeJSONArray ( state, value )
The abstract operation SerializeJSONArray takes arguments state (a JSON Serialization Record) and value (an Object) and returns either a normal completion containing a String or a throw completion. 배열을 직렬화한다. It performs the following steps when called:
state.[[Stack]]이 value를 포함하면, 구조가 순환적이므로 TypeError 예외를 던진다.
properties를 partial의 모든 요소 String을 연결하되 인접한 각 String 쌍 사이에 코드 단위 0x002C (COMMA)를 넣어 형성된 String 값이라고 하자. 첫 번째 String 앞이나 마지막 String 뒤에는 쉼표를 삽입하지 않는다.
final을 "[", properties, 그리고 "]"의 문자열 연결이라고 하자.
그렇지 않으면,
separator를 코드 단위 0x002C (COMMA), 코드 단위 0x000A (LINE FEED), 그리고 state.[[Indent]]의 문자열 연결이라고 하자.
properties를 partial의 모든 요소 String을 연결하되 인접한 각 String 쌍 사이에 separator를 넣어 형성된 String 값이라고 하자. separator String은 첫 번째 String 앞이나 마지막 String 뒤에는 삽입하지 않는다.
final을 "[", 코드 단위 0x000A (LINE FEED), state.[[Indent]], properties, 코드 단위 0x000A (LINE FEED), stepBack, 그리고 "]"의 문자열 연결이라고 하자.
state.[[Stack]]의 마지막 요소를 제거한다.
state.[[Indent]]를 stepBack으로 설정한다.
final을 반환한다.
Note
배열의 표현에는 +0𝔽(포함)부터 array.length(제외)까지의 구간에 있는 요소만 포함된다. 키가 배열 인덱스가 아닌 속성은 stringification에서 제외된다. 배열은 여는 LEFT SQUARE BRACKET, COMMA로 구분된 요소들, 그리고 닫는 RIGHT SQUARE BRACKET으로 stringified된다.
클래스 정의의 extends 절의 값으로 사용될 수 있다. 지정된 WeakRef 동작을 상속하려는 서브클래스 생성자는 WeakRef.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성하고 초기화하기 위해 WeakRef 생성자에 대한 super 호출을 포함해야 한다.
이 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성 특성을 가진다.
26.1.4 WeakRef 추상 연산
26.1.4.1 WeakRefDeref ( weakRef )
The abstract operation WeakRefDeref takes argument weakRef (a WeakRef) and returns an ECMAScript language value. It performs the following steps when called:
클래스 정의의 extends 절의 값으로 사용될 수 있다. 지정된 FinalizationRegistry 동작을 상속하려는 서브클래스 생성자는 FinalizationRegistry.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성하고 초기화하기 위해 FinalizationRegistry 생성자에 대한 super 호출을 포함해야 한다.
cell을 Record { [[WeakRefTarget]]: target, [[HeldValue]]: heldValue, [[UnregisterToken]]: unregisterToken }이라고 하자.
cell을 finalizationRegistry.[[Cells]]에 추가한다.
undefined를 반환한다.
Note
이 명세의 알고리즘과 정의에 따르면 finalizationRegistry.[[Cells]]가 cell을 포함할 때 cell.[[HeldValue]]는 live이다. 그러나 이것이 반드시 cell.[[UnregisterToken]] 또는 cell.[[Target]]이 live임을 의미하지는 않는다. 예를 들어, 객체를 자기 자신을 unregister token으로 하여 등록한다고 해서 그 객체가 영원히 live 상태로 유지되지는 않는다.
인터페이스는 관련 값이 특정 명세와 일치하는 프로퍼티 키의 집합이다. 인터페이스의 명세에 설명된 모든 프로퍼티를 제공하는 모든 객체는 그 인터페이스를 준수한다. 인터페이스는 별개의 객체로 표현되지 않는다. 어떤 인터페이스를 준수하는 객체는 별도로 구현된 것이 많이 있을 수 있다. 개별 객체는 여러 인터페이스를 준수할 수 있다.
반환된 객체는 IteratorResult 인터페이스를 준수해야 한다. iterator의 next 메서드에 대한 이전 호출이 "done" 프로퍼티가 true인 IteratorResult 객체를 반환했다면, 그 객체의 next 메서드에 대한 모든 이후 호출도 "done" 프로퍼티가 true인 IteratorResult 객체를 반환해야 한다. 그러나 이 요구 사항은 강제되지 않는다.
Note 1
next 함수에 인자를 전달할 수 있지만, 그 해석과 유효성은 대상 iterator에 따라 달라진다. for-of 문과 iterator의 다른 일반적인 사용자는 어떤 인자도 전달하지 않으므로, 그러한 방식으로 사용될 것으로 예상하는 iterator 객체는 인자 없이 호출되는 경우를 처리할 준비가 되어 있어야 한다.
반환된 객체는 IteratorResult 인터페이스를 준수해야 한다. 이 메서드를 호출하면 호출자가 iterator에 대해 더 이상 next 메서드 호출을 할 의도가 없음을 iterator 객체에 알린다. 반환된 IteratorResult 객체는 일반적으로 값이 true인 "done" 프로퍼티와, return 메서드의 인자로 전달된 값을 갖는 "value" 프로퍼티를 가진다. 그러나 이 요구 사항은 강제되지 않는다.
"throw"
IteratorResult 객체를 반환하는 함수
반환된 객체는 IteratorResult 인터페이스를 준수해야 한다. 이 메서드를 호출하면 호출자가 오류 조건을 감지했음을 iterator 객체에 알린다. 인자는 오류 조건을 식별하는 데 사용될 수 있으며 일반적으로 예외 객체가 된다. 전형적인 응답은 인자로 전달된 값을 throw하는 것이다. 메서드가 throw하지 않으면, 반환된 IteratorResult 객체는 일반적으로 값이 true인 "done" 프로퍼티를 가진다.
Note 2
일반적으로 이러한 메서드의 호출자는 호출하기 전에 그 존재 여부를 확인해야 한다. for-of, yield*, 배열 구조 분해를 포함한 특정 ECMAScript 언어 기능은 존재 여부 확인을 수행한 뒤 이러한 메서드를 호출한다. iterable 객체를 인자로 받는 대부분의 ECMAScript 라이브러리 함수도 이를 조건부로 호출한다.
반환된 promise는 이행될 때 IteratorResult 인터페이스를 준수하는 객체로 이행되어야 한다. async iterator의 next 메서드에 대한 이전 호출이 "done" 프로퍼티가 true인 IteratorResult 객체에 대한 promise를 반환했다면, 그 객체의 next 메서드에 대한 모든 이후 호출도 "done" 프로퍼티가 true인 IteratorResult 객체에 대한 promise를 반환해야 한다. 그러나 이 요구 사항은 강제되지 않는다.
추가로, 이행 값으로 쓰이는 IteratorResult 객체는 값이 promise(또는 "thenable")가 아닌 "value" 프로퍼티를 가져야 한다. 그러나 이 요구 사항도 강제되지 않는다.
Note 1
next 함수에 인자를 전달할 수 있지만, 그 해석과 유효성은 대상 async iterator에 따라 달라진다. for-await-of 문과 async iterator의 다른 일반적인 사용자는 어떤 인자도 전달하지 않으므로, 그러한 방식으로 사용될 것으로 예상하는 async iterator 객체는 인자 없이 호출되는 경우를 처리할 준비가 되어 있어야 한다.
반환된 promise는 이행될 때 IteratorResult 인터페이스를 준수하는 객체로 이행되어야 한다. 이 메서드를 호출하면 호출자가 async iterator에 대해 더 이상 next 메서드 호출을 할 의도가 없음을 async iterator 객체에 알린다. 반환된 promise는 일반적으로 값이 true인 "done" 프로퍼티와, return 메서드의 인자로 전달된 값을 갖는 "value" 프로퍼티를 가진 IteratorResult 객체로 이행된다. 그러나 이 요구 사항은 강제되지 않는다.
추가로, 이행 값으로 쓰이는 IteratorResult 객체는 값이 promise(또는 "thenable")가 아닌 "value" 프로퍼티를 가져야 한다. 인자 값이 전형적인 방식으로 사용된다면, 그것이 거부된 promise인 경우 같은 이유로 거부된 promise가 반환되어야 하며, 그것이 이행된 promise인 경우 그 이행 값이 반환된 promise의 IteratorResult 객체 이행 값의 "value" 프로퍼티로 사용되어야 한다. 그러나 이러한 요구 사항도 강제되지 않는다.
"throw"
IteratorResult 객체에 대한 promise를 반환하는 함수
반환된 promise는 이행될 때 IteratorResult 인터페이스를 준수하는 객체로 이행되어야 한다. 이 메서드를 호출하면 호출자가 오류 조건을 감지했음을 async iterator 객체에 알린다. 인자는 오류 조건을 식별하는 데 사용될 수 있으며 일반적으로 예외 객체가 된다. 전형적인 응답은 인자로 전달된 값으로 거부되는 거부된 promise를 반환하는 것이다.
반환된 promise가 이행되면, IteratorResult 객체 이행 값은 일반적으로 값이 true인 "done" 프로퍼티를 가진다. 추가로, 값이 promise(또는 "thenable")가 아닌 "value" 프로퍼티를 가져야 하지만, 이 요구 사항은 강제되지 않는다.
Note 2
일반적으로 이러한 메서드의 호출자는 호출하기 전에 그 존재 여부를 확인해야 한다. for-await-of 및 yield*를 포함한 특정 ECMAScript 언어 기능은 존재 여부 확인을 수행한 뒤 이러한 메서드를 호출한다.
이는 iteratornext 메서드 호출의 결과 상태이다. iterator의 끝에 도달했다면 "done"은 true이다. 끝에 도달하지 않았다면 "done"은 false이며 값을 사용할 수 있다. "done" 프로퍼티(자체 또는 상속된)가 존재하지 않으면, 그 값은 false인 것으로 간주된다.
done이 false이면, 이는 현재 반복 요소 값이다. done이 true이면, 이는 iterator가 제공한 경우 iterator의 반환 값이다. iterator에 반환 값이 없으면, "value"는 undefined이다. 이 경우, 명시적인 "value" 프로퍼티를 상속하지 않는다면 준수 객체에서 "value" 프로퍼티가 없을 수 있다.
27.1.2 Iterator Helper 객체
Iterator Helper 객체는 어떤 특정 소스 iterator 객체의 지연 변환을 나타내는 ordinary object이다. Iterator Helper 객체에는 이름이 있는 생성자가 없다. 대신, Iterator Helper 객체는 Iterator 인스턴스 객체의 특정 메서드를 호출하여 생성된다.
이 명세에서 iterator 인터페이스를 구현하도록 정의된 모든 객체도 %Iterator.prototype%에서 상속한다. ECMAScript 코드도 %Iterator.prototype%에서 상속하는 객체를 정의할 수 있다. %Iterator.prototype%은 모든 iterator 객체에 적용 가능한 추가 메서드가 추가될 수 있는 위치를 제공한다.
다음 표현식은 ECMAScript 코드가 %Iterator.prototype% 객체에 접근할 수 있는 한 가지 방법이다:
Iterator.prototype[%Symbol.toStringTag%]는 속성 { [[Enumerable]]: false, [[Configurable]]: true }를 가진 accessor property이다. [[Get]] 및 [[Set]] 속성은 다음과 같이 정의된다:
27.1.3.3.14.1 get Iterator.prototype [ %Symbol.toStringTag% ]
[[Get]] 속성의 값은 인자를 필요로 하지 않는 built-in function이다. 호출될 때 다음 단계를 수행한다:
"Iterator"를 반환한다.
27.1.3.3.14.2 set Iterator.prototype [ %Symbol.toStringTag% ]
[[Set]] 속성의 값은 인자 v를 받는 built-in function이다. 호출될 때 다음 단계를 수행한다:
이 명세에서 async iterator 인터페이스를 구현하도록 정의된 모든 객체도 %AsyncIteratorPrototype%에서 상속한다. ECMAScript 코드도 %AsyncIteratorPrototype%에서 상속하는 객체를 정의할 수 있다. %AsyncIteratorPrototype% 객체는 모든 async iterator 객체에 적용 가능한 추가 메서드가 추가될 수 있는 위치를 제공한다.
Async-from-Sync Iterator 객체는 특정 동기 iterator를 적응시키는 async iterator이다. Async-from-Sync Iterator 객체는 ECMAScript 코드에서 직접 접근할 수 없다. Async-from-Sync Iterator 객체에는 이름이 있는 생성자가 없다. 대신, Async-from-Sync Iterator 객체는 필요에 따라 CreateAsyncFromSyncIterator abstract operation에 의해 생성된다.
The abstract operation CreateAsyncFromSyncIterator takes argument syncIteratorRecord (an Iterator Record) and returns an Iterator Record. 동기 Iterator Record로부터 async Iterator Record를 생성하는 데 사용된다. It performs the following steps when called:
The abstract operation AsyncFromSyncIteratorContinuation takes arguments result (an Object), promiseCapability (a PromiseCapability Record for an intrinsic %Promise%), syncIteratorRecord (an Iterator Record), and closeOnRejection (a Boolean) and returns a Promise. It performs the following steps when called:
NOTE: promiseCapability은 intrinsic %Promise%에서 파생되므로, 아래 IfAbruptRejectPromise 사용에 수반되는 promiseCapability.[[Reject]] 호출은 throw하지 않음이 보장된다.
NOTE: onRejected는 IteratorResult 객체가 산출한 "value" 프로퍼티가 거부된 promise일 때 Iterator를 닫는 데 사용된다.
PerformPromiseThen(valueWrapper, onFulfilled, onRejected, promiseCapability)를 수행한다.
promiseCapability.[[Promise]]를 반환한다.
27.2 Promise 객체
Promise는 지연된(그리고 가능하게는 비동기적인) 계산의 최종 결과를 위한 자리표시자로 사용되는 객체이다.
모든 Promise는 서로 배타적인 세 상태 중 하나에 있다: fulfilled, rejected, 그리고 pending:
promise p는 p.then(f, r)이 함수 f를 호출하는 Job을 즉시 큐에 넣는다면 fulfilled이다.
promise p는 p.then(f, r)이 함수 r을 호출하는 Job을 즉시 큐에 넣는다면 rejected이다.
promise는 fulfilled도 rejected도 아니라면 pending이다.
promise는 pending이 아니면, 즉 fulfilled이거나 rejected이면 settled되었다고 한다.
promise는 settled되었거나 다른 promise의 상태와 일치하도록 “고정”되었다면 resolved되었다. resolved promise를 resolve하거나 reject하려는 시도는 아무 효과가 없다. promise는 resolved가 아니면 unresolved이다. unresolved promise는 항상 pending 상태에 있다. resolved promise는 pending, fulfilled 또는 rejected일 수 있다.
27.2.1 Promise 추상 연산
27.2.1.1 PromiseCapability 레코드
PromiseCapability 레코드는 Promise 또는 promise-like 객체를 그 promise를 resolve하거나 reject할 수 있는 함수들과 함께 캡슐화하는 데 사용되는 Record 값이다. PromiseCapability 레코드는 NewPromiseCapability추상 연산에 의해 생성된다.
이 레코드가 reaction handler를 제공하는 promise의 capability.
[[Type]]
fulfill 또는 reject
[[Type]]은 [[Handler]]가 empty일 때 settlement 타입에 특정한 동작을 허용하기 위해 사용된다.
[[Handler]]
JobCallback 레코드 또는 empty
들어오는 값에 적용되어야 하는 함수이며, 그 반환 값은 파생 promise에 일어날 일을 결정한다. [[Handler]]가 empty이면, 대신 [[Type]]의 값에 의존하는 함수가 사용된다.
27.2.1.3 CreateResolvingFunctions ( toResolve )
The abstract operation CreateResolvingFunctions takes argument toResolve (a Promise) and returns a Record with fields [[Resolve]] (a function object) and [[Reject]] (a function object). It performs the following steps when called:
promiseOrEmpty를 Record { [[Value]]: toResolve }로 둔다.
resolveSteps를 promiseOrEmpty를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수 (resolution)를 가진 새로운 Abstract Closure로 둔다:
Record { [[Resolve]]: resolve, [[Reject]]: reject }를 반환한다.
27.2.1.4 FulfillPromise ( promise, value )
The abstract operation FulfillPromise takes arguments promise (a Promise) and value (an ECMAScript language value) and returns unused. It performs the following steps when called:
The abstract operation NewPromiseCapability takes argument constructor (an ECMAScript language value) and returns either a normal completion containing a PromiseCapability Record or a throw completion. 이는 built-in Promise 생성자의 방식대로 constructor를 생성자로 사용하여 promise를 만들고 그 resolve와 reject 함수를 추출하려 시도한다. promise와 resolve 및 reject 함수는 새로운 PromiseCapability 레코드를 초기화하는 데 사용된다. It performs the following steps when called:
이 추상 연산은 전달된 executor 함수 인자를 Promise 생성자와 같은 방식으로 호출하는 모든 생성자에 대해 일반적이므로 Promise 서브클래싱을 지원한다. 이는 Promise 생성자의 정적 메서드를 모든 서브클래스로 일반화하는 데 사용된다.
27.2.1.6 IsPromise ( value )
The abstract operation IsPromise takes argument value (an ECMAScript language value) and returns a Boolean. 객체에서 promise brand를 확인한다. It performs the following steps when called:
value가 Object가 아니면, false를 반환한다.
value가 [[PromiseState]] 내부 슬롯을 가지지 않으면, false를 반환한다.
true를 반환한다.
27.2.1.7 RejectPromise ( promise, reason )
The abstract operation RejectPromise takes arguments promise (a Promise) and reason (an ECMAScript language value) and returns unused. It performs the following steps when called:
The abstract operation TriggerPromiseReactions takes arguments reactions (a List of PromiseReaction Records) and argument (an ECMAScript language value) and returns unused. reactions의 각 레코드에 대해 새로운 Job을 큐에 넣는다. 각각의 Job은 PromiseReaction 레코드의 [[Type]]과 [[Handler]]를 처리하고, [[Handler]]가 empty가 아니면 주어진 인자를 전달하여 그것을 호출한다. [[Handler]]가 empty이면, 동작은 [[Type]]에 의해 결정된다. It performs the following steps when called:
The host-defined abstract operation HostPromiseRejectionTracker takes arguments promise (a Promise) and operation ("reject" or "handle") and returns unused. 호스트 환경이 promise rejection을 추적할 수 있게 한다.
HostPromiseRejectionTracker의 기본 구현은 unused를 반환하는 것이다.
Note 1
HostPromiseRejectionTracker는 두 시나리오에서 호출된다:
promise가 handler 없이 rejected될 때, operation 인자가 "reject"로 설정되어 호출된다.
rejected promise에 처음으로 handler가 추가될 때, operation 인자가 "handle"로 설정되어 호출된다.
HostPromiseRejectionTracker의 전형적인 구현은 처리되지 않은 rejection을 개발자에게 알리려 할 수 있으며, 동시에 그런 이전 알림이 나중에 새로운 handler의 연결로 무효화되는 경우에도 알리도록 주의할 수 있다.
Note 2
operation이 "handle"이면, 구현은 garbage collection을 방해하는 방식으로 promise에 대한 참조를 유지해서는 안 된다. operation이 "reject"이면, rejection은 드물고 hot code path에 있지 않을 것으로 예상되므로 구현은 promise에 대한 참조를 유지할 수 있다.
The abstract operation NewPromiseReactionJob takes arguments reaction (a PromiseReaction Record) and argument (an ECMAScript language value) and returns a Record with fields [[Job]] (a JobAbstract Closure) and [[Realm]] (a Realm Record or null). 들어오는 값에 적절한 handler를 적용하고, handler의 반환 값을 사용하여 해당 handler와 관련된 파생 promise를 resolve하거나 reject하는 새로운 JobAbstract Closure를 반환한다. It performs the following steps when called:
job을 reaction과 argument를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수가 없는 새로운 JobAbstract Closure로 둔다:
NOTE: handler가 undefined가 아닌 한 handlerRealm은 결코 null이 아니다. handler가 revoked Proxy이고 어떤 ECMAScript 코드도 실행되지 않을 때, handlerRealm은 오류 객체를 생성하는 데 사용된다.
Record { [[Job]]: job, [[Realm]]: handlerRealm }를 반환한다.
27.2.2.2 NewPromiseResolveThenableJob ( promiseToResolve, thenable, then )
The abstract operation NewPromiseResolveThenableJob takes arguments promiseToResolve (a Promise), thenable (an Object), and then (a JobCallback Record) and returns a Record with fields [[Job]] (a JobAbstract Closure) and [[Realm]] (a Realm Record). It performs the following steps when called:
job을 promiseToResolve, thenable, 그리고 then을 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수가 없는 새로운 JobAbstract Closure로 둔다:
클래스 정의의 extends 절에서 값으로 사용될 수 있다. 지정된 Promise 동작을 상속하려는 서브클래스 생성자는 Promise 및 Promise.prototype built-in 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성하고 초기화하기 위해 Promise 생성자에 대한 super 호출을 포함해야 한다.
? Call(resolvingFunctions.[[Reject]], undefined, « completion.[[Value]] »)를 수행한다.
promise를 반환한다.
Note
executor 인자는 함수 객체여야 한다. 이 Promise가 나타내는, 가능하게는 지연된 동작의 시작과 완료 보고를 위해 호출된다. executor는 두 인자 resolve와 reject로 호출된다. 이들은 executor 함수가 지연된 계산의 최종 완료 또는 실패를 보고하기 위해 사용할 수 있는 함수이다. executor 함수에서 반환된다는 것은 지연된 동작이 완료되었다는 뜻이 아니라, 결국 그 지연된 동작을 수행하라는 요청이 수락되었다는 뜻일 뿐이다.
executor 함수에 전달되는 resolve 함수는 단일 인자를 받는다. executor 코드는 결국 관련 Promise를 resolve하고자 함을 나타내기 위해 resolve 함수를 호출할 수 있다. resolve 함수에 전달된 인자는 지연된 동작의 최종 값을 나타내며, 실제 fulfillment 값이거나 fulfilled되면 그 값을 제공할 다른 promise일 수 있다.
executor 함수에 전달되는 reject 함수는 단일 인자를 받는다. executor 코드는 결국 관련 Promise가 rejected되며 결코 fulfilled되지 않을 것임을 나타내기 위해 reject 함수를 호출할 수 있다. reject 함수에 전달된 인자는 promise의 rejection 값으로 사용된다. 일반적으로 Error 객체가 된다.
Promise 생성자가 executor 함수에 전달하는 resolve 및 reject 함수는 실제로 관련 promise를 resolve하고 reject할 수 있는 capability를 가진다. 서브클래스는 resolve 및 reject에 대해 사용자 정의 값을 전달하는 다른 생성자 동작을 가질 수 있다.
이 함수는 전달된 promise들의 fulfillment 값 배열로 fulfilled되는 새 promise를 반환하거나, rejected되는 첫 번째 전달 promise의 reason으로 rejected된다. 이 알고리즘을 실행하면서 전달된 iterable의 모든 요소를 promise로 resolve한다.
The abstract operation PerformPromiseAll takes arguments iteratorRecord (an Iterator Record), constructor (a constructor), resultCapability (a PromiseCapability Record), and promiseResolve (a function object) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:
NOTE: remainingElementsCount는 잘못 동작하는 "then"이 입력 iterator가 소진되기 전에 전달된 callback을 호출하는 경우에도 resultCapability.[[Resolve]]가 한 번만 호출되도록 보장하기 위해 0 대신 1에서 시작한다.
remainingElementsCount를 Record { [[Value]]: 1 }로 둔다.
onFulfilled를 CreateBuiltinFunction(fulfilledSteps, 1, "", « [[AlreadyCalled]], [[Index]] »)로 둔다.
onFulfilled.[[AlreadyCalled]]를 false로 설정한다.
onFulfilled.[[Index]]를 index로 설정한다.
index를 index + 1로 설정한다.
remainingElementsCount.[[Value]]를 remainingElementsCount.[[Value]] + 1로 설정한다.
? Invoke(nextPromise, "then", « onFulfilled, resultCapability.[[Reject]] »)를 수행한다.
27.2.4.2 Promise.allSettled ( iterable )
이 함수는 모든 원래 promise가 settled, 즉 fulfilled 또는 rejected가 된 뒤에야 promise 상태 snapshot의 배열로 fulfilled되는 promise를 반환한다. 이 알고리즘을 실행하면서 전달된 iterable의 모든 요소를 promise로 resolve한다.
The abstract operation PerformPromiseAllSettled takes arguments iteratorRecord (an Iterator Record), constructor (a constructor), resultCapability (a PromiseCapability Record), and promiseResolve (a function object) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:
NOTE: remainingElementsCount는 잘못 동작하는 "then"이 입력 iterator가 소진되기 전에 전달된 callback 중 하나를 호출하는 경우에도 resultCapability.[[Resolve]]가 한 번만 호출되도록 보장하기 위해 0 대신 1에서 시작한다.
remainingElementsCount를 Record { [[Value]]: 1 }로 둔다.
remainingElementsCount.[[Value]]를 remainingElementsCount.[[Value]] + 1로 설정한다.
? Invoke(nextPromise, "then", « onFulfilled, onRejected »)를 수행한다.
27.2.4.3 Promise.any ( iterable )
이 함수는 주어진 promise 중 처음으로 fulfilled되는 promise에 의해 fulfilled되거나, 주어진 promise가 모두 rejected되면 rejection reason들을 담은 AggregateError로 rejected되는 promise를 반환한다. 이 알고리즘을 실행하면서 전달된 iterable의 모든 요소를 promise로 resolve한다.
The abstract operation PerformPromiseAny takes arguments iteratorRecord (an Iterator Record), constructor (a constructor), resultCapability (a PromiseCapability Record), and promiseResolve (a function object) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:
NOTE: remainingElementsCount는 잘못 동작하는 "then"이 입력 iterator가 소진되기 전에 전달된 callback을 호출하는 경우에도 resultCapability.[[Reject]]가 한 번만 호출되도록 보장하기 위해 0 대신 1에서 시작한다.
remainingElementsCount를 Record { [[Value]]: 1 }로 둔다.
The abstract operation PerformPromiseRace takes arguments iteratorRecord (an Iterator Record), constructor (a constructor), resultCapability (a PromiseCapability Record), and promiseResolve (a function object) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:
The abstract operation PromiseResolve takes arguments constructor (an Object) and resolution (an ECMAScript language value) and returns either a normal completion containing an Object or a throw completion. resolution으로 resolved된 새 promise를 반환한다. It performs the following steps when called:
The abstract operation PerformPromiseThen takes arguments promise (a Promise), onFulfilled (an ECMAScript language value), and onRejected (an ECMAScript language value) and optional argument resultCapability (a PromiseCapability Record) and returns an Object or undefined. promise에 대해 onFulfilled와 onRejected를 settlement action으로 사용하여 “then” 연산을 수행한다. resultCapability가 전달되면, 결과는 resultCapability의 promise를 갱신하여 저장된다. 전달되지 않으면, PerformPromiseThen은 결과가 중요하지 않은 명세 내부 연산에 의해 호출되는 것이다. It performs the following steps when called:
생성자가 아니라 함수로 호출될 때 새로운 GeneratorFunction을 생성하고 초기화한다. 따라서 함수 호출 GeneratorFunction (…)은 같은 인자를 가진 객체 생성 표현식 new GeneratorFunction (…)과 동등하다.
클래스 정의의 extends 절의 값으로 사용될 수 있다. 지정된 GeneratorFunction 동작을 상속하려는 서브클래스 생성자는 built-in GeneratorFunction 동작에 필요한 내부 슬롯으로 서브클래스 인스턴스를 생성하고 초기화하기 위해 GeneratorFunction 생성자에 대한 super 호출을 포함해야 한다. generator function 객체를 정의하는 모든 ECMAScript 구문 형식은 GeneratorFunction의 직접 인스턴스를 생성한다. GeneratorFunction 서브클래스의 인스턴스를 생성하는 구문적 수단은 없다.
이 프로퍼티는 속성 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }를 가진다.
27.3.4 GeneratorFunction 인스턴스
모든 GeneratorFunction 인스턴스는 ECMAScript function object이며 Table 25에 나열된 내부 슬롯을 가진다. 그러한 모든 인스턴스의 [[IsClassConstructor]] 내부 슬롯 값은 false이다.
각 GeneratorFunction 인스턴스는 다음 own 프로퍼티를 가진다:
27.3.4.1 length
20.2.4.1에 주어진 Function 인스턴스의 "length" 프로퍼티에 대한 명세는 GeneratorFunction 인스턴스에도 적용된다.
27.3.4.2 name
20.2.4.2에 주어진 Function 인스턴스의 "name" 프로퍼티에 대한 명세는 GeneratorFunction 인스턴스에도 적용된다.
27.3.4.3 prototype
GeneratorFunction 인스턴스가 생성될 때마다 또 다른 ordinary object도 생성되며, 이는 generator function의 "prototype" 프로퍼티의 초기 값이 된다. generator function 객체가 [[Call]]을 사용하여 호출될 때 새로 생성된 Generator의 [[Prototype]] 내부 슬롯을 초기화하기 위해 prototype 프로퍼티의 값이 사용된다.
이 프로퍼티는 속성 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }를 가진다.
Note
Function 인스턴스와 달리, GeneratorFunction의 "prototype" 프로퍼티 값인 객체는 값이 GeneratorFunction 인스턴스인 "constructor" 프로퍼티를 가지지 않는다.
생성자가 아니라 함수로 호출될 때 새로운 AsyncGeneratorFunction을 생성하고 초기화한다. 따라서 함수 호출 AsyncGeneratorFunction (...)은 같은 인자를 가진 객체 생성 표현식 new AsyncGeneratorFunction (...)과 동등하다.
클래스 정의의 extends 절의 값으로 사용될 수 있다. 지정된 AsyncGeneratorFunction 동작을 상속하려는 서브클래스 생성자는 built-in AsyncGeneratorFunction 동작에 필요한 내부 슬롯으로 서브클래스 인스턴스를 생성하고 초기화하기 위해 AsyncGeneratorFunction 생성자에 대한 super 호출을 포함해야 한다. async generator function 객체를 정의하는 모든 ECMAScript 구문 형식은 AsyncGeneratorFunction의 직접 인스턴스를 생성한다. AsyncGeneratorFunction 서브클래스의 인스턴스를 생성하는 구문적 수단은 없다.
이 프로퍼티는 속성 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }를 가진다.
27.4.4 AsyncGeneratorFunction 인스턴스
모든 AsyncGeneratorFunction 인스턴스는 ECMAScript function object이며 Table 25에 나열된 내부 슬롯을 가진다. 그러한 모든 인스턴스의 [[IsClassConstructor]] 내부 슬롯 값은 false이다.
각 AsyncGeneratorFunction 인스턴스는 다음 own 프로퍼티를 가진다:
27.4.4.1 length
"length" 프로퍼티의 값은 AsyncGeneratorFunction이 일반적으로 기대하는 인자 수를 나타내는 정수 Number이다. 그러나 언어는 함수가 다른 수의 인자로 호출되는 것을 허용한다. "length" 프로퍼티가 지정한 수와 다른 수의 인자로 호출될 때 AsyncGeneratorFunction의 동작은 함수에 따라 달라진다.
이 프로퍼티는 속성 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }를 가진다.
27.4.4.2 name
20.2.4.2에 주어진 Function 인스턴스의 "name" 프로퍼티에 대한 명세는 AsyncGeneratorFunction 인스턴스에도 적용된다.
27.4.4.3 prototype
AsyncGeneratorFunction 인스턴스가 생성될 때마다 또 다른 ordinary object도 생성되며, 이는 async generator function의 "prototype" 프로퍼티의 초기 값이 된다. generator function 객체가 [[Call]]을 사용하여 호출될 때 새로 생성된 AsyncGenerator의 [[Prototype]] 내부 슬롯을 초기화하기 위해 prototype 프로퍼티의 값이 사용된다.
이 프로퍼티는 속성 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }를 가진다.
Note
function 인스턴스와 달리, AsyncGeneratorFunction의 "prototype" 프로퍼티 값인 객체는 값이 AsyncGeneratorFunction 인스턴스인 "constructor" 프로퍼티를 가지지 않는다.
The abstract operation GeneratorStart takes arguments generator (a Generator) and generatorBody (a FunctionBody Parse Node or an Abstract Closure with no parameters) and returns unused. It performs the following steps when called:
The abstract operation GeneratorValidate takes arguments generator (an ECMAScript language value) and generatorBrand (a String or empty) and returns either a normal completion containing one of suspended-start, suspended-yield, or completed, or a throw completion. It performs the following steps when called:
The abstract operation GeneratorResume takes arguments generator (an ECMAScript language value), value (an ECMAScript language value or empty), and generatorBrand (a String or empty) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:
The abstract operation GeneratorResumeAbrupt takes arguments generator (an ECMAScript language value), abruptCompletion (a return completion or a throw completion), and generatorBrand (a String or empty) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:
genContext가 Generator component를 가지지 않으면, non-generator를 반환한다.
generator를 genContext의 Generator component로 둔다.
generator가 [[AsyncGeneratorState]] 내부 슬롯을 가지면, async를 반환한다.
sync를 반환한다.
27.5.3.6 GeneratorYield ( iteratorResult )
The abstract operation GeneratorYield takes argument iteratorResult (an Object that conforms to the IteratorResult interface) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:
The abstract operation Yield takes argument value (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:
The abstract operation CreateIteratorFromClosure takes arguments closure (an Abstract Closure with no parameters), generatorBrand (a String or empty), and generatorPrototype (an Object) and optional argument extraSlots (a List of names of internal slots) and returns a Generator. It performs the following steps when called:
NOTE: closure는 IteratorResult 객체를 산출하기 위해 Yield 연산의 사용을 포함할 수 있다.
extraSlots가 존재하지 않으면, extraSlots를 새로운 빈 List로 설정한다.
internalSlotsList를 extraSlots와 « [[GeneratorState]], [[GeneratorContext]], [[GeneratorBrand]] »의 list-concatenation으로 둔다.
The abstract operation AsyncGeneratorStart takes arguments generator (an AsyncGenerator) and generatorBody (a FunctionBody Parse Node or an Abstract Closure with no parameters) and returns unused. It performs the following steps when called:
The abstract operation AsyncGeneratorValidate takes arguments generator (an ECMAScript language value) and generatorBrand (a String or empty) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:
The abstract operation AsyncGeneratorEnqueue takes arguments generator (an AsyncGenerator), completion (a Completion Record), and promiseCapability (a PromiseCapability Record) and returns unused. It performs the following steps when called:
request를 AsyncGeneratorRequest { [[Completion]]: completion, [[Capability]]: promiseCapability }로 둔다.
The abstract operation AsyncGeneratorCompleteStep takes arguments generator (an AsyncGenerator), completion (a Completion Record), and done (a Boolean) and optional argument realm (a Realm Record) and returns unused. It performs the following steps when called:
Assert: generator.[[AsyncGeneratorQueue]]는 비어 있지 않다.
next를 generator.[[AsyncGeneratorQueue]]의 첫 번째 요소로 둔다.
generator.[[AsyncGeneratorQueue]]에서 첫 번째 요소를 제거한다.
The abstract operation AsyncGeneratorResume takes arguments generator (an AsyncGenerator) and completion (a Completion Record) and returns unused. It performs the following steps when called:
Assert: generator.[[AsyncGeneratorState]]는 suspended-start 또는 suspended-yield이다.
genContext를 generator.[[AsyncGeneratorContext]]라 하자.
The abstract operation AsyncGeneratorUnwrapYieldResumption takes argument resumptionValue (a Completion Record) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:
The abstract operation AsyncGeneratorYield takes argument value (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:
The abstract operation AsyncGeneratorAwaitReturn takes argument generator (an AsyncGenerator) and returns unused. It performs the following steps when called:
The abstract operation AsyncGeneratorDrainQueue takes argument generator (an AsyncGenerator) and returns unused. return completion을 보유한AsyncGeneratorRequest를 만날 때까지 generator의 AsyncGeneratorQueue를 비운다. It performs the following steps when called:
생성자가 아니라 함수로 호출될 때 새로운 AsyncFunction을 생성하고 초기화한다. 따라서 함수 호출 AsyncFunction(…)은 같은 인자를 가진 객체 생성 표현식 new AsyncFunction(…)과 동등하다.
클래스 정의의 extends 절의 값으로 사용될 수 있다. 지정된 AsyncFunction 동작을 상속하려는 서브클래스 생성자는 built-in async function 동작에 필요한 내부 슬롯으로 서브클래스 인스턴스를 생성하고 초기화하기 위해 AsyncFunction 생성자에 대한 super 호출을 포함해야 한다. async function 객체를 정의하는 모든 ECMAScript 구문 형식은 AsyncFunction의 직접 인스턴스를 생성한다. AsyncFunction 서브클래스의 인스턴스를 생성하는 구문적 수단은 없다.
이 프로퍼티는 속성 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }를 가진다.
27.7.4 AsyncFunction 인스턴스
모든 AsyncFunction 인스턴스는 ECMAScript function object이며 Table 25에 나열된 내부 슬롯을 가진다. 그러한 모든 인스턴스의 [[IsClassConstructor]] 내부 슬롯 값은 false이다. AsyncFunction 인스턴스는 생성자가 아니며 [[Construct]] 내부 메서드를 가지지 않는다. AsyncFunction 인스턴스는 constructable이 아니므로 prototype 프로퍼티를 가지지 않는다.
각 AsyncFunction 인스턴스는 다음 own 프로퍼티를 가진다:
27.7.4.1 length
20.2.4.1에 주어진 Function 인스턴스의 "length" 프로퍼티에 대한 명세는 AsyncFunction 인스턴스에도 적용된다.
27.7.4.2 name
20.2.4.2에 주어진 Function 인스턴스의 "name" 프로퍼티에 대한 명세는 AsyncFunction 인스턴스에도 적용된다.
The abstract operation AsyncFunctionStart takes arguments promiseCapability (a PromiseCapability Record) and asyncFunctionBody (a FunctionBody Parse Node, an ExpressionBody Parse Node, or an Abstract Closure with no parameters) and returns unused. It performs the following steps when called:
The abstract operation AsyncBlockStart takes arguments promiseCapability (a PromiseCapability Record), asyncBody (a Parse Node or an Abstract Closure with no parameters), and asyncContext (an execution context) and returns unused. It performs the following steps when called:
promiseCapability와 asyncBody를 캡처하고, 호출될 때 다음 단계를 수행하는, 매개변수가 없는 새로운 Abstract Closure를 closure라 하자.
NOTE: result 값의 가능한 출처는 Await 또는, async 함수가 아무것도 await하지 않는 경우, 위의 단계 1.i이다.
unused를 반환한다.
27.7.5.3 Await ( value )
The abstract operation Await takes argument value (an ECMAScript language value) and returns either a normal completion containing either an ECMAScript language value or empty, or a throw completion. It performs the following steps when called:
Module Namespace Object는 모듈의 export된 binding에 대해 런타임 프로퍼티 기반 접근을 제공하는 module namespace exotic object이다. Module Namespace Object에는 생성자 함수가 없다. 대신, 그러한 객체는 NameSpaceImport를 포함하는 ImportDeclaration에 의해 import되는 각 모듈에 대해 생성된다.
10.4.6에 지정된 프로퍼티 외에도 각 Module Namespace Object는 다음 own 프로퍼티를 가진다:
이 프로퍼티는 속성 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }를 가진다.
29 메모리 모델
메모리 일관성 모델, 또는 메모리 모델은 SharedArrayBuffer를 기반으로 하는 TypedArray 인스턴스에 접근하거나 Atomics 객체의 메서드를 통해 발생하는 Shared Data Block 이벤트의 가능한 순서를 지정한다. 프로그램에 데이터 레이스(아래에서 정의됨)가 없을 때, 이벤트의 순서는 순차적으로 일관된 것처럼, 즉 각 agent의 동작이 interleaving된 것처럼 보인다. 프로그램에 데이터 레이스가 있으면, 공유 메모리 연산은 순차적으로 일관되지 않게 보일 수 있다. 예를 들어, 프로그램은 인과성을 위반하는 동작 및 다른 놀라운 현상을 보일 수 있다. 이러한 놀라운 현상은 컴파일러 변환과 CPU 설계(예: out-of-order 실행 및 speculation)에서 비롯된다. 메모리 모델은 프로그램이 순차적으로 일관된 동작을 보이는 정확한 조건과 데이터 레이스에서 읽을 수 있는 가능한 값을 모두 정의한다. 즉, undefined behaviour는 없다.
메모리 모델은 평가 중 SharedArrayBuffer의 추상 연산 또는 Atomics 객체의 메서드에 의해 도입되는 Memory 이벤트에 대한 관계적 제약으로 정의된다.
Note
이 절은 SharedArrayBuffer에 대한 추상 연산에 의해 도입되는 Memory 이벤트에 관한 공리적 모델을 제공한다. 이 모델은 이 명세의 나머지 부분과 달리 알고리즘적으로 표현할 수 없다는 점을 강조할 필요가 있다. 추상 연산에 의한 이벤트의 비결정적 도입은 ECMAScript 평가의 조작적 의미론과 메모리 모델의 공리적 의미론 사이의 인터페이스이다. 이러한 이벤트의 의미론은 평가의 모든 이벤트 그래프를 고려하여 정의된다. 이들은 Static Semantics도 Runtime Semantics도 아니다. 입증된 알고리즘적 구현은 없고, 대신 특정 이벤트 그래프가 허용되는지 허용되지 않는지를 결정하는 제약 집합이 있다.
29.1 메모리 모델 기본 사항
공유 메모리 접근(읽기와 쓰기)은 아래에서 정의되는 두 그룹, atomic 접근과 data 접근으로 나뉜다. Atomic 접근은 순차적으로 일관된다. 즉, agent cluster의 모든 agent가 동의하는 이벤트의 엄격한 전체 순서가 있다. Non-atomic 접근은 모든 agent가 동의하는 엄격한 전체 순서를 가지지 않는다. 즉, unordered이다.
Note 1
release-acquire와 같이 순차적 일관성보다 약하고 unordered보다 강한 ordering은 지원되지 않는다.
Shared Data Block 이벤트는 ReadSharedMemory, WriteSharedMemory, 또는 ReadModifyWriteSharedMemory Record이다. read 이벤트는 ReadSharedMemory 또는 ReadModifyWriteSharedMemory이다. write 이벤트는 WriteSharedMemory 또는 ReadModifyWriteSharedMemory이다.
Shared Data Block 이벤트는 추상 연산 또는 Atomics 객체의 메서드에 의해 candidate executionAgent Events Record에 도입된다. 일부 연산은 또한 필드가 없고 다른 이벤트의 허용된 ordering을 직접 제약하기 위해서만 존재하는 Synchronize 이벤트를 도입한다. 마지막으로, host-specific 이벤트가 있다. Memory 이벤트는 Shared Data Block 이벤트, Synchronize 이벤트, 또는 그러한 host-specific 이벤트이다.
Shared Data Block 이벤트 e의 memory range를 e.[[ByteIndex]](포함)부터 e.[[ByteIndex]] + e.[[ElementSize]](제외)까지의 구간에 있는 모든 정수의 Set으로 둔다. 두 이벤트의 memory range는 이벤트가 같은 [[Block]], [[ByteIndex]], [[ElementSize]]를 가질 때 같다. 두 이벤트의 memory range는 이벤트가 같은 [[Block]]을 가지고, range가 같지 않으며, 교집합이 비어 있지 않을 때 overlapping이다. 두 이벤트의 memory range는 이벤트가 같은 [[Block]]을 가지지 않거나 range가 같지도 overlapping도 아닐 때 disjoint이다.
Note 2
고려되어야 할 host-specific synchronizing 이벤트의 예는 다음과 같다: 한 agent에서 다른 agent로 SharedArrayBuffer 보내기(예: 브라우저에서 postMessage 사용), agent 시작 및 중지, 공유 메모리 이외의 채널을 통한 agent cluster 내 통신. 특정 실행 execution에 대해, 이러한 이벤트는 host가 host-synchronizes-withstrict partial order를 통해 제공한다. 추가로, host는 is-agent-order-beforeRelation에 참여하도록 host-specific synchronizing 이벤트를 execution.[[EventList]]에 추가할 수 있다.
empty candidate execution은 필드가 빈 List인 candidate execution Record이다.
29.5 메모리 모델을 위한 추상 연산
29.5.1 EventSet ( execution )
The abstract operation EventSet takes argument execution (a candidate execution) and returns a Set of Memory events. It performs the following steps when called:
aer.[[EventList]]의 각 Memory 이벤트event에 대해, 다음을 수행한다
event를 events에 추가한다.
events를 반환한다.
29.5.2 SharedDataBlockEventSet ( execution )
The abstract operation SharedDataBlockEventSet takes argument execution (a candidate execution) and returns a Set of Shared Data Block events. It performs the following steps when called:
The abstract operation HostEventSet takes argument execution (a candidate execution) and returns a Set of Memory events. It performs the following steps when called:
이벤트 eventA와 eventB에 대해, execution.[[EventsRecords]] 안에 어떤 Agent Events Recordaer가 있고 aer.[[EventList]]가 eventA와 eventB를 모두 포함하며 eventA가 aer.[[EventList]]의 List 순서에서 eventB보다 앞에 있다면, eventA는 execution에서 eventB보다 is-agent-order-before이다.
Note
각 agent는 평가 중 agent별 엄격한 전체 순서로 이벤트를 도입한다. 이는 그러한 엄격한 전체 순서들의 합집합이다.
이벤트 readEvent와 writeEvent에 대해, SharedDataBlockEventSet(execution)이 readEvent와 writeEvent를 모두 포함하고, execution 안의 reads-bytes-from(readEvent)가 writeEvent를 포함한다면, readEvent는 execution에서 writeEvent로부터 reads-from한다.
candidate executionexecution 안의 두 host-specific 이벤트 eventA와 eventB에 대해, execution에서 eventA host-synchronizes-with eventB라는 것은 execution에서 eventAhappens-beforeeventB임을 함의한다.
Note 2
이 Relation은 host가 HTML worker 사이의 postMessage와 같은 추가 synchronization 메커니즘을 제공할 수 있게 한다.
이벤트 eventA와 eventB에 대해, eventA가 execution에서 eventB보다 happens-before이면 eventA는 execution에서 eventB보다 is-memory-order-before이다.
execution에서 readEvent가 writeEvent로부터 reads-from하는 이벤트 readEvent와 writeEvent에 대해, SharedDataBlockEventSet(execution) 안에 value.[[Order]]가 seq-cst이고, execution에서 writeEvent가 value보다 is-memory-order-before이며, value가 readEvent보다 is-memory-order-before이고, 다음 조건 중 하나라도 참인 WriteSharedMemory 또는 ReadModifyWriteSharedMemory 이벤트 value가 존재하지 않는다.
프로그램은 자신의 모든 execution이 data race free이면 data race free이다.
메모리 모델은 data race free 프로그램에 대해 모든 이벤트의 순차적 일관성을 보장한다.
29.11 공유 메모리 지침
Note 1
다음은 공유 메모리로 작업하는 ECMAScript 프로그래머를 위한 지침이다.
프로그램을 data race free로 유지할 것을 권장한다. 즉, 같은 메모리 위치에 대한 동시 non-atomic 연산이 존재할 수 없도록 하라. Data race free 프로그램은 각 agent의 평가 의미론에서 각 단계가 서로 interleaving되는 interleaving 의미론을 가진다. Data race free 프로그램의 경우 메모리 모델의 세부 사항을 이해할 필요가 없다. 그 세부 사항은 ECMAScript를 더 잘 작성하는 데 도움이 될 직관을 형성할 가능성이 낮다.
더 일반적으로, 프로그램이 data race free가 아니더라도 atomic 연산이 어떤 data race에도 관여하지 않고 race하는 연산들이 모두 같은 access size를 가지는 한 예측 가능한 동작을 할 수 있다. atomics가 race에 관여하지 않도록 하는 가장 단순한 방법은 atomic 연산과 non-atomic 연산이 서로 다른 memory cell을 사용하도록 하고, 서로 다른 크기의 atomic 접근이 동시에 같은 cell에 접근하는 데 사용되지 않도록 하는 것이다. 사실상 프로그램은 공유 메모리를 가능한 한 strongly typed로 취급해야 한다. race하는 non-atomic 접근의 ordering과 timing에는 여전히 의존할 수 없지만, 메모리가 strongly typed로 취급된다면 race하는 접근은 "tear"되지 않는다(값의 bit가 섞이지 않는다).
Note 2
다음은 공유 메모리를 사용하는 프로그램에 대해 컴파일러 변환을 작성하는 ECMAScript 구현자를 위한 지침이다.
multi-agent 프로그램에서 각 agent의 성능이 single-agent 설정에서와 마찬가지로 좋도록 보장하기 위해, single-agent 설정에서 유효한 대부분의 프로그램 변환을 multi-agent 설정에서도 허용하는 것이 바람직하다. 이러한 변환은 판단하기 어려운 경우가 많다. 우리는 규범적으로 받아들여지도록 의도된(메모리 모델에 의해 함의되거나 메모리 모델이 함의하는 것보다 더 강한) 프로그램 변환에 관한 몇 가지 규칙을 개괄하지만, 이는 완전하지 않을 가능성이 높다. 이러한 규칙은 is-agent-order-beforeRelation을 구성하는 Memory 이벤트의 도입에 앞서는 프로그램 변환에 적용되도록 의도된다.
공유 메모리가 없는 경우 유효한 agent-order slice의 모든 변환은 공유 메모리가 있는 경우에도 다음 예외를 제외하고 유효하다.
Atomics are carved in stone: 프로그램 변환은 [[Order]]가 seq-cst인 어떤 Shared Data Block 이벤트도 is-agent-order-beforeRelation에서 제거되게 해서는 안 되며, 서로에 대해 reorder되게 해서도 안 되고, [[Order]]가 unordered인 이벤트에 대해 agent-order slice 안에서 reorder되게 해서도 안 된다.
(실제로 reordering 금지는 컴파일러가 모든 seq-cst 연산이 synchronization이고 최종 is-memory-order-beforeRelation에 포함된다고 가정하도록 강제하며, inter-agent 프로그램 분석이 없는 경우에도 보통 그렇게 가정해야 한다. 또한 memory-order에 대한 callee의 효과가 알려지지 않은 모든 호출이 seq-cst 연산을 포함할 수 있다고 컴파일러가 가정하도록 강제한다.)
Reads must be stable: 주어진 공유 메모리 read는 execution 안에서 단 하나의 값만 관찰해야 한다.
(예를 들어, 프로그램에서 의미상 단일 read인 것이 여러 번 실행되면, 그 후 프로그램은 읽힌 값들 중 하나만 관찰하도록 허용된다. rematerialization으로 알려진 변환은 이 규칙을 위반할 수 있다.)
Writes must be stable: 공유 메모리에 대한 모든 관찰 가능한 write는 execution 안의 프로그램 의미론으로부터 따라야 한다.
(예를 들어, 더 작은 datum을 쓰기 위해 더 큰 위치에 read-modify-write 연산을 사용하거나, 프로그램이 쓸 수 없었던 값을 메모리에 쓰거나, read 이후 다른 agent가 덮어쓸 수 있었던 위치에 방금 읽은 값을 다시 쓰는 것과 같은 특정 관찰 가능한 write를 변환이 도입해서는 안 된다.)
Possible read values must be non-empty: 프로그램 변환은 공유 메모리 read의 possible read values가 비게 만들 수 없다.
(직관에 반하지만, 이 규칙은 사실상 write에 대한 변환을 제한한다. memory model에서 write는 read 이벤트에 의해 읽힐 수 있다는 점에서 힘을 가지기 때문이다. 예를 들어, write는 이동되고 병합될 수 있으며 때로는 두 seq-cst 연산 사이에서 reorder될 수도 있지만, 변환은 어떤 위치를 갱신하는 모든 write를 제거해서는 안 된다. 일부 write는 보존되어야 한다.)
여전히 유효한 변환의 예는 다음과 같다: 같은 위치에서 여러 non-atomic read 병합, non-atomic read reordering, speculative non-atomic read 도입, 같은 위치에 대한 여러 non-atomic write 병합, 서로 다른 위치에 대한 non-atomic write reordering, 그리고 종료에 영향을 미치더라도 loop 밖으로 non-atomic read hoisting. 일반적으로 aliased TypedArray는 위치가 다르다는 것을 증명하기 어렵게 만든다는 점에 유의하라.
Note 3
다음은 공유 메모리 접근을 위한 machine code를 생성하는 ECMAScript 구현자를 위한 지침이다.
ARM 또는 Power의 메모리 모델보다 약하지 않은 메모리 모델을 가진 아키텍처의 경우, non-atomic store와 load는 대상 아키텍처의 bare store와 load로 컴파일될 수 있다. Atomic store와 load는 순차적 일관성을 보장하는 명령어로 컴파일될 수 있다. 그러한 명령어가 없으면, bare store 또는 load의 양쪽에 barrier를 배치하는 것과 같은 memory barrier를 사용해야 한다. Read-modify-write 연산은 x86의 LOCK-prefix 명령어, ARM의 load-exclusive/store-exclusive 명령어, Power의 load-link/store-conditional 명령어와 같은 대상 아키텍처의 read-modify-write 명령어로 컴파일될 수 있다.
Atomic 연산은 더 큰 데이터에 대한 read-modify-write 연산으로 구현되지 않으며, 플랫폼에 적절한 크기의 atomic 연산이 없으면 non-lock-free atomics로 구현된다. (우리는 이미 모든 플랫폼이 모든 흥미로운 크기의 normal memory access 연산을 가진다고 가정한다.)
Naive code generation은 다음 패턴을 사용한다:
Regular load와 store는 단일 load 및 store 명령어로 컴파일된다.
Lock-free atomic load와 store는 full(순차적으로 일관된) fence, regular load 또는 store, 그리고 full fence로 컴파일된다.
Lock-free atomic read-modify-write 접근은 full fence, atomic read-modify-write 명령어 sequence, 그리고 full fence로 컴파일된다.
Non-lock-free atomics는 spinlock acquire, full fence, 일련의 non-atomic load 및 store 명령어, full fence, 그리고 spinlock release로 컴파일된다.
그 매핑은 memory range에 대한 atomic 연산이 non-atomic write 또는 다른 크기의 atomic 연산과 race하지 않는 한 올바르다. 그러나 우리가 필요한 것은 그것뿐이다: 메모리 모델은 race에 관여한 atomic 연산을 사실상 non-atomic 상태로 격하시킨다. 한편, naive mapping은 상당히 강하다: 이는 atomic 연산이 순차적으로 일관된 fence로 사용될 수 있게 하는데, 메모리 모델은 실제로 이를 보장하지 않는다.
메모리 모델의 제약을 따르는 한, 이러한 기본 패턴에 대한 local improvement도 허용된다. 예를 들어:
중복 fence를 제거하는 명백한 platform-dependent improvement가 있다. 예를 들어 x86에서는 lock-free atomic load와 store 주변의 fence가 store 뒤의 fence를 제외하면 항상 생략될 수 있으며, lock-free read-modify-write 명령어에는 fence가 필요하지 않다. 이는 모두 LOCK-prefix 명령어를 사용하기 때문이다. 많은 플랫폼에는 여러 강도의 fence가 있으며, 순차적 일관성을 깨뜨리지 않고 특정 context에서 더 약한 fence를 사용할 수 있다.
대부분의 현대 플랫폼은 ECMAScript atomics가 요구하는 모든 데이터 크기에 대해 lock-free atomics를 지원한다. non-lock-free atomics가 필요하다면, atomic 연산 본문을 둘러싼 fence는 보통 lock 및 unlock 단계 안으로 접힐 수 있다. non-lock-free atomics에 대한 가장 단순한 해결책은 SharedArrayBuffer마다 하나의 lock word를 두는 것이다.
또한 일부 코드 분석이 필요한 더 복잡한 platform-dependent local improvement도 있다. 예를 들어, 연속된 두 fence는 종종 단일 fence와 같은 효과를 가지므로, 두 atomic 연산이 연속으로 생성되는 경우 그 사이에는 단 하나의 fence만 필요하다. x86에서는 atomic store를 분리하는 단일 fence조차 생략될 수 있는데, store 뒤의 fence는 store를 후속 load와 분리하는 데만 필요하기 때문이다.
이 annex에 정의된 ECMAScript 언어 구문과 의미론은 ECMAScript host가 웹 브라우저일 때 요구된다. 이 annex의 내용은 normative이지만 ECMAScript host가 웹 브라우저가 아닌 경우에는 선택 사항이다.
이 annex에 정의된 일부 기능은 이 annex에 명시되어 있고, 일부는 이 문서의 본문에 명시되어 있다.
기능이 본문에 명시된 경우, 그것이 문서에 영향을 미치는 각 지점은 색상 상자 안의 "Normative Optional"이라는 단어로 표시된다. 또한 그 기능이 알고리즘이나 early error 규칙의 특정 문구를 포함하는 경우, 이는 관련 기능을 “host가 지원한다”는 조건에 의해 보호된다. 웹 브라우저는 이러한 모든 기능을 지원해야 한다.
Note
이 annex는 웹 브라우저 ECMAScript host의 여러 legacy 기능과 기타 특성을 설명한다. 이 annex에 명시된 모든 언어 기능과 동작은 하나 이상의 바람직하지 않은 특성을 가지고 있으며 legacy 사용이 없다면 이 명세에서 제거되었을 것이다. 그러나 이러한 기능을 사용하는 기존 웹 페이지가 매우 많기 때문에 웹 브라우저는 이를 계속 지원해야 한다. 이 annex의 명세는 이러한 legacy 기능의 상호 운용 가능한 구현에 대한 요구 사항을 정의한다.
이러한 기능은 핵심 ECMAScript 언어의 일부로 간주되지 않는다. 프로그래머는 새로운 ECMAScript 코드를 작성할 때 이러한 기능과 동작을 사용하거나 그 존재를 가정해서는 안 된다. ECMAScript 구현은 해당 구현이 웹 브라우저의 일부이거나 웹 브라우저가 마주치는 동일한 legacy ECMAScript 코드를 실행해야 하는 경우가 아니라면 이러한 기능을 구현하지 않는 것이 권장된다.
B.1 추가 구문
B.1.1 HTML-like 주석
12.4의 구문과 의미론은 다음과 같이 확장된다. 단, goal symbol Module을 사용하여 source text를 파싱할 때는 이 확장이 허용되지 않는다:
22.2.1의 구문은 다음과 같이 수정 및 확장된다. 이러한 변경은 grammar production의 순서와 contextual information에 의해 해소되는 모호성을 도입한다. 다음 문법을 사용하여 파싱할 때, 각 alternative는 이전 production alternative가 일치하지 않는 경우에만 고려된다.
이 대체 pattern 문법과 의미론은 BMP pattern의 구문과 의미론만 변경한다. 다음 문법 확장은 [UnicodeMode] 매개변수로 매개변수화된 production을 포함한다. 그러나 이러한 확장은 goal symbol에 [UnicodeMode] 매개변수가 존재하는 상태로 파싱할 때 인식되는 Unicode pattern의 구문을 변경하지 않는다.
The abstract operation CharacterRangeOrUnion takes arguments regexpRecord (a RegExp Record), charSet (a CharSet), and otherSet (a CharSet) and returns a CharSet. It performs the following steps when called:
이 함수는 전역 객체의 프로퍼티이다. 특정 code unit이 hexadecimal escape sequence로 대체된 String 값의 새로운 버전을 계산한다.
numeric value가 0x00FF 이하인 code unit을 대체할 때는 %xx 형식의 두 자리 escape sequence가 사용된다. numeric value가 0x00FF보다 strictly greater인 code unit을 대체할 때는 %uxxxx 형식의 네 자리 escape sequence가 사용된다.
이 메서드는 this 값을 String으로 변환한 결과의 substring을 반환하며, index start에서 시작하여 length code unit만큼 진행한다(또는 length가 undefined이면 String의 끝까지). start가 음수이면, String의 길이인 sourceLength에 대해 sourceLength + start로 취급된다. 결과는 String 객체가 아니라 String 값이다.
The abstract operation CreateHTML takes arguments contents (an ECMAScript language value), tag (a String), attribute (a String), and attrValue (an ECMAScript language value) and returns either a normal completion containing a String or a throw completion. It performs the following steps when called:
escapedAttrValue를 attrValueStr 안의 code unit 0x0022 (QUOTATION MARK)의 각 occurrence가 여섯 code unit sequence """로 대체된 것을 제외하면 attrValueStr와 같은 String 값으로 둔다.
p1을 다음의 string-concatenation으로 설정한다:
p1
code unit 0x0020 (SPACE)
attribute
code unit 0x003D (EQUALS SIGN)
code unit 0x0022 (QUOTATION MARK)
escapedAttrValue
code unit 0x0022 (QUOTATION MARK)
p2를 p1과 ">"의 string-concatenation으로 둔다.
p3를 p2와 contentsStr의 string-concatenation으로 둔다.
p4를 p3, "</", tag, 그리고 ">"의 string-concatenation으로 둔다.
B.3.2 Block-Level Function Declaration 웹 Legacy 호환성 의미론
ECMAScript 2015 이전에는 ECMAScript 명세가 Block statement의 StatementList 요소로 FunctionDeclaration이 발생하는 것을 정의하지 않았다. 그러나 그런 형태의 FunctionDeclaration 지원은 허용 가능한 확장이었고 대부분의 browser-hosted ECMAScript 구현은 이를 허용했다. 불행히도 그러한 선언의 의미론은 구현마다 다르다. 이러한 의미론적 차이 때문에, Block level function declaration을 사용하는 기존 웹 ECMAScript source text는 그 사용이 그러한 선언에 대한 모든 브라우저 구현의 의미론적 교집합에만 의존할 때에만 브라우저 구현 간에 portable하다. 다음은 그 교집합 의미론 안에 들어가는 사용 사례이다:
g의 function code 안에, f의 선언을 포함하는 Block을 lexical하게 뒤따르는 IdentifierReference로서의 f의 occurrence가 최소 하나 있다.
첫 번째 사용 사례는 ECMAScript 2015가 제공하는 Block level function declaration의 의미론과 상호 운용 가능하다. 그 사용 사례를 채택하는 기존 ECMAScript source text는 10, 14, 그리고 15 절에 정의된 Block level function declaration 의미론을 사용하여 동작한다.
두 번째 및 세 번째 사용 사례에 대한 ECMAScript 2015 상호 운용성은 10 절, 15 절, 19.2.1 절 및 16.1.7 절 의미론에 대한 다음 확장을 요구한다.
ECMAScript 구현에 diagnostic warning message를 보고하는 메커니즘이 있다면, 이러한 compatibility semantics가 적용되고 non-compatibility semantics와 관찰 가능한 차이를 도입하는 FunctionDeclaration이 코드에 포함될 때 warning이 생성되어야 한다. 예를 들어, var binding의 도입이 early error를 만들기 때문에 var binding이 도입되지 않는 경우 warning message는 생성되지 않아야 한다.
Runtime에서 그러한 binding은 VariableDeclarationEnvironment 안에 instantiate된다. 이들은 CatchParameter가 도입한 같은 이름의 binding을 shadow하지 않으므로, 그러한 var declaration의 Initializer는 var binding이 아니라 대응하는 catch parameter에 할당한다.
[[IsHTMLDDA]] internal slot은 host-defined 객체에 존재할 수 있다. [[IsHTMLDDA]] 내부 슬롯을 가진 객체는 ToBoolean 및 IsLooselyEqual추상 연산에서, 그리고 typeof 연산자의 operand로 사용될 때 undefined처럼 동작한다.
Note
[[IsHTMLDDA]] 내부 슬롯을 가진 객체는 이 명세에 의해 생성되지 않는다. 그러나 웹 브라우저의 document.all 객체는 웹 호환성을 위해 존재하는 이 슬롯을 가진 host-defined exotic object이다. 이 종류의 객체에 대한 다른 알려진 예는 없으며 구현은 document.all을 제외하고 이를 만들어서는 안 된다.
선언되지 않은 identifier 또는 달리 해결 불가능한 reference에 대한 assignment는 전역 객체에 프로퍼티를 생성하지 않는다. strict mode code 안에서 simple assignment가 발생할 때, 그 LeftHandSideExpression은 unresolvable Reference로 평가되어서는 안 된다. 그렇게 평가되면 ReferenceError 예외가 던져진다(6.2.5.6). LeftHandSideExpression은 또한 attribute value { [[Writable]]: false }를 가진 data property에 대한 reference, attribute value { [[Set]]: undefined }를 가진 accessor property에 대한 reference, 또는 [[Extensible]] 내부 슬롯이 false인 객체의 존재하지 않는 프로퍼티에 대한 reference여서도 안 된다. 이러한 경우에는 TypeError 예외가 던져진다(13.15).
strict 함수의 arguments object는 접근 시 TypeError 예외를 던지는 non-configurable accessor property"callee"를 정의한다(10.4.4.6).
strict 함수의 arguments object는 자신의 array-indexed 프로퍼티 값을 해당 함수의 대응하는 formal parameter binding과 동적으로 공유하지 않는다. (10.4.4).
strict 함수에서 arguments object가 생성되면, local identifier arguments의 arguments object에 대한 binding은 immutable이므로 assignment expression의 target이 될 수 없다. (10.2.11).
strict mode eval code는 eval 호출자의 variable environment 안에 변수나 함수를 instantiate할 수 없다. 대신 새로운 variable environment가 생성되고, 그 environment가 eval code의 declaration binding instantiation에 사용된다(19.2.1).
strict mode code 안에서 this가 평가되면, this 값은 객체로 강제 변환되지 않는다. undefined 또는 null인 this 값은 전역 객체로 변환되지 않으며 primitive value는 wrapper object로 변환되지 않는다. 함수 호출(Function.prototype.apply 및 Function.prototype.call을 사용한 호출 포함)을 통해 전달된 this 값은 전달된 this 값을 객체로 강제 변환하지 않는다(10.2.1.2, 20.2.3.1, 20.2.3.3).
strict mode code 안에서 delete operator가 발생할 때, 그 UnaryExpression이 변수, 함수 인자, 또는 함수 이름에 대한 직접 reference이면 SyntaxError가 던져진다(13.5.1.1).
strict mode code 안에서 delete operator가 발생할 때, 삭제될 프로퍼티가 attribute { [[Configurable]]: false }를 가지거나 달리 삭제될 수 없으면 TypeError가 던져진다(13.5.1.2).
이 명세 안에 지정되지 않은 모든 exotic object에 대한 Table 4의 essential internal method 중 임의의 것.
D.6 Built-in 객체와 메서드
17.1에서 제한된 경우를 제외하고, 이 명세 안에 정의되지 않은 모든 built-in 객체와 메서드.
Annex E (informative) 호환성 영향 가능성이 있는 ECMAScript 2015의 수정 및 명확화
9.1.1.4.14-9.1.1.4.17 Edition 5 및 5.1은 새로운 global declaration에 대응하는 global object 프로퍼티가 이미 존재하는지 판단하기 위해 property existence test를 사용했다. ECMAScript 2015는 own property existence test를 사용한다. 이는 웹 브라우저에서 가장 일반적으로 구현되어 온 것과 일치한다.
10.4.2.1: 5th Edition은 현재 array length의 캡처를 array index 또는 새 length 값의 integer conversion 이전으로 이동했다. 그러나 conversion 과정이 array length를 변경하는 side-effect를 가지면 캡처된 length 값은 invalid가 될 수 있었다. ECMAScript 2015는 그러한 side-effect의 가능한 발생 이후에 현재 array length가 캡처되어야 한다고 지정한다.
21.4.1.31: 이전 edition은 TimeClip추상 연산이 0 time value의 표현으로 +0𝔽 또는 -0𝔽 중 하나를 반환하는 것을 허용했다. ECMAScript 2015는 +0𝔽가 항상 반환된다고 지정한다. 이는 ECMAScript 2015에서 Date의 time value가 관찰 가능하게 -0𝔽가 결코 아니며 time value를 반환하는 메서드도 결코 -0𝔽를 반환하지 않는다는 뜻이다.
21.4.1.32: UTC offset 표현이 없으면 local time zone이 사용된다. Edition 5.1은 누락된 time zone이 "z"로 해석되어야 한다고 잘못 명시했다.
21.4.4.36: 연도를 21.4.1.32에 지정된 Date Time String Format을 사용하여 표현할 수 없으면 RangeError 예외가 던져진다. 이전 edition은 그 경우의 동작을 지정하지 않았다.
21.4.4.41: 이전 edition은 time value가 NaN일 때 Date.prototype.toString이 반환하는 값을 지정하지 않았다. ECMAScript 2015는 결과를 String 값 "Invalid Date"로 지정한다.
22.2.4.1, 22.2.6.13.1: RegExp instance의 "source" 프로퍼티 값 안의 모든 LineTerminator code point는 escape sequence를 사용하여 표현되어야 한다. Edition 5.1은 /만 escape할 것을 요구했다.
22.2.6.8, 22.2.6.11: 이전 edition에서 String.prototype.match 및 String.prototype.replace의 명세는 pattern 인자가 global flag가 설정된 RegExp 값인 경우에 대해 올바르지 않았다. 이전 명세는 pattern을 match하려는 각 시도마다 lastIndex가 변경되지 않으면 1만큼 증가해야 한다고 명시했다. 올바른 동작은 pattern이 empty String과 match된 경우에만 lastIndex가 1만큼 증가해야 한다는 것이다.
23.1.3.30: 이전 edition은 Array.prototype.sort에서 comparator가 반환한 NaN 값이 어떻게 해석되는지 지정하지 않았다. ECMAScript 2015는 그러한 값이 comparator에서 +0𝔽가 반환된 것처럼 취급된다고 지정한다. ECMAScript 2015는 또한 comparator가 반환한 결과에 ToNumber가 적용된다고 지정한다. 이전 edition에서는 Number 값이 아닌 comparator 결과의 효과가 implementation-defined였다. 실제로 구현은 ToNumber를 호출한다.
Annex F (informative) 이전 Edition과의 비호환성을 도입하는 추가 및 변경
9.3: ECMAScript 2018에서 Template object는 이전 edition에서처럼 Realm 안의 해당 template literal 또는 tagged template의 모든 occurrence 전체가 아니라 Parse Node(source location)에 기반하여 canonicalize된다.
12.2: ECMAScript 2016에서는 Unicode 8.0.0 이상이 요구되며, 이는 Unicode 5.1을 요구했던 ECMAScript 2015와 다르다. 특히 이로 인해 U+180E MONGOLIAN VOWEL SEPARATOR가 ECMAScript 2015에서는 Space_Separator(Zs) category에 있어 whitespace로 취급되었지만, Unicode 6.3.0부터 Format(Cf) category로 이동했다. 이는 whitespace-sensitive 메서드가 다르게 동작하게 한다. 예를 들어 "\u180E".trim().length는 이전 edition에서는 0이었지만 ECMAScript 2016 및 이후에서는 1이다. 추가로, ECMAScript 2017은 항상 최신 버전의 Unicode Standard를 사용하도록 요구했다.
12.7: ECMAScript 2015에서 IdentifierName의 valid code point는 Unicode 프로퍼티 “ID_Start” 및 “ID_Continue”의 관점에서 지정된다. 이전 edition에서는 valid IdentifierName 또는 Identifier code point가 여러 Unicode code point category를 열거하여 지정되었다.
12.10.1: ECMAScript 2015에서 Automatic Semicolon Insertion은 semicolon이 누락된 경우 do-while statement의 끝에 semicolon을 추가한다. 이 변경은 명세를 대부분의 기존 구현의 실제 동작과 일치시킨다.
13.2.5.1: ECMAScript 2015에서 Object Initializer 안에 duplicate property name이 있어도 더 이상 early error가 아니다.
13.15.1: ECMAScript 2015에서 FunctionExpression의 function name과 같은 immutable binding에 대한 assignment를 포함하는 strict mode code는 early error를 생성하지 않는다. 대신 runtime error를 생성한다.
14.7: ECMAScript 2015에서 for statement의 ( token 바로 뒤에 token sequence let [가 오면 let은 LexicalDeclaration의 시작으로 취급된다. 이전 edition에서 그러한 token sequence는 Expression의 시작이었다.
14.7: ECMAScript 2015에서 for-in statement의 ( token 바로 뒤에 token sequence let [가 오면 let은 ForDeclaration의 시작으로 취급된다. 이전 edition에서 그러한 token sequence는 LeftHandSideExpression의 시작이었다.
14.7: ECMAScript 2015 이전에는 in keyword 앞에 오는 VariableDeclaration의 일부로 initialization expression이 나타날 수 있었다. ECMAScript 2015에서는 같은 위치의 ForBinding이 그러한 initializer의 occurrence를 허용하지 않는다. ECMAScript 2017에서는 그러한 initializer가 non-strict code에서만 허용된다.
14.15: ECMAScript 2015에서 Catch clause가 Catch clause parameter로 나타나는 같은 Identifier에 대한 var declaration을 포함하는 것은 early error이다. 이전 edition에서 그러한 variable declaration은 둘러싸는 variable environment 안에 instantiate되었지만 declaration의 Initializer 값은 Catch parameter에 할당되었다.
14.15, 19.2.1.3: ECMAScript 2015에서 Catch clause가 eval code에 Catch clause parameter로 나타나는 같은 Identifier를 bind하는 var 또는 FunctionDeclaration declaration을 포함하는 non-strict direct eval을 평가하면 runtime SyntaxError가 던져진다.
20.1.2.6: ECMAScript 2015에서 Object.freeze의 인자가 object가 아니면 own property가 없는 non-extensible ordinary object였던 것처럼 취급된다. 이전 edition에서는 non-object 인자가 항상 TypeError를 던지게 했다.
20.1.2.8: ECMAScript 2015에서 Object.getOwnPropertyDescriptor의 인자가 object가 아니면 ToObject를 사용하여 인자를 강제 변환하려는 시도가 이루어진다. 강제 변환이 성공하면 그 결과가 원래 인자 값 대신 사용된다. 이전 edition에서는 non-object 인자가 항상 TypeError를 던지게 했다.
20.1.2.10: ECMAScript 2015에서 Object.getOwnPropertyNames의 인자가 object가 아니면 ToObject를 사용하여 인자를 강제 변환하려는 시도가 이루어진다. 강제 변환이 성공하면 그 결과가 원래 인자 값 대신 사용된다. 이전 edition에서는 non-object 인자가 항상 TypeError를 던지게 했다.
20.1.2.12: ECMAScript 2015에서 Object.getPrototypeOf의 인자가 object가 아니면 ToObject를 사용하여 인자를 강제 변환하려는 시도가 이루어진다. 강제 변환이 성공하면 그 결과가 원래 인자 값 대신 사용된다. 이전 edition에서는 non-object 인자가 항상 TypeError를 던지게 했다.
20.1.2.16: ECMAScript 2015에서 Object.isExtensible의 인자가 object가 아니면 own property가 없는 non-extensible ordinary object였던 것처럼 취급된다. 이전 edition에서는 non-object 인자가 항상 TypeError를 던지게 했다.
20.1.2.17: ECMAScript 2015에서 Object.isFrozen의 인자가 object가 아니면 own property가 없는 non-extensible ordinary object였던 것처럼 취급된다. 이전 edition에서는 non-object 인자가 항상 TypeError를 던지게 했다.
20.1.2.18: ECMAScript 2015에서 Object.isSealed의 인자가 object가 아니면 own property가 없는 non-extensible ordinary object였던 것처럼 취급된다. 이전 edition에서는 non-object 인자가 항상 TypeError를 던지게 했다.
20.1.2.19: ECMAScript 2015에서 Object.keys의 인자가 object가 아니면 ToObject를 사용하여 인자를 강제 변환하려는 시도가 이루어진다. 강제 변환이 성공하면 그 결과가 원래 인자 값 대신 사용된다. 이전 edition에서는 non-object 인자가 항상 TypeError를 던지게 했다.
20.1.2.20: ECMAScript 2015에서 Object.preventExtensions의 인자가 object가 아니면 own property가 없는 non-extensible ordinary object였던 것처럼 취급된다. 이전 edition에서는 non-object 인자가 항상 TypeError를 던지게 했다.
20.1.2.22: ECMAScript 2015에서 Object.seal의 인자가 object가 아니면 own property가 없는 non-extensible ordinary object였던 것처럼 취급된다. 이전 edition에서는 non-object 인자가 항상 TypeError를 던지게 했다.
20.2.3.2: ECMAScript 2015에서 bound function의 [[Prototype]] 내부 슬롯은 target function의 [[GetPrototypeOf]] 값으로 설정된다. 이전 edition에서는 [[Prototype]]이 항상 %Function.prototype%로 설정되었다.
20.2.4.1: ECMAScript 2015에서 function instance의 "length" property는 configurable이다. 이전 edition에서는 non-configurable이었다.
20.5.6.2: ECMAScript 2015에서 NativeErrorconstructor의 [[Prototype]] 내부 슬롯은 Error constructor이다. 이전 edition에서는 Function prototype object였다.
21.4.4 ECMAScript 2015에서 Date prototype object는 Date instance가 아니다. 이전 edition에서는 TimeValue가 NaN인 Date instance였다.
22.1.3.12 ECMAScript 2015에서 String.prototype.localeCompare 함수는 Unicode Standard에 따라 canonically equivalent인 String을 동일한 것으로 취급해야 한다. 이전 edition에서 구현은 canonical equivalence를 무시하고 대신 bit-wise comparison을 사용할 수 있었다.
22.1.3.28 및 22.1.3.30 ECMAScript 2015에서 lowercase/uppercase 변환 처리는 code point에 대해 작동한다. 이전 edition에서 그러한 변환 처리는 개별 code unit에만 적용되었다. 영향을 받는 유일한 code point는 Unicode의 Deseret block에 있는 것들이다.
22.1.3.32 ECMAScript 2015에서 String.prototype.trim 메서드는 Unicode BMP 밖에 존재할 수 있는 white space code point를 인식하도록 정의된다. 그러나 Unicode 7 기준으로 그러한 code point는 정의되어 있지 않다. 이전 edition에서는 그러한 code point가 white space로 인식되지 않았을 것이다.
22.2.6 ECMAScript 2015에서 RegExp prototype object는 RegExp instance가 아니다. 이전 edition에서는 pattern이 empty String인 RegExp instance였다.
22.2.6 ECMAScript 2015에서 "source", "global", "ignoreCase", 및 "multiline"은 RegExp prototype object에 정의된 accessor property이다. 이전 edition에서는 RegExp instance에 정의된 data property였다.
25.4.15: ECMAScript 2019에서 Atomics.wake는 Atomics.wait와의 혼동을 방지하기 위해 Atomics.notify로 이름이 변경되었다.
27.1.5.4, 27.6.3.6: ECMAScript 2019에서 await에 의해 enqueue되는 Job의 수가 줄어들었고, 이는 then() 호출과 await expression 사이의 resolution order에 관찰 가능한 차이를 만들 수 있었다.
참고 문헌
IEEE 754-2019: IEEE Standard for Floating-Point Arithmetic. Institute of Electrical and Electronic Engineers, New York (2019)
Note
ECMA-262 명세에 영향을 주는 IEEE 754-2008과 IEEE 754-2019 사이의 normative change는 없다.
이 명세는 GitHub에서 Ecmarkup이라고 하는 plaintext source format으로 작성된다. Ecmarkup은 HTML 및 Markdown dialect로, plaintext로 Ecma 명세를 작성하고 이 문서의 편집 관례를 따르는 full-featured HTML rendering으로 명세를 처리하기 위한 framework와 toolset을 제공한다. Ecmarkup은 구문을 정의하기 위한 Grammarkdown과 algorithm step을 작성하기 위한 Ecmarkdown을 포함한 여러 다른 format과 technology를 기반으로 하고 통합한다. 이 명세의 PDF rendering은 CSS Paged Media specification을 활용하는 print stylesheet를 사용하여 생성되며 PrinceXML을 사용하여 변환된다.
이 명세의 이전 edition은 Word를 사용하여 작성되었다. 이 edition의 기반이 된 Ecmarkup source text는 ECMAScript 2015 Word 문서를 automated conversion tool을 사용하여 Ecmarkup으로 변환해 생성되었다.
By obtaining and/or copying this work, you (the licensee) agree that you
have read, understood, and will comply with the following terms and
conditions.
Permission under Ecma’s copyright to copy, modify, prepare derivative works
of, and distribute this work, with or without modification, for any purpose
and without fee or royalty is hereby granted, provided that you include the
following on ALL copies of the work or portions thereof, including
modifications:
(i) The full text of this COPYRIGHT NOTICE AND COPYRIGHT LICENSE in a location
viewable to users of the redistributed or derivative work.
(ii) Any pre-existing intellectual property disclaimers, notices, or terms and
conditions. If none exist, the Ecma alternative copyright notice should be
included.
THIS WORK IS PROVIDED “AS IS,” AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS
OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES
OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF
THE DOCUMENT WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS,
TRADEMARKS OR OTHER RIGHTS.
COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE DOCUMENT.
The name and trademarks of copyright holders may NOT be used in advertising
or publicity pertaining to the work without specific, written prior
permission. Title to copyright in this work will at all times remain with
copyright holders.
Software License
All Software contained in this document ("Software") is protected by copyright and is being made available under the "BSD License", included below. This Software may be subject to third party rights (rights from parties other than Ecma International), including patent rights, and no licenses under such third party rights are granted under this license even if the third party concerned is a member of Ecma International. SEE THE ECMA CODE OF CONDUCT IN PATENT MATTERS AVAILABLE AT https://ecma-international.org/memento/codeofconduct.htm FOR INFORMATION REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE REQUIRED TO IMPLEMENT ECMA INTERNATIONAL STANDARDS.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
Neither the name of the authors nor Ecma International may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE ECMA INTERNATIONAL "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ECMA INTERNATIONAL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.