为什么在JavaScript数组中添加尾随逗号不会添加未定义?

6

我正在编写一个函数,接受一个数字数组作为参数,并返回true和缺失数字的索引,如果没有缺失数字则返回false。

我刚注意到了一些关于数组的事情,让我感到困惑。

例如:

[,1,2,3,4] 

将输出

[undefined,1,2,3,4]

数组以逗号开头,输出对我来说是有意义的。但是为什么会出现

这个标签呢?
[1,2,3,4,] // Notice that the array ends with a comma

打印

[1,2,3,4]  

我本以为输出结果应该是 [1,2,3,4,undefined]

有人知道为什么会这样吗?

3个回答

8

尾随逗号("省略符")会被忽略:

如果在数组末尾省略了一个元素,则该元素不会对数组的长度产生贡献。

http://www.ecma-international.org/ecma-262/7.0/#sec-array-initializer

注意,在右侧仅删除一个逗号,所以这个[1,2,,]将被呈现为[1,2,undefined]
在Javascript中,数组只是带有特殊length属性的对象,并且像初始化数组一样。
['a', 'b', 'c']

的缩写。
{
    "0": 'a', 
    "1": 'b', 
    "2": 'c',
    "length": 3
}

一个省略使初始化器跳过下一个索引并增加整体长度,因此这个。
['a', 'b', , 'c']

变成了这个:

{
    "0": 'a', 
    "1": 'b', 
    "3": 'c'
    "length": 4
}

和两个尾随省略号

['a', 'b', 'c', , ]

成为

{
    "0": 'a', 
    "1": 'b', 
    "2": 'c', 
    "length": 4
}

我不确定这个说法是否正确:“在 JavaScript 中,数组只是带有特殊长度属性的对象”。从哪个角度来看,这个说法才是正确的?用户接口? - XCS
@Cristy:请查看http://www.ecma-international.org/ecma-262/7.0/#sec-arraycreate,第6点。 - georg
但它也“继承”了所有的Array.prototype方法,因此长度并不是唯一的区别,正如所述。 - XCS
那很奇怪,但感谢你让我有了新的视角。 - DevGalT

1

[,1,2,3,4] 不会创建 [undefined,1,2,3,4],而是创建一个带有空洞的稀疏数组 [empty, 1, 2, 3, 4]

来自 文档尾逗号:

JavaScript 忽略数组中的尾逗号。从一开始 JavaScript 就允许在数组字面量中使用尾逗号,并在之后将其添加到对象字面量(ECMAScript 5)和最近的函数参数(ECMAScript 2017)中。

但是,如果使用多个尾逗号,则会产生一个空洞:

var arr = [1, 2, 3,,,];
console.log(arr.length) // 5


0
数组实际上会变成[empty,1,2,3,4],这里的empty基本上是一个内存洞。这是一个失去了内存引用的条目。详细解释的链接在这里:

holes-arrays-es6


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接