首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么有逗号但没有元素的数组文字的长度不是0?

为什么有逗号但没有元素的数组文字的长度不是0?
EN

Stack Overflow用户
提问于 2016-04-01 09:44:19
回答 2查看 1.5K关注 0票数 17

我只是在摆弄一些JS,发现了一些我认为不会发生的事情。

var arr = [,];
arr.length // 1
arr[0] // undefined

而且,[,,]的长度是2,这些数组的长度不应该是0吗?我认为逗号只用于分隔数组中的元素,那么为什么看起来逗号被算作这些特定数组中的元素?这种对数组的行为有什么应用吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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,则索引属性将是从0N-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",
]

这使得编辑变得更容易,因为您可以插入和删除行,而不必对最后一个元素进行特殊处理。

票数 44
EN

Stack Overflow用户

发布于 2016-04-01 09:48:34

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36346684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档