Les virgules de fin dans les tableaux et les objets font-elles partie de la spécification?


215

Les virgules de fin sont-elles standard en JavaScript, ou la plupart des navigateurs comme Chrome et Firefox les tolèrent-ils simplement?

Je pensais qu'ils étaient standard, mais IE8 a vomi après en avoir rencontré un - bien sûr, IE ne supportant pas quelque chose signifie à peine que ce n'est pas standard.

Voici un exemple de ce que je veux dire (après le dernier élément du tableau livres):

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

J'ai trouvé ça l'autre jour. En tant que programmeur C #, j'étais tellement habitué à ce qu'ils soient autorisés ...
CaffGeek

5
J'ai traité cela il y a quelques semaines. Imaginez essayer de trouver cela dans IE7 sans aucun des nouveaux outils de débogage ...
Ryan Miller

4
Cela m'a fait plaisir lorsque j'ai découvert des langages comme JS, Ruby, C # qui prennent en charge cela - facilitent la copie des données de test de collage ... cela m'a mis en colère quand j'ai réalisé qu'IE était nul ...
Adam Rackis

Je me demande si des espaces importants au lieu de virgules (un peu comme CoffeeScript) provoqueraient une ambiguïté syntaxique?
Andy

Réponses:


209

Spécifications: ECMAScript 5 et ECMAScript 3


Section 11.1.5 de la spécification ECMAScript 5:

ObjectLiteral :
    { }
    { PropertyNameAndValueList }
    { PropertyNameAndValueList , }

Alors oui, cela fait partie de la spécification.

Mise à jour: Apparemment, c'est nouveau dans ES5. Dans ES3 (page 41), la définition était juste:

ObjectLiteral :
    { }
    { PropertyNameAndValueList }

Pour les tableaux littéraux ( Section 11.1.4 ), c'est encore plus intéressant ( Mise à jour: cela existait déjà dans ES3):

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

(où Elision_optest Elision opt , ce qui signifie que l'Elision est facultative)

Elision est défini comme

Elision :
    ,
    Elision ,

Ainsi, un tableau littéral comme

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

est parfaitement légal. Cela crée un tableau avec deux éléments mais définit la longueur du tableau sur 2 + 3 = 5.

N'attendez pas trop d'IE (avant IE9) ...


1
Comme je l'ai demandé à EndoPhage, savez-vous si cela était également standard dans ES3? Je n'arrive pas à trouver les spécifications pour cela
Adam Rackis


1
Apparemment, la virgule de fin dans les littéraux d'objet n'était pas dans la spécification ES3. Mais la définition des tableaux est la même.
Felix Kling

Eh bien, c'est avec des éléments de tableau que j'ai rencontré cela, donc je suppose qu'il n'y a aucune excuse pour MS, peu importe comment vous le coupez. Merci encore
Adam Rackis

Honte à Micro $ oft Internet explorer
pylover

91

Juste un petit rappel / avertissement que c'est l'un des domaines dans lesquels la norme JavaScript / ECMAScript et la norme JSON diffèrent; les virgules de fin sont valides dans JS mais pas valides dans JSON.


1
Mais là encore, si le sur-ensemble est destiné à un "changement de cœur", "Pourriez-vous (encore) être aimé" si vous vous ajustez juste pour une fois?
Lukas Bünger

52

Ce qui est encore plus drôle, IE7 donne

[1,].length  --> 2

tandis que Firefox et Chrome

[1,].length  --> 1

16
Mais [1,,].lengthdonne 2. Sens : les navigateurs n'en font pas.
David Titarenco

84
C'est parfaitement logique, la spécification dit qu'une virgule de fin (note: singulière) n'ajoute pas à la longueur d'un tableau. Chrome et Firefox ont correctement implémenté ES5.
JaredMcAteer

7
Lorsqu'il y a 2 (plusieurs) virgules de fin, une seule ajoute à la longueur du tableau, il semble donc plus exact de dire que la dernière virgule de fin est ignorée que de dire qu'une seule virgule de fin est ignorée.
iconoclaste

4

Vous pouvez trouver les spécifications pour javascript (aka ECMA Script) ici . Vous pouvez trouver la définition appropriée pour les tableaux à la page 63 et comme Felix l'a noté, la définition d'objet quelques pages plus loin à la page 65.

Bien que cette spécification indique qu'il est correct d'avoir une fin, ,je ne sais pas si ce serait vrai en regardant en arrière quelques versions. Comme vous l'avez remarqué, IE8 se gâtera si vous laissez une virgule de fin, mais Chrome et FF le gèrent bien.


Du haut de votre tête, cela faisait-il partie de la norme ES3? Je n'arrive pas à trouver la spécification ES3
Adam Rackis

1
@Adam J'ai essayé de le trouver ... Étant donné les dates de sortie (ES3 a été publié en 1999, ES4 a été abandonné et ES5 n'a été publié qu'en 2009), il serait logique que ce soit dans la norme ES3. Ou peut-être que MS a foiré une dernière chose.
Endophage

On dirait que MS a foiré une dernière chose étant donné la réponse de Felix. Merci encore pour la vôtre
Adam Rackis

2

Décomposons cela.

Les virgules de fin sont-elles standard en JavaScript?

Oui. À partir de la spécification ECMAScript 5 (également incluse dans le guide de style Google et Airbnb)

La plupart des navigateurs comme Chrome et Firefox les tolèrent-ils?

Il s'agit d'une question de support ECMAScript 5.

Des transcripteurs comme Babel supprimeront la virgule de fin supplémentaire dans le code transpilé, ce qui signifie que vous n'avez pas à vous soucier du problème de virgule de fin dans les navigateurs hérités.

Donc ça signifie:

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

Donc, il y a des chances que si vous utilisez quelque chose d'ES5 et plus, vous n'avez pas à vous en soucier.

Je pensais qu'ils étaient standard, mais IE8 a vomi après en avoir rencontré un - bien sûr, IE ne supportant pas quelque chose signifie à peine que ce n'est pas standard.

Encore une fois, c'est une question de support ECMAScript 5. IE8 ne prend pas en charge ECMAScript 5 (uniquement IE9 et versions ultérieures)

Je recommande fortement de jeter un œil à la documentation obsolète ES5 d'Airbnb https://github.com/airbnb/javascript/blob/es5-deprecated/es5/README.md#commas

Je recommanderais également les documents de Mozilla:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Trailing_commas


1

Sur Chrome 52:

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

Je n'aime tout simplement pas les virgules de fin. Les gens les utilisent généralement dans des projets Open Source pour éviter d'effacer la ligne écrite par un autre commiter. Voir la même question en Python: https://stackoverflow.com/a/11597911/968988


13
Pourquoi 'OUHHHHH'? Qu'attendiez-vous d'autre sinon 1? Vous avez clairement «un élément» avant cette virgule, tout comme [1,] (qui est de longueur: 1).
Fygo

Pourquoi 'OUHHHHH'? parce que je n'attends rien d'un code que je ne comprends pas sans lire le RFC. Et oui, cela fonctionne comme [1,]: il y a clairement quelque chose avant la virgule. Mais [,]il y en a autant avant et après la virgule. Donc, parce que je ne comprends pas [,]seul, je ne pense pas que l'utilisation [1,]soit une bonne idée.
Nicolas Zozol
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.