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

Ada*_*kis 207 javascript

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

我认为它们是标准的,但IE8遇到一个当然IE浏览器不支持的东西几乎不意味着它不标准.

这是我的意思的一个例子(在书籍数组的最后一个元素之后):

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(); }
};
Run Code Online (Sandbox Code Playgroud)

Fel*_*ing 202

规格:ECMAScript 5ECMAScript 3


ECMAScript 5规范中的第11.1.5节:

ObjectLiteral :
    { }
    { PropertyNameAndValueList }
    { PropertyNameAndValueList , }
Run Code Online (Sandbox Code Playgroud)

是的,它是规范的一部分.

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

ObjectLiteral :
    { }
    { PropertyNameAndValueList }
Run Code Online (Sandbox Code Playgroud)

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

ArrayLiteral :
    [ Elisionopt ]
    [ ElementList ]
    [ ElementList , Elision_opt ]
Run Code Online (Sandbox Code Playgroud)

(Elision_optElision 选择哪里,意味着Elision是可选的)

Elision 被定义为

Elision :
    ,
    Elision ,
Run Code Online (Sandbox Code Playgroud)

所以,数组文字就像

var arr = [1,2,,,,];
Run Code Online (Sandbox Code Playgroud)

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

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

  • 它在这里:http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf (2认同)

Joe*_*bey 88

只是一个快速提醒/警告,这是JavaScript/ECMAScript标准JSON标准不同的领域之一; 尾随逗号在JS 中有效,但在JSON中无效.

  • 该死的你子集!你会被爱的,,, (10认同)

see*_*eeg 51

什么是更有趣,IE7给出

[1,].length  --> 2
Run Code Online (Sandbox Code Playgroud)

而Firefox和Chrome

[1,].length  --> 1
Run Code Online (Sandbox Code Playgroud)

  • 有一个完美的意义,规范说,一个(注意:单数)尾随逗号不会增加数组的长度.Chrome和Firefox已正确实施ES5. (84认同)
  • 但是`[1 ,,].长度`给出了'2`.**感觉**:浏览器没有. (16认同)
  • 当有2个(复数)尾随逗号时,只有一个加上数组的长度,所以似乎更准确地说最后一个尾随逗号被忽略而不是说一个尾随逗号被忽略. (7认同)