尾随逗号在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之前)期望太高……
让我们来分析一下。
在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