数组和对象中的尾随逗号是规范的一部分吗?

JavaScript中的尾随逗号是标准的,还是像Chrome和Firefox这样的大多数浏览器只能容忍它们?

我认为他们是标准的,但IE8呕吐遇到一个当然IE不支持的东西几乎意味着它不是标准的。

下面是我的意思(在books数组的最后一个元素之后)的例子:

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

规格: ECMAScript 5和ECMAScript 3


ECMAScript 5规范中的第11.1.5节 :

 ObjectLiteral : { } { PropertyNameAndValueList } { PropertyNameAndValueList , } 

所以是的,这是规范的一部分。

更新:显然这是ES5的新功能。 在ES3(第41页)中,定义只是:

 ObjectLiteral : { } { PropertyNameAndValueList } 

对于数组文本( 第11.1.4节 ),它更加有趣( 更新: ES3中已经存在):

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

(其中Elision_opt是Elision opt ,这意味着Elision是可选的)

Elision被定义为

 Elision : , Elision , 

所以,像一个数组文字

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

是完全合法的。 这将创建一个包含两个元素的数组,但将数组长度设置为2 + 3 = 5

不要期望从IE(IE9之前)太多…

只是提醒/警告,这是JavaScript / ECMAScript标准和JSON标准不同的地方之一。 尾随逗号在JS中有效 ,但在JSON中无效

更有趣的是,IE7给了

 [1,].length --> 2 

而Firefox和Chrome

 [1,].length --> 1 

你可以在这里找到javascript(又名ECMA脚本)的规范。 您可以在第63页找到数组的相关定义,正如Felix指出的那样,对象定义在第65页稍后介绍。

虽然这个规范说尾随是好的,我不知道这是否真的会回溯到几个版本。 正如你已经注意到的IE8-将自己废话,如果你留下一个尾随逗号,但铬和FF处理罚款。

在Chrome 52上:

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

我只是不喜欢尾随的逗号。 人们通常在开源项目中使用它们来避免擦除另一个提交者写的行。 在Python中查看相同的问题: https : //stackoverflow.com/a/11597911/968988