페이지 표시 설정

부속서 F (참고) 이전 판과 비호환성을 도입하는 추가 및 변경 사항

6.2.5: ECMAScript 2015에서는 Function 호출이 Reference Record를 반환할 수 없습니다.

7.1.4.1: ECMAScript 2015에서는 String 값에 적용된 ToNumber가 이제 BinaryIntegerLiteral 및 OctalIntegerLiteral 숫자 문자열을 인식하고 변환합니다. 이전 판에서는 그러한 문자열이 NaN으로 변환되었습니다.

9.3: ECMAScript 2018에서는 Template 객체가 이전 판처럼 Realm 안의 해당 template literal 또는 tagged template의 모든 발생을 기준으로 하는 대신 Parse Node(소스 위치)를 기준으로 정규화됩니다.

12.2: ECMAScript 2016에서는 Unicode 5.1을 요구했던 ECMAScript 2015와 달리 Unicode 8.0.0 이상을 요구합니다. 특히 이로 인해 ECMAScript 2015에서 Space_Separator (Zs) 범주에 속하여 공백으로 취급되던 U+180E MONGOLIAN VOWEL SEPARATOR가 Format (Cf) 범주로 이동했습니다(Unicode 6.3.0부터). 이에 따라 공백에 민감한 메서드의 동작이 달라집니다. 예를 들어 "\u180E".trim().length는 이전 판에서 0이었지만 ECMAScript 2016 이후에는 1입니다. 또한 ECMAScript 2017에서는 항상 최신 버전의 Unicode Standard를 사용하도록 요구했습니다.

12.7: ECMAScript 2015에서 IdentifierName에 유효한 코드 포인트는 Unicode 프로퍼티 “ID_Start” 및 “ID_Continue”를 기준으로 지정됩니다. 이전 판에서는 유효한 IdentifierName 또는 Identifier 코드 포인트를 다양한 Unicode 코드 포인트 범주를 열거하여 지정했습니다.

12.10.1: ECMAScript 2015에서 Automatic Semicolon Insertion은 do-while 문의 끝에 세미콜론이 없으면 세미콜론을 추가합니다. 이 변경은 명세를 대부분의 기존 구현체의 실제 동작과 일치시킵니다.

13.2.5.1: ECMAScript 2015에서는 Object Initializer에 중복 프로퍼티 이름이 있어도 더 이상 early error가 아닙니다.

13.15.1: ECMAScript 2015에서 FunctionExpression의 함수 이름과 같은 변경 불가능한 바인딩에 대한 할당을 포함하는 엄격 모드 코드는 early error를 생성하지 않습니다. 대신 런타임 오류를 생성합니다.

14.2: ECMAScript 2015에서 토큰 let으로 시작하고 입력 요소 LineTerminator 다음에 Identifier가 오는 StatementList는 LexicalDeclaration의 시작입니다. 이전 판에서는 automatic semicolon insertion이 항상 Identifier 입력 요소 앞에 세미콜론을 삽입했습니다.

14.5: ECMAScript 2015에서 토큰 let 다음에 토큰 [이 오는 StatementListItem은 LexicalDeclaration의 시작입니다. 이전 판에서는 그러한 시퀀스가 ExpressionStatement의 시작이었습니다.

14.6.2: ECMAScript 2015에서 IfStatement의 normal 결과는 절대 값 empty가 아닙니다. 어떤 Statement 부분도 평가되지 않거나 평가된 Statement 부분이 empty를 포함하는 normal completion을 생성하면 IfStatement의 결과는 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인 normal completion이 아닙니다. IterationStatement의 Statement 부분이 평가되지 않거나 Statement 부분의 최종 평가가 [[Value]]가 empty인 normal completion을 생성하면 IterationStatement 평가 결과는 [[Value]]가 undefined인 normal completion입니다.

14.11.2: ECMAScript 2015에서 WithStatement 평가 결과는 [[Value]]가 empty인 normal completion이 아닙니다. WithStatement의 Statement 부분 평가가 [[Value]]가 empty인 normal completion을 생성하면 WithStatement 평가 결과는 [[Value]]가 undefined인 normal completion입니다.

14.12.4: ECMAScript 2015에서 SwitchStatement 평가 결과는 [[Value]]가 empty인 normal completion이 아닙니다. SwitchStatement의 CaseBlock 부분 평가가 [[Value]]가 empty인 normal completion을 생성하면 SwitchStatement 평가 결과는 [[Value]]가 undefined인 normal completion입니다.

14.15: ECMAScript 2015에서 Catch 절이 Catch 절 매개변수에 나타나는 것과 같은 Identifier에 대한 var 선언을 포함하면 early error입니다. 이전 판에서는 그러한 변수 선언이 둘러싸는 변수 환경에 인스턴스화되었지만 선언의 Initializer 값은 Catch 매개변수에 할당되었습니다.

14.15, 19.2.1.3: ECMAScript 2015에서 Catch 절이 eval 코드에 Catch 절 매개변수에 나타나는 것과 같은 Identifier를 바인딩하는 var 또는 FunctionDeclaration 선언이 포함된 비엄격 직접 eval을 평가하면 런타임 SyntaxError가 던져집니다.

14.15.3: ECMAScript 2015에서 TryStatement의 결과는 절대 값 empty가 아닙니다. TryStatement의 Block 부분이 empty를 포함하는 normal completion으로 평가되면 TryStatement의 결과는 undefined입니다. TryStatement의 Block 부분이 throw completion으로 평가되고 empty를 포함하는 normal completion으로 평가되는 Catch 부분을 갖는 경우, Finally 절이 없거나 Finally 절이 empty normal completion으로 평가되면 TryStatement의 결과는 undefined입니다.

15.4.5 ECMAScript 2015에서 ObjectLiteral의 접근자 프로퍼티 [[Getter]] 또는 [[Setter]] 속성 값으로 생성되는 함수 객체는 생성자 함수가 아니며 "prototype" 자체 프로퍼티를 갖지 않습니다. 이전 판에서는 생성자였고 "prototype" 프로퍼티를 가졌습니다.

20.1.2.6: ECMAScript 2015에서 Object.freeze의 인수가 객체가 아니면 자체 프로퍼티가 없는 확장 불가능한 일반 객체인 것처럼 취급합니다. 이전 판에서는 비객체 인수가 항상 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의 인수가 객체가 아니면 자체 프로퍼티가 없는 확장 불가능한 일반 객체인 것처럼 취급합니다. 이전 판에서는 비객체 인수가 항상 TypeError를 발생시켰습니다.

20.1.2.17: ECMAScript 2015에서 Object.isFrozen의 인수가 객체가 아니면 자체 프로퍼티가 없는 확장 불가능한 일반 객체인 것처럼 취급합니다. 이전 판에서는 비객체 인수가 항상 TypeError를 발생시켰습니다.

20.1.2.18: ECMAScript 2015에서 Object.isSealed의 인수가 객체가 아니면 자체 프로퍼티가 없는 확장 불가능한 일반 객체인 것처럼 취급합니다. 이전 판에서는 비객체 인수가 항상 TypeError를 발생시켰습니다.

20.1.2.19: ECMAScript 2015에서 Object.keys의 인수가 객체가 아니면 ToObject를 사용하여 인수를 강제 변환하려고 시도합니다. 강제 변환이 성공하면 그 결과를 원래 인수 값 대신 사용합니다. 이전 판에서는 비객체 인수가 항상 TypeError를 발생시켰습니다.

20.1.2.20: ECMAScript 2015에서 Object.preventExtensions의 인수가 객체가 아니면 자체 프로퍼티가 없는 확장 불가능한 일반 객체인 것처럼 취급합니다. 이전 판에서는 비객체 인수가 항상 TypeError를 발생시켰습니다.

20.1.2.22: ECMAScript 2015에서 Object.seal의 인수가 객체가 아니면 자체 프로퍼티가 없는 확장 불가능한 일반 객체인 것처럼 취급합니다. 이전 판에서는 비객체 인수가 항상 TypeError를 발생시켰습니다.

20.2.3.2: ECMAScript 2015에서 바인딩된 함수의 [[Prototype]] 내부 슬롯은 대상 함수의 [[GetPrototypeOf]] 값으로 설정됩니다. 이전 판에서는 [[Prototype]]이 항상 %Function.prototype%으로 설정되었습니다.

20.2.4.1: ECMAScript 2015에서 함수 인스턴스의 "length" 프로퍼티는 구성 가능합니다. 이전 판에서는 구성 불가능했습니다.

20.5.6.2: ECMAScript 2015에서 NativeError 생성자의 [[Prototype]] 내부 슬롯은 Error 생성자입니다. 이전 판에서는 Function 프로토타입 객체였습니다.

21.4.4 ECMAScript 2015에서 Date 프로토타입 객체는 Date 인스턴스가 아닙니다. 이전 판에서는 TimeValue가 NaN인 Date 인스턴스였습니다.

22.1.3.12 ECMAScript 2015에서 String.prototype.localeCompare 함수는 Unicode Standard에 따라 정규적으로 동등한 String을 동일한 것으로 취급해야 합니다. 이전 판에서는 구현체가 정규적 동등성을 무시하고 대신 비트 단위 비교를 사용할 수 있었습니다.

22.1.3.28 및 22.1.3.30 ECMAScript 2015에서 소문자/대문자 변환 처리는 코드 포인트에 대해 동작합니다. 이전 판에서는 그러한 변환 처리가 개별 코드 단위에만 적용되었습니다. 영향을 받는 유일한 코드 포인트는 Unicode의 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과 같지만 pattern의 플래그가 인수 flags로 대체된 새로운 RegExp 인스턴스를 생성합니다. 이전 판에서는 pattern이 RegExp 인스턴스이고 flags가 undefined가 아니면 TypeError 예외를 던졌습니다.

22.2.6 ECMAScript 2015에서 RegExp 프로토타입 객체는 RegExp 인스턴스가 아닙니다. 이전 판에서는 패턴이 빈 String인 RegExp 인스턴스였습니다.

22.2.6 ECMAScript 2015에서 "source", "global", "ignoreCase", "multiline"은 RegExp 프로토타입 객체에 정의된 접근자 프로퍼티입니다. 이전 판에서는 RegExp 인스턴스에 정의된 데이터 프로퍼티였습니다.

25.4.10: ECMAScript 2019에서 Atomics.wake는 Atomics.wait와의 혼동을 방지하기 위해 Atomics.notify로 이름이 변경되었습니다.

27.1.5.4, 27.9.3.6: ECMAScript 2019에서 await가 큐에 넣는 Job의 수가 줄어들어 then() 호출과 await 표현식 사이의 resolve 순서에 관찰 가능한 차이가 생길 수 있게 되었습니다.