Czy końcowe przecinki w tablicach i obiektach są częścią specyfikacji?

215

Czy końcowe przecinki w JavaScript są standardem, czy też większość przeglądarek takich jak Chrome i Firefox je toleruje?

Myślałem, że są standardowe, ale IE8 rzygał po napotkaniu jednego - oczywiście brak obsługi czegoś przez IE nie oznacza, że ​​nie jest to standard.

Oto przykład tego, co mam na myśli (po ostatnim elemencie tablicy książek):

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(); }
};
Adam Rackis
źródło
Znalazłem to innego dnia. Będąc programistą C # byłem tak przyzwyczajony do tego, że pozwolono im ...
CaffGeek 30.08.11
5
Poradziłem sobie z tym kilka tygodni temu. Wyobraź sobie, że próbujesz znaleźć to w IE7 bez żadnego z nowszych narzędzi do debugowania ...
Ryan Miller
4
Uszczęśliwił mnie, kiedy odkryłem, że języki takie jak JS, Ruby, C # obsługują to - ułatwia testowanie danych wklejania kopii ... denerwowałem się, gdy zdałem sobie sprawę, że IE wciąga nawet to ...
Adam Rackis
Zastanawiam się, czy znaczące białe znaki zamiast przecinków (coś w rodzaju CoffeeScript) spowodowałyby jakąś dwuznaczność składniową?
Andy

Odpowiedzi:

209

Specyfikacja: ECMAScript 5 i ECMAScript 3


Sekcja 11.1.5 specyfikacji ECMAScript 5:

ObjectLiteral :
    { }
    { PropertyNameAndValueList }
    { PropertyNameAndValueList , }

Tak, jest to część specyfikacji.

Aktualizacja: Najwyraźniej jest to nowość w ES5. W ES3 (strona 41) definicja była po prostu:

ObjectLiteral :
    { }
    { PropertyNameAndValueList }

W przypadku literałów tablic ( Rozdział 11.1.4 ) jest to jeszcze bardziej interesujące ( Aktualizacja: już to istniało w ES3):

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

(gdzie Elision_optjest opcja Elision , co oznacza, że ​​Elision jest opcjonalna)

Elision jest zdefiniowany jako

Elision :
    ,
    Elision ,

Tak więc dosłownie tablica

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

jest całkowicie legalny. Tworzy to tablicę z dwoma elementami, ale ustawia długość tablicy na 2 + 3 = 5.

Nie oczekuj zbyt wiele od IE (przed IE9) ...

Felix Kling
źródło
1
Jak zapytałem EndoPhage, czy zdarza ci się wiedzieć, czy to również było standardowe w ES3? Nie mogę znaleźć specyfikacji dla niego
Adam Rackis
1
Najwyraźniej przecinek końcowy w literałach obiektowych nie był w specyfikacji ES3. Ale definicja tablic jest taka sama.
Felix Kling
Cóż, to były elementy tablicy, z którymi się zetknąłem, więc myślę, że nie ma usprawiedliwienia dla stwardnienia rozsianego, bez względu na to, jak to wyciąć.
Jeszcze
Wstyd na Micro Internet of Explorer
pylover
91

Krótkie przypomnienie / ostrzeżenie, że jest to jeden z obszarów, w których różnią się standardy JavaScript / ECMAScript i JSON ; końcowe przecinki są poprawne w JS, ale nie są poprawne w JSON.

Joey Sabey
źródło
1
Ale z drugiej strony, jeśli superset jest gotowy na „Zmianę serca”, „Czy mógłbyś (nadal) być kochany”, gdybyś choć raz go dostosował?
Lukas Bünger
52

Co jest jeszcze śmieszniejsze, daje IE7

[1,].length  --> 2

podczas gdy Firefox i Chrome

[1,].length  --> 1
seeg
źródło
16
Ale [1,,].lengthdaje 2. Sens : przeglądarki nie robią nic.
David Titarenco,
84
Ma to pełny sens, specyfikacja mówi, że przecinek końcowy (uwaga: liczba pojedyncza) nie zwiększa długości tablicy. Chrome i Firefox poprawnie zaimplementowały ES5.
JaredMcAteer
7
Gdy występują 2 (w liczbie mnogiej) przecinki końcowe, tylko jeden dodaje się do długości tablicy, więc bardziej dokładne wydaje się stwierdzenie, że końcowy przecinek końcowy jest ignorowany, niż stwierdzenie, że pojedynczy przecinek końcowy jest ignorowany.
iconoclast
4

Możesz znaleźć specyfikację javascript (aka ECMA Script) tutaj . Odpowiednią definicję tablic można znaleźć na stronie 63, a jak zauważył Felix, definicję obiektu kilka stron później na stronie 65.

Chociaż ta specyfikacja mówi, że dobrze jest mieć końcowy ,, nie wiem, czy to prawda, patrząc wstecz na kilka wersji. Jak zauważyłeś, IE8- sam się załamie, jeśli pozostawisz przecinek końcowy, ale Chrome i FF poradzą sobie dobrze.

Endofag
źródło
Czy była to czubek głowy, czy ta część standardu ES3? Nie mogę znaleźć specyfikacji
ES3
1
@Adam Próbowałem go znaleźć ... Biorąc pod uwagę daty wydania (ES3 został opublikowany w 1999 r., ES4 został porzucony, a ES5 został opublikowany dopiero w 2009 r.), Miałoby sens, że był w standardzie ES3. Albo może być tak, że stwardnienie rozsiane spieprzyło jeszcze jedną rzecz.
Endofag
Wygląda na to, że stwardnienie rozsiane spieprzyło jeszcze jedną rzecz, biorąc pod uwagę odpowiedź Felixa.
Jeszcze
2

Rozwalmy to.

Czy końcowe przecinki są standardem w JavaScript?

Tak. Od specyfikacji ECMAScript 5 (również stanowi część przewodnika po stylu Google i Airbnb)

Czy większość przeglądarek, takich jak Chrome i Firefox, po prostu je toleruje?

To jest pytanie pomocnicze dotyczące ECMAScript 5.

Transpilatory takie jak Babel usuną dodatkowy przecinek końcowy w transpilowanym kodzie, co oznacza, że ​​nie musisz się martwić o problem z końcowym przecinkiem w starszych przeglądarkach.

Wiec to znaczy:

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

Są więc szanse, że jeśli używasz czegokolwiek ES5 i więcej, nie musisz się tym martwić.

Myślałem, że są standardowe, ale IE8 rzygał po napotkaniu jednego - oczywiście brak obsługi czegoś przez IE nie oznacza, że ​​nie jest to standard.

Ponownie, jest to pytanie pomocnicze dotyczące ECMAScript 5. IE8 nie obsługuje ECMAScript 5 (tylko IE9 i nowsze)

Zdecydowanie poleciłbym rzucić okiem na przestarzałą dokumentację Airbnb ES5 https://github.com/airbnb/javascript/blob/es5-deprecated/es5/README.md#commas

Poleciłbym także Dokumenty Mozilli:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Trailing_commas

garrettmac
źródło
1

W Chrome 52:

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

Po prostu nie lubię przecinków. Ludzie zwykle używają ich w projektach Open Source, aby uniknąć wymazania linii napisanej przez innego komisarza. Zobacz to samo pytanie w Pythonie: https://stackoverflow.com/a/11597911/968988

Nicolas Zozol
źródło
13
Dlaczego „OUHHHHH”? Czego jeszcze się tam spodziewałeś, jeśli nie 1? Wyraźnie „masz element” przed tym przecinkiem, podobnie jak [1,] (czyli długość: 1).
Fygo
Dlaczego „OUHHHHH”? ponieważ nie oczekuję niczego od kodu, którego nie rozumiem bez przeczytania RFC. I tak, działa tak [1,]: przed przecinkiem jest coś oczywistego. Ale w [,]przecinku jest tyle samo przecinka. Ponieważ nie rozumiem [,]sam, nie sądzę, aby używanie [1,]było dobrym pomysłem.
Nicolas Zozol