Le virgole finali nelle matrici e negli oggetti fanno parte delle specifiche?


215

Le virgole finali sono standard in JavaScript o la maggior parte dei browser come Chrome e Firefox le tollerano?

Ho pensato che fossero standard, ma IE8 ha vomitato dopo averne incontrato uno - ovviamente IE non supporta qualcosa a malapena significa che non è standard.

Ecco un esempio di cosa intendo (dopo l'ultimo elemento dell'array dei libri):

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

L'ho trovato l'altro giorno. Essendo un programmatore di C # ero così abituato a
farmi concedere

5
L'ho affrontato poche settimane fa. Immagina di provare a trovarlo in IE7 senza nessuno dei più recenti strumenti di debug ...
Ryan Miller,

4
Mi ha reso felice quando ho scoperto che lingue come JS, Ruby, C # supportano questo — rende facile copiare e incollare i dati dei test ... mi ha fatto arrabbiare quando ho capito che IE fa schifo anche in questo ...
Adam Rackis,

Mi chiedo se significativi spazi bianchi anziché virgole (un po 'come CoffeeScript) causerebbero qualche ambiguità sintattica?
Andy,

Risposte:


209

Specifiche: ECMAScript 5 e ECMAScript 3


Sezione 11.1.5 della specifica ECMAScript 5:

ObjectLiteral :
    { }
    { PropertyNameAndValueList }
    { PropertyNameAndValueList , }

Quindi sì, fa parte delle specifiche.

Aggiornamento: apparentemente è nuovo in ES5. In ES3 (pagina 41), la definizione era solo:

ObjectLiteral :
    { }
    { PropertyNameAndValueList }

Per gli array letterali ( Sezione 11.1.4 ) è ancora più interessante ( Aggiornamento: questo esisteva già in ES3):

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

(dove Elision_optè Elision opt , il che significa che Elision è opzionale)

Elision è definito come

Elision :
    ,
    Elision ,

Quindi, un array letterale come

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

è perfettamente legale. Questo crea una matrice con due elementi ma imposta la lunghezza della matrice su 2 + 3 = 5.

Non aspettarti troppo da IE (prima di IE9) ...


1
Come ho chiesto a EndoPhage, ti capita di sapere se questo era standard anche in ES3? Non riesco a trovare le specifiche per questo
Adam Rackis,


1
Apparentemente, la virgola finale nei letterali degli oggetti non era nelle specifiche ES3. Ma la definizione di array è la stessa.
Felix Kling,

Beh, sono stati gli elementi dell'array in cui mi sono imbattuto in questo, quindi immagino non ci siano scuse per la SM, indipendentemente da come lo tagli. Grazie ancora
Adam Rackis il

Vergogna su Micro $ oft Internet explorer
pylover

91

Solo un rapido promemoria / avvertimento che questa è una delle aree in cui lo standard JavaScript / ECMAScript e lo standard JSON differiscono; le virgole finali sono valide in JS ma non valide in JSON.


1
Ma ancora una volta, se il superset è pronto per un "Cambio di cuore", "Potresti (ancora) essere amato" se solo per una volta ti adeguassi?
Lukas Bünger,

52

Ciò che è ancora più divertente, offre IE7

[1,].length  --> 2

mentre Firefox e Chrome

[1,].length  --> 1

16
Ma [1,,].length2. Senso : i browser non ne fanno nessuno.
David Titarenco,

84
Ha perfettamente senso, la specifica dice che una virgola finale (nota: singolare) non si aggiunge alla lunghezza di un array. Chrome e Firefox hanno implementato correttamente ES5.
JaredMcAteer,

7
Quando ci sono 2 virgole finali (plurali), solo una si aggiunge alla lunghezza dell'array, quindi sembra più preciso dire che la virgola finale finale viene ignorata piuttosto che dire che una singola virgola finale viene ignorata.
iconoclasta l'

4

Puoi trovare le specifiche per javascript (aka ECMA Script) qui . È possibile trovare la definizione pertinente per gli array a pagina 63 e, come notato da Felix, la definizione dell'oggetto un paio di pagine più avanti a pagina 65.

Mentre questa specifica dice che va bene avere un finale ,, non so se sarebbe vero guardando indietro di alcune versioni. Come hai notato, IE8 si schiferà da solo se lasci una virgola finale ma Chrome e FF la gestiscono bene.


In cima alla tua testa, faceva parte dello standard ES3? Non riesco a trovare le specifiche ES3
Adam Rackis,

1
@Adam Ho provato a trovarlo ... Date le date di rilascio (ES3 è stato pubblicato nel 1999, ES4 è stato abbandonato e ES5 è stato pubblicato solo nel 2009), avrebbe senso che fosse nello standard ES3. O potrebbe essere solo che la SM abbia rovinato un'altra cosa.
Endofago il

Sembra che MS abbia rovinato un'altra cosa, data la risposta di Felix. Grazie ancora per il tuo
Adam Rackis,

2

Analizziamo questo.

Le virgole finali sono standard in JavaScript?

Sì. A partire dalla specifica ECMAScript 5 (anche parte della guida di stile Google e Airbnb)

La maggior parte dei browser come Chrome e Firefox li tollerano?

Questa è una domanda di supporto per ECMAScript 5.

Transpiler come Babel rimuoverà la virgola finale aggiuntiva nel codice traspilato, il che significa che non devi preoccuparti del problema della virgola finale nei browser legacy.

Quindi ciò significa:

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

Quindi è probabile che se stai usando qualcosa ES5 e in alto non devi preoccuparti.

Ho pensato che fossero standard, ma IE8 ha vomitato dopo averne incontrato uno - ovviamente IE non supporta qualcosa a malapena significa che non è standard.

Ancora una volta, questa è una domanda di supporto per ECMAScript 5. IE8 non supporta ECMAScript 5 (solo IE9 e versioni successive)

Consiglio vivamente di dare un'occhiata alla documentazione deprecata ES5 di Airbnb https://github.com/airbnb/javascript/blob/es5-deprecated/es5/README.md#commas

Consiglierei anche i documenti di Mozilla:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Trailing_commas


1

Su Chrome 52:

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

Semplicemente non mi piacciono le virgole finali. Le persone di solito li usano in progetti Open Source per evitare di cancellare la riga scritta da un altro committer. Vedi la stessa domanda in Python: https://stackoverflow.com/a/11597911/968988


13
Perché 'OUHHHHH'? Cos'altro ti aspettavi lì se non 1? Devi chiaramente "avere un elemento" prima di quella virgola, proprio come [1,] (che è lunghezza: 1).
Fygo,

Perché 'OUHHHHH'? perché non mi aspetto nulla da un codice che non capisco senza leggere l'RFC. E sì, funziona proprio come [1,]: c'è chiaramente qualcosa prima della virgola. Ma dentro [,]c'è tanto prima e dopo la virgola. Quindi, poiché non capisco [,]da solo, non penso che usare [1,]sia una buona idea.
Nicolas Zozol,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.