javascript - Er avsluttende komma i arrays og objekter en del av spesifikasjonen?
Er avsluttende komma standard i JavaScript, eller tolererer de fleste nettlesere som Chrome og Firefox dem bare?
Jeg trodde de var standard, men IE8 kastet opp etter å ha støtt på en—selvfølgelig betyr det ikke at IE ikke støtter noe at det ikke er standard.
Her er et eksempel på hva jeg mener (etter det siste elementet i bøker-arrayet):
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(); }
};
Svar #1
Spesifikasjoner: ECMAScript 5 og ECMAScript 3
Seksjon 11.1.5 i ECMAScript 5-spesifikasjonen:
ObjectLiteral :
{ }
{ PropertyNameAndValueList }
{ PropertyNameAndValueList , }
Så ja, det er en del av spesifikasjonen.
Oppdatering: Tilsynelatende er dette nytt i ES5. I ES3 (side 41) var definisjonen bare:
ObjectLiteral :
{ }
{ PropertyNameAndValueList }
For array-litteraler (seksjon 11.1.4) er det enda mer interessant (Oppdatering: dette eksisterte allerede i ES3):
ArrayLiteral :
[ Elisionopt ]
[ ElementList ]
[ ElementList , Elision_opt ]
(hvor Elision_opt er Elisionopt, som betyr at elisjonen er valgfri)
Elision defineres som
Elision :
,
Elision ,
Så, en array-literal som
var arr = [1,2,,,,];
er helt lovlig. Dette oppretter et array med to elementer, men setter array-lengden til 2 + 3=5.
Ikke forvent for mye fra IE (før IE9)...
Svar #2
Bare en rask påminnelse/advarsel om at dette er ett av områdene hvor JavaScript/ECMAScript-standarden og JSON-standarden skiller seg; avsluttende komma er gyldige i JS, men ikke gyldige i JSON.
Svar #3
Hva som er enda morsommere, gir IE7
[1,].length --> 2
mens Firefox og Chrome
[1,].length --> 1
