在数组文字中,末尾的逗号被忽略,但所有其他逗号分隔元素。如果省略元素的值,则默认为undefined,但该元素仍然存在。所以
[,]
等价于
[undefined,]
相当于
[undefined]
这有 1 个元素,其值为 undefined。
同样
[,,] = [undefined, undefined, ] = [undefined, undefined]
其中有 2 个元素。
当您想省略数组中间的元素时,默认元素行为更有用。
[1, 2, 3, , , 6, 7, 8]
实际上,这两种创建未定义元素的方法之间存在细微差别。在 Javascript 中,数组实际上是一个对象,它具有 length 属性和名称是数组元素索引的属性。通常,如果数组有length = N,则索引属性将是从0 到N-1 的所有整数。但是,当您在数组字面量中省略一个元素时,不会为该索引创建任何属性。
在大多数情况下,这个缺失的属性并不重要,因为访问对象的不存在属性会返回undefined,就像您有一个值为undefined 的属性一样。您只能通过使用hasOwnProperty 之类的方法或调用Object.keys 来检测这些缺失的属性。 Javascript 控制台使用类似这样的东西来显示数组中的间隙,与显式 undefined 元素不同。
所以
Object.getOwnPropertyNames([1, 2, 3]) => ["0", "1", "2", "length"]
Object.getOwnPropertyNames([1, , 3, 4]) => ["0", "2", "3", "length"]
Object.getOwnPropertyNames([, , , , ]) => ["length"]
忽略最后一个逗号的原因是这样你可以写:
[
"foo",
"bar",
"baz",
"quux",
]
这使编辑更容易,因为您可以插入和删除行,而不必对最后一个元素进行特殊处理。