Sind nachgestellte Kommas in Arrays und Objekten Teil der Spezifikation?

215

Sind nachgestellte Kommas in JavaScript Standard oder tolerieren die meisten Browser wie Chrome und Firefox diese nur?

Ich dachte, sie wären Standard, aber IE8 hat gekotzt, nachdem er auf einen gestoßen ist - natürlich bedeutet IE, der etwas nicht unterstützt, kaum, dass es nicht Standard ist.

Hier ist ein Beispiel dafür, was ich meine (nach dem letzten Element des Bücher-Arrays):

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
quelle
Fand das neulich. Als C # -Programmierer war ich es so gewohnt, dass sie ...
CaffGeek
5
Ich habe mich vor ein paar Wochen damit befasst. Stellen Sie sich vor, Sie versuchen dies in IE7 ohne eines der neueren Debugging-Tools zu finden ...
Ryan Miller
4
Es hat mich glücklich gemacht, als ich entdeckte, dass Sprachen wie JS, Ruby, C # dies unterstützen - macht das Einfügen von Testdaten zum Kopieren einfach ... es machte mich wütend, als ich merkte, dass der IE selbst dies in sich
aufnimmt
Ich frage mich, ob signifikante Leerzeichen anstelle von Kommas (ähnlich wie CoffeeScript) syntaktische Mehrdeutigkeiten verursachen würden.
Andy

Antworten:

209

Technische Daten: ECMAScript 5 und ECMAScript 3


Abschnitt 11.1.5 in der ECMAScript 5-Spezifikation:

ObjectLiteral :
    { }
    { PropertyNameAndValueList }
    { PropertyNameAndValueList , }

Also ja, es ist Teil der Spezifikation.

Update: Anscheinend ist dies neu in ES5. In ES3 (Seite 41) lautete die Definition nur:

ObjectLiteral :
    { }
    { PropertyNameAndValueList }

Für Arrays-Literale ( Abschnitt 11.1.4 ) ist es noch interessanter ( Update: Dies gab es bereits in ES3):

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

(Wo Elision_optist Elision opt , was bedeutet, dass Elision optional ist?)

Elision ist definiert als

Elision :
    ,
    Elision ,

Also, ein Array wörtlich wie

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

ist vollkommen legal. Dadurch wird ein Array mit zwei Elementen erstellt, die Array-Länge wird jedoch auf festgelegt 2 + 3 = 5.

Erwarten Sie nicht zu viel vom IE (vor IE9) ...

Felix Kling
quelle
1
Wissen Sie, als ich EndoPhage fragte, ob dies auch in ES3 Standard war? Ich kann nicht scheinen, die Spezifikation dafür zu finden
Adam Rackis
1
Anscheinend war das nachfolgende Komma in Objektliteralen nicht in der ES3-Spezifikation enthalten. Die Definition für Arrays ist jedoch dieselbe.
Felix Kling
Nun, es waren Array-Elemente, mit denen ich darauf gestoßen bin, also gibt es wohl keine Entschuldigung für MS, egal wie Sie es schneiden.
Nochmals vielen
Schade um
91

Nur eine kurze Erinnerung / Warnung, dass dies einer der Bereiche ist, in denen sich der JavaScript / ECMAScript-Standard und der JSON-Standard unterscheiden. Hinter Kommas sind gültig in JS aber nicht gültig in JSON.

Joey Sabey
quelle
1
Aber andererseits, wenn die Obermenge auf eine "Veränderung des Herzens" wartet, "Könntest du (noch) geliebt werden", wenn du dich nur einmal anpasst?
Lukas Bünger
52

Was noch lustiger ist, gibt IE7

[1,].length  --> 2

während Firefox und Chrome

[1,].length  --> 1
seeg
quelle
16
Aber [1,,].lengthgibt 2. Sinn : Browser machen keine.
David Titarenco
84
Sinnvoll, die Spezifikation besagt, dass ein (Anmerkung: Singular) nachkommendes Komma nicht zur Länge eines Arrays beiträgt. Chrome und Firefox haben ES5 korrekt implementiert.
JaredMcAteer
7
Wenn zwei (Plural-) Nachkommas vorhanden sind, erhöht nur eines die Länge des Arrays. Daher scheint es genauer zu sein, zu sagen, dass das letzte Nachkomma ignoriert wird, als zu sagen, dass ein einzelnes Nachkomma ignoriert wird.
Bilderstürmer
4

Die Spezifikation für Javascript (auch bekannt als ECMA Script) finden Sie hier . Die relevante Definition für Arrays finden Sie auf Seite 63 und, wie Felix bemerkte, die Objektdefinition einige Seiten später auf Seite 65.

Obwohl diese Spezifikation besagt, dass es in Ordnung ist, ein Trailing zu ,haben, weiß ich nicht, ob dies im Rückblick auf einige Versionen der Fall wäre. Wie Sie bereits bemerkt haben, wird sich IE8- selbst bescheißen, wenn Sie ein nachfolgendes Komma hinterlassen, Chrome und FF jedoch gut damit umgehen.

Endophage
quelle
War dies ein Teil des ES3-Standards? Ich kann nicht scheinen, die ES3-Spezifikation zu finden
Adam Rackis
1
@Adam Ich habe versucht, es zu finden ... Angesichts der Veröffentlichungstermine (ES3 wurde 1999 veröffentlicht, ES4 wurde aufgegeben und ES5 wurde erst 2009 veröffentlicht) wäre es sinnvoll, dass es im ES3-Standard enthalten ist. Oder es könnte einfach sein, dass MS noch eine Sache vermasselt hat.
Endophage
Sieht so aus, als hätte MS angesichts Felix 'Antwort noch etwas vermasselt.
Nochmals vielen
2

Lassen Sie uns das aufschlüsseln.

Sind nachgestellte Kommas in JavaScript Standard?

Ja. Ab der ECMAScript 5-Spezifikation (auch Teil des Google- und Airbnb-Styleguides)

Tolerieren die meisten Browser wie Chrome und Firefox sie nur?

Dies ist eine ECMAScript 5-Unterstützungsfrage.

Transpiler wie Babel entfernen das zusätzliche nachgestellte Komma im transpilierten Code, sodass Sie sich in älteren Browsern keine Gedanken über das nachfolgende Komma machen müssen.

Das bedeutet also:

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

Wenn Sie also ES5 oder höher verwenden, müssen Sie sich wahrscheinlich keine Sorgen machen.

Ich dachte, sie wären Standard, aber IE8 hat gekotzt, nachdem er auf einen gestoßen ist - natürlich bedeutet IE, der etwas nicht unterstützt, kaum, dass es nicht Standard ist.

Auch dies ist eine Support-Frage zu ECMAScript 5. IE8 unterstützt ECMAScript 5 nicht (nur IE9 und höher)

Ich würde Airbnbs veraltete ES5-Dokumentation https://github.com/airbnb/javascript/blob/es5-deprecated/es5/README.md#commas wärmstens empfehlen

Ich würde auch die Mozilla-Dokumente empfehlen:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Trailing_commas

Garrettmac
quelle
1

Auf Chrome 52:

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

Ich mag es einfach nicht, Kommas zu setzen. Normalerweise werden sie in Open Source-Projekten verwendet, um zu vermeiden, dass die von einem anderen Commiter geschriebene Zeile gelöscht wird. Siehe die gleiche Frage in Python: https://stackoverflow.com/a/11597911/968988

Nicolas Zozol
quelle
13
Warum 'OUHHHHH'? Was haben Sie dort noch erwartet, wenn nicht 1? Sie haben eindeutig ein Element vor diesem Komma, genau wie [1,] (Länge: 1).
Fygo
Warum 'OUHHHHH'? weil ich von einem Code nichts erwarte, was ich nicht verstehe, ohne den RFC zu lesen. Und ja, es funktioniert genauso wie [1,]: Es steht eindeutig etwas vor dem Komma. Aber [,]da drin ist so viel vor und nach dem Komma. Da ich [,]allein nicht verstehe , halte ich die Verwendung nicht für [1,]eine gute Idee.
Nicolas Zozol