尾随逗号在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为Elisionopt,意味着Elision是可选的)

省略被定义为

Elision :
    ,
    Elision ,

数组的字面意思是

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

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

不要对IE (IE9之前)期望太高……

其他回答

在Chrome 52上:

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

我只是不喜欢后面有逗号。人们通常在开源项目中使用它们,以避免删除另一个提交者所写的内容。在Python中可以看到同样的问题:https://stackoverflow.com/a/11597911/968988

更有趣的是,IE7提供了什么

[1,].length  --> 2

而火狐和Chrome

[1,].length  --> 1

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

让我们来分析一下。

在JavaScript中尾随逗号是标准的吗?

是的。ECMAScript 5规范(也是谷歌和Airbnb风格指南的一部分)

像Chrome和Firefox这样的浏览器能容忍它们吗?

这是一个ECMAScript 5支持问题。

像Babel这样的转译器将在转译代码中删除额外的尾随逗号,这意味着您不必担心传统浏览器中的尾随逗号问题。

这意味着:

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

因此,如果您正在使用ES5及以上版本的任何东西,则很可能不需要担心这个问题。

我以为它们是标准的,但IE8在遇到一个之后吐了出来——当然,IE不支持某些东西并不意味着它不是标准的。

同样,这是一个ECMAScript 5支持问题。IE8不支持ECMAScript 5(仅IE9及以上版本)

我强烈建议你看一看Airbnb的ES5弃用文档 https://github.com/airbnb/javascript/blob/es5-deprecated/es5/README.md#commas

我还推荐Mozilla的Docs: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Trailing_commas

你可以在这里找到javascript(又名ECMA Script)的规范。您可以在第63页找到数组的相关定义,正如Felix指出的,对象定义在几页之后的第65页。

虽然这个规范说有一个尾随是可以的,但我不知道回顾几个版本是否真的是这样。正如你所注意到的,如果你在后面留下逗号,IE8就会自动出错,但Chrome和FF处理得很好。