数组和对象中的尾部逗号是否属于规范的一部分?


215

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

前几天发现了这个。作为C#程序员,我是如此习惯被允许...
CaffGeek 2011年

5
几周前我处理了这个问题。想象一下,尝试在IE7中找到它而不使用任何较新的调试工具...
Ryan Miller

4
当我发现像JS,Ruby,C#之类的语言支持此功能时,这让我感到很高兴—使复制粘贴测试数据变得容易...当我意识到IE也
陷入困境

我想知道如果用空格代替逗号(类似于CoffeeScript)会引起语法歧义吗?
安迪2015年

Answers:


209

规格:ECMAScript 5ECMAScript 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_optElision opt在哪里,这意味着Elision是可选的)

Elision 被定义为

Elision :
    ,
    Elision ,

因此,像这样的数组文字

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

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

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


1
当我问EndoPhage时,您是否偶然知道这在ES3中是否也是标准的?我似乎找不到它的规格
Adam Rackis


1
显然,对象文字中的结尾逗号不在ES3规范中。但是数组的定义是相同的。
菲利克斯·克林

好吧,这是我遇到的数组元素,所以我想无论您如何削减MS都没有借口。再次感谢
Adam Rackis 2011年

在Micro $ oft Internet Explorer上
感到


52

IE7给人的印象更有趣

[1,].length  --> 2

而Firefox和Chrome

[1,].length  --> 1

16
但是[1,,].length2意识:浏览器什么都不做。
David Titarenco

84
规范说得很合理,规范说(尾注:单数)逗号不会增加数组的长度。Chrome和Firefox已正确实施ES5。
JaredMcAteer

7
当有两个(多个)尾随逗号时,数组的长度仅增加一个,因此说忽略最后一个尾随逗号比说忽略单个尾随逗号似乎更准确。
iconoclast 2014年

4

您可以在此处找到javascript规范(也称为ECMA脚本)。您可以在第63页上找到数组的相关定义,正如Felix所指出的,对象定义在稍后第65页上的几页中找到。

虽然此规范说有尾随是很好的,但,回头看几个版本,我不知道那是不是真的。正如您已经指出的,如果您留下逗号,IE8-会自行处理,但是Chrome和FF可以很好地处理它。


难道这不是ES3标准的一部分吗?我似乎找不到ES3规范
Adam Rackis

1
@Adam我一直在试图找到它...鉴于发布日期(ES3在1999年发布,ES4被放弃,ES5在2009年才发布),应该符合ES3标准。也可能只是MS搞砸了另一件事。
Endophage 2011年

鉴于Felix的回答,MS似乎又搞砸了一件事。再次感谢您
Adam Rackis 2011年

2

让我们分解一下。

JavaScript中的尾部逗号是标准格式吗?

是。从ECMAScript 5规范开始(也是Google和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的文档:https :
//developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Trailing_commas


1

在Chrome 52上:

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

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


13
为什么是“ OUHHHHH”?您还期望那里还有1个什么?您显然在逗号前“有一个元素”,就像[1,](长度:1)一样。
Fygo,2016年

为什么是“ OUHHHHH”?因为如果不阅读RFC,我不会理解我不理解的代码。是的,它的工作原理类似于[1,]:逗号前显然有一些东西。但是在[,]逗号前后都有很多。因此,因为我[,]不孤单,所以我认为使用[1,]不是一个好主意。
尼古拉斯·佐佐
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.