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

时间:2019-03-23 11:26:39

标签: javascript arrays

正在编写一个接受数字数组的函数,如果缺少数字,则返回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 个答案:

答案 0 :(得分:7)

尾部逗号(“省略号”)将被忽略:

  

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

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
}

省略使初始化程序跳过下一个索引并增加整体length,因此

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

成为这个:

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

和两个尾随空格

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

成为

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

答案 1 :(得分:1)

[,1,2,3,4]不会创建[undefined,1,2,3,4]。它创建[empty, 1, 2, 3, 4]。这是一个稀疏的数组,开头有一个 hole

documentationTrailing commas

  

JavaScript会忽略数组中的尾部逗号。从一开始,JavaScript就允许在数组文字中使用尾随逗号,后来又将它们添加到对象文字(ECMAScript 5)中,最近(ECMAScript 2017)添加到函数参数中。

但是,如果使用了多个逗号,则会产生一个孔:

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

答案 2 :(得分:0)

该数组实际上是[empty,1,2,3,4],这里的empty基本上是一个内存孔。这是一个已丢失其内存引用的条目。详细说明的链接在这里

holes-arrays-es6