Annex F (informative) 이전 판과의 비호환성을 도입하는 추가 및 변경
6.2.5: ECMAScript 2015에서 함수 호출은 Reference Record 를 반환할 수 없다.
7.1.4.1: ECMAScript 2015에서 ToNumber 는 String 값에 적용될 때 BinaryIntegerLiteral 및 OctalIntegerLiteral 숫자 문자열을 인식하고 변환한다. 이전 판에서는 그러한 문자열이 NaN 으로 변환되었다.
9.3: ECMAScript 2018에서 템플릿 객체는 이전 판의 Realm 내 템플릿 리터럴 또는 태그된 템플릿 모든 출현 간이 아니라 Parse Node (소스 위치) 기반으로 정규화된다.
12.2: ECMAScript 2016에서 Unicode 8.0.0 이상이 요구된다(2015판은 Unicode 5.1 요구). 특히 U+180E MONGOLIAN VOWEL SEPARATOR 가 Space_Separator
(Zs
) 범주에서 Format
(Cf
) 범주로 이동(Unicode 6.3.0)하여 공백 처리 메서드의 동작이 달라진다. 예: "\u180E".trim().length
는 이전 판에서 0
이었지만 ECMAScript 2016 이후 1
. 또한 ECMAScript 2017은 항상 최신 Unicode 표준 사용을 요구.
12.7: ECMAScript 2015에서 IdentifierName 유효 코드 포인트는 Unicode 속성 “ID_Start”, “ID_Continue” 로 지정된다. 이전 판에서는 유효 IdentifierName 또는 Identifier 코드 포인트가 다양한 Unicode 범주를 열거하여 지정되었다.
12.10.1: ECMAScript 2015에서 자동 세미콜론 삽입은 do-while 문 끝에 세미콜론이 없으면 추가한다. 이 변경은 대부분 구현의 실제 동작과 일치.
13.2.5.1: ECMAScript 2015에서 Object Initializer 내 중복 프로퍼티 이름은 더 이상 초기 에러가 아니다.
13.15.1: ECMAScript 2015에서 FunctionExpression 의 함수 이름과 같은 불변 바인딩에 대한 대입을 포함한 엄격 모드 코드는 초기 에러를 발생시키지 않고 런타임 에러를 발생시킨다.
14.2: ECMAScript 2015에서 토큰 let 으로 시작하고 그 뒤에 입력 요소 LineTerminator 및 Identifier 가 따라오는 StatementList 는 LexicalDeclaration 시작이다. 이전 판에서는 자동 세미콜론 삽입이 항상 Identifier 입력 요소 앞에 세미콜론 삽입.
14.5: ECMAScript 2015에서 토큰 let
으로 시작하고 토큰 [
가 뒤따르는 StatementListItem 은 LexicalDeclaration 시작이다. 이전 판에서는 그러한 시퀀스가 ExpressionStatement 시작이었다.
14.6.2: ECMAScript 2015에서 IfStatement 의 정상 결과는 결코 empty 값이 아니다. 어떤 Statement 부분도 평가되지 않거나 평가된 Statement 부분이 empty 를 포함하는 정상 완료를 생성하면 결과는 undefined.
14.7: ECMAScript 2015에서 for 문 (
토큰 바로 뒤에 토큰 시퀀스 let [
가 오면 let
은 LexicalDeclaration 시작으로 처리된다. 이전 판에서는 그 시퀀스가 Expression 시작.
14.7: ECMAScript 2015에서 for-in 문 (
토큰 바로 뒤에 토큰 시퀀스 let [
가 오면 let
은 ForDeclaration 시작으로 처리된다. 이전 판에서는 그 시퀀스가 LeftHandSideExpression 시작.
14.7: ECMAScript 2015 이전에는 초기화 식이 in
키워드 앞 VariableDeclaration 일부로 나타날 수 있었다. ECMAScript 2015에서 동일 위치의 ForBinding 은 그러한 초기화자의 출현을 허용하지 않는다. ECMAScript 2017에서 그러한 초기화자는 비엄격 코드에서만 허용.
14.7: ECMAScript 2015에서 IterationStatement 평가 결과는 결코 [[Value]] 가 empty 인 정상 완료가 아니다. Statement 부분이 평가되지 않았거나 최종 평가가 [[Value]] empty 인 정상 완료를 생성하면 결과 [[Value]] 는 undefined 인 정상 완료.
14.11.2: ECMAScript 2015에서 WithStatement 평가 결과는 결코 [[Value]] 가 empty 인 정상 완료가 아니다. Statement 부분 평가가 [[Value]] empty 인 정상 완료를 생성하면 결과 [[Value]] 는 undefined.
14.12.4: ECMAScript 2015에서 SwitchStatement 평가 결과는 결코 [[Value]] 가 empty 인 정상 완료가 아니다. CaseBlock 부분 평가가 [[Value]] empty 인 정상 완료를 생성하면 결과 [[Value]] 는 undefined.
14.15: ECMAScript 2015에서 Catch 절이 매개변수와 동일한 Identifier 에 대해 var
선언을 포함하면 초기 에러이다. 이전 판에서는 그러한 변수 선언이 둘러싼 변수 환경에서 인스턴스화되지만 선언의 Initializer 값이 Catch 매개변수에 할당되었다.
14.15, 19.2.1.3: ECMAScript 2015에서 Catch 절이 동일한 Identifier 를 바인딩하는 var
또는 FunctionDeclaration
을 포함하는 비엄격 direct eval
을 평가하면 런타임 SyntaxError 가 던져진다.
14.15.3: ECMAScript 2015에서 TryStatement 결과는 결코 empty 값이 아니다. Block 부분이 empty 를 포함하는 정상 완료로 평가되면 결과는 undefined. Block 부분이 throw 완료로 평가되고 Catch 부분이 empty 정상 완료를 평가하면 Finally 가 없거나 Finally 가 empty 정상 완료로 평가되는 경우 결과는 undefined.
15.4.5: ECMAScript 2015에서 ObjectLiteral 의 접근자 프로퍼티 [[Get]] 또는 [[Set]] 속성 값으로 생성된 함수 객체는 생성자 함수가 아니며 "prototype" own 프로퍼티를 갖지 않는다. 이전 판에서는 생성자이며 "prototype" 프로퍼티가 있었다.
20.1.2.6: ECMAScript 2015에서 Object.freeze
인수가 객체가 아니면 자체 프로퍼티가 없는 비확장 ordinary 객체처럼 취급된다. 이전 판에서는 비객체 인수는 항상 TypeError 발생.
20.1.2.8: ECMAScript 2015에서 Object.getOwnPropertyDescriptor
인수가 객체가 아니면 ToObject 사용 강제를 시도한다. 성공 시 결과가 원래 인수 대신 사용. 이전 판에서는 비객체 인수가 항상 TypeError.
20.1.2.10: ECMAScript 2015에서 Object.getOwnPropertyNames
인수가 객체가 아니면 ToObject 강제를 시도. 성공 시 결과 사용. 이전 판에서는 TypeError.
20.1.2.12: ECMAScript 2015에서 Object.getPrototypeOf
인수가 객체가 아니면 ToObject 강제를 시도. 성공하면 결과 사용. 이전 판에서는 TypeError.
20.1.2.16: ECMAScript 2015에서 Object.isExtensible
인수가 객체가 아니면 자체 프로퍼티 없는 비확장 ordinary 객체처럼 취급. 이전 판에서는 TypeError.
20.1.2.17: ECMAScript 2015에서 Object.isFrozen
인수가 객체가 아니면 자체 프로퍼티 없는 비확장 ordinary 객체처럼 취급. 이전 판에서는 TypeError.
20.1.2.18: ECMAScript 2015에서 Object.isSealed
인수가 객체가 아니면 자체 프로퍼티 없는 비확장 ordinary 객체처럼 취급. 이전 판에서는 TypeError.
20.1.2.19: ECMAScript 2015에서 Object.keys
인수가 객체가 아니면 ToObject 강제를 시도. 성공 시 결과 사용. 이전 판에서는 TypeError.
20.1.2.20: ECMAScript 2015에서 Object.preventExtensions
인수가 객체가 아니면 자체 프로퍼티 없는 비확장 ordinary 객체처럼 취급. 이전 판에서는 TypeError.
20.1.2.22: ECMAScript 2015에서 Object.seal
인수가 객체가 아니면 자체 프로퍼티 없는 비확장 ordinary 객체처럼 취급. 이전 판에서는 TypeError.
20.2.3.2: ECMAScript 2015에서 바운드 함수의 [[Prototype]] 내부 슬롯은 대상 함수의 [[GetPrototypeOf]] 값으로 설정된다. 이전 판에서는 항상 %Function.prototype%.
20.2.4.1: ECMAScript 2015에서 함수 인스턴스의 "length" 프로퍼티는 설정 가능(configurable)하다. 이전 판에서는 불가능.
20.5.6.2: ECMAScript 2015에서 NativeError 생성자의 [[Prototype]] 내부 슬롯은 Error 생성자이다. 이전 판에서는 Function prototype 객체.
21.4.4: ECMAScript 2015에서 Date 프로토타입 객체는 Date 인스턴스가 아니다. 이전 판에서는 TimeValue 가 NaN 인 Date 인스턴스였다.
22.1.3.12: ECMAScript 2015에서 String.prototype.localeCompare
는 Unicode 표준에 따라 정규 동등(canonical equivalence)한 문자열을 동일하게 취급해야 한다. 이전 판에서는 구현이 이를 무시하고 비트 단위 비교 사용 가능.
22.1.3.28 및 22.1.3.30: ECMAScript 2015에서 소문자/대문자 변환 처리는 코드 포인트에 작동한다. 이전 판에서는 개별 코드 유닛에만 적용. 영향받는 코드는 Deseret 블록.
22.1.3.32: ECMAScript 2015에서 String.prototype.trim
은 Unicode BMP 밖에 존재할 수 있는 공백 코드 포인트 인식을 정의. Unicode 7 시점에는 그런 코드 포인트 없음. 이전 판에서는 그런 코드 포인트를 공백으로 인식하지 않았을 것.
22.2.4.1: ECMAScript 2015에서 pattern 인수가 RegExp 인스턴스이고 flags 인수가 undefined 가 아니면 pattern 의 플래그를 flags 로 교체한 새로운 RegExp 인스턴스 생성. 이전 판에서는 pattern 이 RegExp 인스턴스이고 flags 가 undefined 가 아니면 TypeError.
22.2.6: ECMAScript 2015에서 RegExp 프로토타입 객체는 RegExp 인스턴스가 아니다. 이전 판에서는 패턴이 빈 문자열인 RegExp 인스턴스였다.
22.2.6: ECMAScript 2015에서 "source", "global", "ignoreCase", "multiline" 은 RegExp 프로토타입 객체에 정의된 접근자 프로퍼티이다. 이전 판에서는 RegExp 인스턴스에 정의된 데이터 프로퍼티.
25.4.15: ECMAScript 2019에서 Atomics.wake
는 Atomics.wait
와의 혼동을 방지하기 위해 Atomics.notify
로 이름 변경.
27.1.6.4, 27.6.3.6: ECMAScript 2019에서 await
가 큐에 넣는 Job 수가 감소하여 then()
호출과 await
표현식 간 해석 순서의 관찰 가능 차이가 생길 수 있음.