我想知道为什么在JavaScript数组中将逗号放在单个元素的末尾是合法的:
var array = [ 'foo', // no error in IDE ]
将它放在对象中单个元素的末尾是非法的(至少我的IDE - WebStorm - 正在标记错误):
var object = { 'foo': 'bar', // error in IDE }
这在JavaScript中是非法的吗?
在ECMAScript 5规范中,它是合法的:
ObjectLiteral : { } { PropertyNameAndValueList } { PropertyNameAndValueList , }
这在ECMAScript 3中是非法的.
ObjectLiteral : { } { PropertyNameAndValueList }
我认为让这样的事情变得合法是合法的.
function getItems() { return { one : 1, two : 2, three : 3, //four : 4, }; }
而不是这个:
function getItems() { return { one : 1, two : 2, three : 3//, //four : 4, }; }
节省一些程序员的时间.
除了ChaosPandion所提到的,,
在对象的末尾和数组之间存在重要的区别.数组中的空逗号(技术上称为elisions)undefined
在相应位置插入元素; 这会增加数组的长度,但值会增加undefined
.
编辑:感谢ChaosPandion和CMS指出错误.我只是重读了规范,实际上单个尾随逗号不会增加长度,但是数组中间的任何额外的尾随逗号或任何逗号都会增加长度.
例如,[ 1,2,, ]
是一个长度为3且与之相同的数组[ 1, 2, undefined ]
.同样,[ 1,,,2 ]
是一个长度为4且与之相同的数组[ 1, undefined, undefined, 2 ]
.
奇怪的是,当涉及到JavaScript的这个"特性"时,IE在数组中使用尾随逗号(它计算额外元素)正确行为,而Firefox忽略最后一个未定义元素.