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


215

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(); }
};

다른 날에 이것을 찾았습니다. C # 프로그래머이기 때문에 나는 그들에게 너무 익숙해졌습니다 ...
CaffGeek

5
나는 몇 주 전에 이것을 다루었 다. 새로운 디버깅 도구없이 IE7에서이를 찾으려고한다고 상상해보십시오.
Ryan Miller

4
내가 JS, 루비, C #을 지원 같은 언어를 발견했을 때 내가 IE도이 ... 빨아 깨달았을 때이-차종 쉽게 테스트 데이터를 붙여 넣기 ... 그것은 나를 화나게 복사 나를 행복하게 만든
아담 Rackis

쉼표 (커피 스크립트와 같은 종류) 대신 중요한 공백이 구문 상 모호성을 유발하는지 궁금합니다.
Andy

답변:


209

사양 : 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 이전)에서 너무 많이 기대하지 마십시오 ...


1
EndoPhage에 물을 때 ES3에서도 이것이 표준인지 여부를 알고 있습니까? 스펙을 찾을 수없는 것 같습니다
Adam Rackis


1
분명히 객체 리터럴의 후행 쉼표는 ES3 사양에 없었습니다. 그러나 배열의 정의는 동일합니다.
Felix Kling

글쎄 그것은 배열 요소였습니다. 그래서 어떻게 잘라도 MS에 대한 변명이 없을 것 같습니다. 다시 한 번 감사드립니다
아담 Rackis

Micro $ oft Internet Explorer에 부끄러움
pylover


52

더 재미있는 것, IE7은

[1,].length  --> 2

파이어 폭스와 크롬

[1,].length  --> 1

16
그러나 [1,,].length제공합니다 2. 감지 : 브라우저는 아무것도 만들지 않습니다.
David Titarenco

84
완벽하게 말하면, 스펙은 (단수) 후행 쉼표가 배열의 길이에 추가되지 않는다고 말합니다. Chrome 및 Firefox는 ES5를 올바르게 구현했습니다.
JaredMcAteer

7
두 개의 (복수) 후행 쉼표가 있으면 배열의 길이에 하나만 추가되므로 단일 후행 쉼표를 무시하는 것보다 최종 후행 쉼표를 무시하는 것이 더 정확합니다.
iconoclast

4

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

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


ES3 표준의 일부입니까? ES3 사양을 찾을 수없는 것 같습니다
Adam Rackis

1
@Adam 나는 그것을 찾으려고 노력했다 ... 출시 날짜 (ES3는 1999 년에 출판되었고 ES4는 포기되었고 ES5는 2009 년에만 출판되었다)를 감안할 때 ES3 표준에 있음을 의미합니다. 아니면 MS가 한 가지 더 망쳐 놓은 것일 수도 있습니다.
Endophage

MS가 Felix의 답변을 감안할 때 하나 더 망친 것처럼 보입니다. 다시 한 번 감사드립니다
Adam

2

이것을 분해하자.

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


1

Chrome 52에서 :

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

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


13
왜 'OUHHHHH'입니까? 1이 아니라면 무엇을 기대 했습니까? [1,] (길이 : 1)과 같이 쉼표 앞에 '요소가 있습니다'.
Fygo

왜 'OUHHHHH'입니까? RFC를 읽지 않으면 이해할 수없는 코드에서 아무것도 기대하지 않기 때문입니다. 그리고 그렇습니다 [1,]. 쉼표 앞에 분명히있는 것이 있습니다. 그러나 [,]쉼표 전후에는 많이 있습니다. 그래서 나는 [,]혼자 이해하지 못하기 때문에 사용하는 [1,]것이 좋은 생각 이라고 생각 하지 않습니다 .
Nicolas Zozol
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.