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

Posted

技术标签:

【中文标题】数组和对象中的尾随逗号是规范的一部分吗?【英文标题】:Are trailing commas in arrays and objects part of the spec? 【发布时间】:2011-11-06 23:29:20 【问题描述】:

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

【问题讨论】:

前几天发现的。作为一名 C# 程序员,我已经习惯了他们被允许... 我几周前处理过这个问题。想象一下,在没有任何较新的调试工具的情况下尝试在 IE7 中找到它... 当我发现像 JS、Ruby、C# 这样的语言支持这一点时,我很高兴——让复制粘贴测试数据变得容易......当我意识到 IE 甚至在这个方面也很糟糕时,这让我很生气...... 我想知道重要的空格而不是逗号(有点像 CoffeeScript)是否会导致任何语法歧义? 【参考方案1】:

规格:ECMAScript 5 和 ECMAScript 3


ECMAScript 5 规范中的Section 11.1.5:

ObjectLiteral :
     
     PropertyNameAndValueList 
     PropertyNameAndValueList , 

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

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

ObjectLiteral :
     
     PropertyNameAndValueList 

对于数组字面量 (Section 11.1.4),它更有趣(更新: 这在 ES3 中已经存在):

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

(其中Elision_opt 是省略号opt,表示省略号是可选的)

Elision 定义为

Elision :
    ,
    Elision ,

所以,像

这样的数组字面量
var arr = [1,2,,,,];

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

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

【讨论】:

我问 EndoPhage,你知道这是否也是 ES3 的标准吗?我似乎找不到它的规格 在这里:ecma-international.org/publications/files/ECMA-ST-ARCH/… 显然,对象字面量中的尾随逗号不在 ES3 规范中。但是数组的定义是一样的。 好吧,我遇到了数组元素,所以我想无论你怎么剪,MS都没有借口。再次感谢 对 Micro$oft Internet Explorer 感到羞耻【参考方案2】:

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

【讨论】:

但话又说回来,如果超集是为了“改变心意”,如果你只是调整一次,“你(仍然)会被爱吗?【参考方案3】:

IE7 更有趣的是

[1,].length  --> 2

Firefox 和 Chrome

[1,].length  --> 1

【讨论】:

但是[1,,].length 给出了2感觉:浏览器不做任何事情。 非常有意义,规范说(注意:单数)尾随逗号不会增加数组的长度。 Chrome 和 Firefox 已经正确实现了 ES5。 当有 2 个(复数)尾随逗号时,只有一个会增加数组的长度,所以说最后的尾随逗号被忽略似乎比说单个尾随逗号更准确忽略。 @JaredMcAteer 尾随逗号规则有一个例外:[,].length 给出1 @ElijasDapšauskas 这并不是一个例外。单数尾随逗号不会在长度上增加任何内容,但要让它存在,它的左边需要有一些东西,所以[,] 相当于[undefined,][undefined].length === 1。也许我评论的措辞使这种情况模棱两可,但规范没有。【参考方案4】:

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

虽然这个规范说有一个尾随, 很好,但我不知道回顾几个版本是否是真的。正如您所指出的,如果您留下逗号结尾,IE8- 会自行处理,但 Chrome 和 FF 处理得很好。

【讨论】:

在你的脑海中,这是 ES3 标准的一部分吗?我似乎找不到 ES3 规范 @Adam 我一直在寻找它...鉴于发布日期(ES3 于 1999 年发布,ES4 已被废弃,ES5 仅在 2009 年发布),它是有道理的在 ES3 标准中。或者可能只是 MS 又搞砸了一件事情。 鉴于 Felix 的回答,看起来 MS 又搞砸了一件事情。再次感谢你的【参考方案5】:

让我们分解一下。

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 deprecated Documentation 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

【讨论】:

【参考方案6】:

在 Chrome 52 上:

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

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

【讨论】:

为什么是'OUHHHHH'?如果不是 1,您还期待什么?您显然在该逗号之前“有一个元素”,就像 [1,] (长度:1)。 为什么是'OUHHHHH'?因为如果不阅读 RFC,我不希望从我不理解的代码中得到任何东西。是的,它就像[1,] 一样工作:在逗号之前显然有一些东西。但是在[,] 中,逗号前后的内容一样多。所以因为我不明白[,]一个人,我不认为使用[1,]是个好主意。

以上是关于数组和对象中的尾随逗号是规范的一部分吗?的主要内容,如果未能解决你的问题,请参考以下文章

您可以在 JSON 对象中使用尾随逗号吗?

无论我是不是将尾随逗号放入数组中,性能是不是存在差异?

我应该在函数调用中的最后一个参数后添加一个尾随逗号吗?

x, = ... - 这个尾随逗号是逗号运算符吗?

Java中数组初始值设定项中带有尾随逗号的数组

JSON 从最后一个对象中删除尾随逗号