[英]Are trailing commas in arrays and objects part of the spec?
尾随逗号是 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 规范中的第 11.1.5 节:
ObjectLiteral :
{ }
{ PropertyNameAndValueList }
{ PropertyNameAndValueList , }
所以是的,它是规范的一部分。
更新:显然这是 ES5 中的新功能。 在 ES3(第 41 页)中,定义只是:
ObjectLiteral :
{ }
{ PropertyNameAndValueList }
对于数组文字(第 11.1.4 节),它甚至更有趣(更新:这在 ES3 中已经存在):
ArrayLiteral :
[ Elisionopt ]
[ ElementList ]
[ ElementList , Elision_opt ]
(其中Elision_opt
是 Elision opt ,意味着 Elision 是可选的)
Elision
被定义为
Elision :
,
Elision ,
所以,一个数组文字像
var arr = [1,2,,,,];
是完全合法的。 这将创建一个包含两个元素的数组,但将数组长度设置为2 + 3 = 5
。
不要对 IE 期望过高(IE9 之前)...
只是快速提醒/警告,这是JavaScript/ECMAScript 标准和JSON 标准不同的领域之一; 尾随逗号在 JS 中有效,但在 JSON 中无效。
更有趣的是,IE7 给出了
[1,].length --> 2
而 Firefox 和 Chrome
[1,].length --> 1
您可以在此处找到 javascript(又名 ECMA 脚本)的规范。 您可以在第 63 页找到数组的相关定义,正如 Felix 所指出的,对象定义在几页之后的第 65 页。
虽然这个规范说有一个尾随 是很好的,
我不知道回顾几个版本是否真的如此。 正如您所指出的,IE8- 如果您留下一个尾随逗号,它会自行处理,但 Chrome 和 FF 处理得很好。
在 Chrome 52 上:
[1,].length --> 1
[1,2,].length --> 2
[].length --> 0
[,].length --> 1 <<<<=== OUHHHHH !!!!
我只是不喜欢尾随逗号。 人们通常在开源项目中使用它们,以避免擦除其他提交者编写的行。 在 Python 中看到同样的问题: https : //stackoverflow.com/a/11597911/968988
让我们分解一下。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.