Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么带逗号但没有元素的数组文字长度不为0?_Javascript - Fatal编程技术网

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

Javascript 为什么带逗号但没有元素的数组文字长度不为0?,javascript,Javascript,我只是在摆弄一些JS,发现了一些我认为不会发生的事情 var arr = [,]; arr.length // 1 arr[0] // undefined 此外,[,]的长度为2。这些数组的长度不应该为0吗?我认为逗号只用于分隔数组中的元素,那么为什么在这些特定数组中逗号被视为元素呢?数组的这种行为有什么应用吗?基于 在较新的浏览器中,尾随逗号被忽略。在数组文本中,末尾的逗号被忽略,但所有其他逗号分隔元素。如果省略某个元素的值,它默认为未定义,但该元素仍然存在。所以 [,] 相当于 [und

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

var arr = [,];
arr.length // 1
arr[0] // undefined
此外,
[,]
的长度为2。这些数组的长度不应该为0吗?我认为逗号只用于分隔数组中的元素,那么为什么在这些特定数组中逗号被视为元素呢?数组的这种行为有什么应用吗?

基于


在较新的浏览器中,尾随逗号被忽略。

在数组文本中,末尾的逗号被忽略,但所有其他逗号分隔元素。如果省略某个元素的值,它默认为
未定义
,但该元素仍然存在。所以

[,]
相当于

[undefined,]
[undefined]
这相当于

[undefined,]
[undefined]
这有1个元素,其值为
未定义

同样地

[,,] = [undefined, undefined, ] = [undefined, undefined]
它有两个元素

默认元素行为在想忽略数组中间元素时更有用。

[1, 2, 3, , , 6, 7, 8]
实际上,创建未定义元素的两种方法之间有一个小的区别。在Javascript中,数组实际上是一个对象,它具有
length
属性,属性的名称是数组元素的索引。通常,如果数组具有
length=N
,则索引属性将是从
0
N-1
的所有整数。但是当您在数组文字中省略一个元素时,不会为该索引创建任何属性

在大多数情况下,缺少的属性并不重要,因为访问对象的不存在属性会返回
未定义的
,就像您有一个值为
未定义的属性一样。您只能通过使用类似于
hasOwnProperty
的方法或调用
Object.keys
来检测这些缺少的属性。Javascript控制台使用类似的方法来显示数组中的间隙,与显式
未定义的
元素不同

所以

忽略最后一个逗号的原因是您可以编写:

[ 
    "foo",
    "bar",
    "baz",
    "quux",
]

这使得编辑更容易,因为您可以插入和删除行,而无需对最后一个元素使用特殊的大小写。

这称为省略。它会在阵列(稀疏阵列)中创建一个“孔”。可能有一些应用程序我不知道也已经忘记了,我现在唯一能想到的就是我在这里展示的一个:

[,…数组(10)].map((x,i)=>{/*i`的范围是1-10*/})
[,]
不等同于
[未定义,未定义,]
。有一个很大的区别:迭代方法将不包括省略索引处的元素:

var枚举=[];
函数回调(x,i){
枚举。推送(i);
}
[,,]forEach(回调);
console.log(枚举);//日志[]
[undefined,undefined,].forEach(回调);
console.log(枚举);//日志[1,2]

我也这么想,但控制台与
[,]
[未定义,未定义]
略有不同。这是
[,]=[undefined×2]
。原因是什么,只是我的浏览器吗?这就是控制台显示稀疏数组的方式。所以可以安全地假设,如果逗号前没有任何内容,则默认为
未定义,
?实际上,这是有区别的。我会更新答案。可能是…的副本,也可能是相关的:@Gothdo:因为我不确定它是否是一个精确的副本(“解释差异”与“它们为什么有长度”),因为没有解释清楚,因为我已经回答了副本,因为提议的复制品本身是作为复制品关闭的……太多的怀疑以至于无法立即敲打它。考虑到很多人似乎都同意,我现在就这么做。仅根据你的回答,
[,]
[]
难道不一样吗?@eis否,[,]=[未定义,]=[未定义]。另一个是[]。我知道,但我看不到你在回答中这样说。