[javascript] 배열과 객체의 후미 쉼표가 사양의 일부입니까?

JavaScript에서 후행 쉼표가 표준입니까, 아니면 Chrome 및 Firefox와 같은 대부분의 브라우저가 허용합니까?

나는 그것들이 표준이라고 생각했지만 IE8은 하나를 만난 후 당황했습니다. 물론 IE는 무언가를 거의 지원하지 않으면 표준이 아닙니다.

다음은 책 배열의 마지막 요소 다음에 의미하는 바의 예입니다.

var viewModel = {
    books: ko.observableArray([
        { title: "..", display: function() { return ".."; } },
        { title: "..", display: function() { return ".."; } },
        { title: "..", display: function() { return ".."; } }, // <--right there
    ]),
    currentTemplate: ko.observable("bookTemplate1"),
    displayTemplate: function() { return viewModel.currentTemplate(); }
};



답변

사양 : ECMAScript 5ECMAScript 3


ECMAScript 5 사양의 섹션 11.1.5 :

ObjectLiteral :
    { }
    { PropertyNameAndValueList }
    { PropertyNameAndValueList , }

예, 사양의 일부입니다.

업데이트 : 분명히 이것은 ES5의 새로운 기능입니다. ES3 (41 페이지)에서 정의는 다음과 같습니다.

ObjectLiteral :
    { }
    { PropertyNameAndValueList }

배열 리터럴 ( 11.1.4 절 )의 경우 훨씬 더 흥미 롭습니다 ( 업데이트 : ES3에 이미 존재 함).

ArrayLiteral :
    [ Elisionopt ]
    [ ElementList ]
    [ ElementList , Elision_opt ]

(여기서 Elision_opt생략 된 것입니다 옵트 , 이는 Elision이 선택 사항임을 의미합니다)

Elision 로 정의

Elision :
    ,
    Elision ,

따라서 배열 리터럴은

var arr = [1,2,,,,];

완벽하게 합법적입니다. 이렇게하면 요소가 두 개인 배열이 만들어 지지만 배열 길이는로 설정됩니다 2 + 3 = 5.

IE (IE9 이전)에서 너무 많이 기대하지 마십시오 …


답변

이것이 JavaScript / ECMAScript 표준JSON 표준이 다른 영역 중 하나라는 것을 간단히 알리십시오 . 후행 쉼표은 유효 JS뿐만 유효하지 JSON있다.


답변

더 재미있는 것, IE7은

[1,].length  --> 2

파이어 폭스와 크롬

[1,].length  --> 1


답변

javascript (일명 ECMA Script) 사양은 여기에서 찾을 수 있습니다 . 63 페이지에서 배열에 대한 관련 정의를 찾을 수 있으며 Felix가 언급했듯이 65 페이지에서 나중에 두 페이지로 개체 정의를 정의 할 수 있습니다.

이 사양은 후행을 갖는 것이 좋다고 말하지만 그것이 ,몇 가지 버전을 되돌아 보는 것이 진실인지는 모르겠습니다. 앞서 언급했듯이 IE8-은 쉼표를 남기지 만 Chrome과 FF는 잘 처리합니다.


답변

이것을 분해하자.

JavaScript에서 후행 쉼표가 표준입니까?

예. ECMAScript 5 사양 기준 (Google 및 Airbnb 스타일 가이드의 일부)

Chrome 및 Firefox와 같은 대부분의 브라우저는 허용합니까?

이것은 ECMAScript 5 지원 질문입니다.

Babel과 같은 트랜스 필러는 트랜스 필 된 코드에서 추가 후행 쉼표를 제거하므로 레거시 브라우저의 후행 쉼표 문제에 대해 걱정할 필요가 없습니다.

따라서 다음을 의미합니다.

var heroes = [
  'Batman',
  'Superman',
];
// heroes.length === 2 (not 3)

따라서 ES5 이상을 사용하는 경우 걱정할 필요가 없습니다.

나는 그것들이 표준이라고 생각했지만 IE8은 하나를 만난 후 당황했습니다. 물론 IE는 무언가를 거의 지원하지 않으면 표준이 아닙니다.

다시 말하지만, 이는 ECMAScript 5 지원 질문입니다. IE8은 ECMAScript 5를 지원하지 않습니다 (IE9 이상 만)

에어 비앤비의 ES5 지원 중단 된 문서 https://github.com/airbnb/javascript/blob/es5-deprecated/es5/README.md#commas를 살펴 보는 것이 좋습니다.

또한 Mozilla 문서를 추천합니다 :
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Trailing_commas


답변

Chrome 52에서 :

[1,].length --> 1
[1,2,].length --> 2
[].length --> 0
[,].length --> 1    <<<<=== OUHHHHH !!!!

나는 단지 쉼표를 좋아하지 않습니다. 사람들은 보통 다른 커미터가 작성한 줄을 지우지 않기 위해 오픈 소스 프로젝트에서 사용합니다. Python에서 동일한 질문을 참조하십시오 : https : //.com/a/11597911/968988


답변