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