我只是在摆弄一些JS,发现了一些我认为不会发生的事情。
var arr = [,];
arr.length // 1
arr[0] // undefined
而且,[,,]
的长度是2,这些数组的长度不应该是0吗?我认为逗号只用于分隔数组中的元素,那么为什么看起来逗号被算作这些特定数组中的元素?这种对数组的行为有什么应用吗?
发布于 2016-04-01 09:48:51
在数组文字中,末尾的逗号被忽略,但所有其他逗号分隔元素。如果省略了某个元素的值,它将默认为undefined
,但该元素仍然存在。所以
[,]
等同于
[undefined,]
这相当于
[undefined]
它有一个值为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",
]
这使得编辑变得更容易,因为您可以插入和删除行,而不必对最后一个元素进行特殊处理。
发布于 2016-04-01 09:48:34
https://stackoverflow.com/questions/36346684
复制相似问题