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

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

我认为它们是标准的,但IE8在遇到IE之后呕吐,当然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是Elisionopt,这意味着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
链接地址: http://www.djcxy.com/p/27275.html

上一篇: Are trailing commas in arrays and objects part of the spec?

下一篇: Calulating length in Javascript