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

IT技术 javascript
2021-01-24 13:18:49

尾随逗号是 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(); }
};
6个回答

规格: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 之前)...

对 Micro$oft Internet Explorer 感到羞耻
2021-04-01 13:18:49
好吧,这是我遇到的数组元素,所以我想无论你如何切割它,MS 都没有任何借口。再次感谢
2021-04-02 13:18:49
当我问 EndoPhage 时,你是否知道这是否也是 ES3 的标准?我似乎找不到它的规格
2021-04-07 13:18:49
显然,对象字面量中的尾随逗号不在 ES3 规范中。但是数组的定义是一样的。
2021-04-10 13:18:49

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

但是话又说回来,如果超组是为了“改变心意”,如果你只是调整一次,“你(仍然)会被爱吗”?
2021-04-08 13:18:49

更有趣的是,IE7 给出了

[1,].length  --> 2

而 Firefox 和 Chrome

[1,].length  --> 1
[1,,].length2. 感觉:浏览器没有。
2021-03-24 13:18:49
@JaredMcAteer 尾随逗号规则有一个例外:[,].length给出1
2021-03-31 13:18:49
完全有道理,规范说(注意:单数)尾随逗号不会增加数组的长度。Chrome 和 Firefox 已正确实现 ES5。
2021-04-01 13:18:49
当有 2 个(复数)尾随逗号时,只有一个会增加数组的长度,因此说最后一个尾随逗号被忽略似乎比说单个尾随逗号被忽略更准确。
2021-04-02 13:18:49
@ElijasDapšauskas 这并不是一个例外。单数尾随逗号不会向长度添加任何内容,但要使其存在,它的左侧需要有一些东西,因此[,]等效于[undefined,]and [undefined].length === 1也许我的评论的措辞使这种情况变得模棱两可,但规范却没有。
2021-04-02 13:18:49

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

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

鉴于 Felix 的回答,看起来 MS 又搞砸了一件事。再次感谢你的
2021-03-26 13:18:49
@Adam 我一直在试图找到它......鉴于发布日期(ES3 于 1999 年发布,ES4 被放弃,ES5 仅在 2009 年发布),它在 ES3 标准中是有道理的。或者可能只是 MS 搞砸了另一件事。
2021-03-30 13:18:49
在您的脑海中,这是 ES3 标准的一部分吗?我似乎找不到 ES3 规范
2021-03-31 13:18:49

让我们分解一下。

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