为什么有逗号但没有元素的数组文字的长度不为0
Why do Array literals with commas but no elements not have a length of 0?
我只是在摆弄一些JS,发现了一些我认为不会发生的事情。
var arr = [,];
arr.length // 1
arr[0] // undefined
此外,[,,]
的长度为2。这些数组的长度不应该是0吗?我认为逗号只用于分隔数组中的元素,那么为什么逗号在这些特定的数组中被算作元素呢?数组的这种行为有任何应用吗?
在数组文字中,末尾的逗号会被忽略,但所有其他逗号都会分隔元素。如果省略元素的值,则默认为undefined
,但该元素仍然存在。所以
[,]
相当于
[undefined,]
相当于
[undefined]
这有一个元素,其值为undefined
。
类似的
[,,] = [undefined, undefined, ] = [undefined, undefined]
其具有2个元件。
当您想要省略数组中间的元素时,默认元素行为更有用。
[1, 2, 3, , , 6, 7, 8]
实际上,这两种创建未定义元素的方法之间有一点不同。在Javascript中,数组实际上是一个具有length
属性和属性的对象,这些属性的名称是数组元素的索引。通常,如果数组具有length = N
,则索引属性将是从0
到N-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",
]
这使得编辑更加容易,因为您可以插入和删除行,而不必对最后一个元素进行特殊处理。
这叫做省略。它在数组(稀疏数组)中创建一个"洞"。可能有一些应用程序我不知道也忘记了,我现在唯一能想到的就是我在这里展示的应用程序:https://stackoverflow.com/a/29629588/1034448.
[,...Array(10)].map((x, i) => { /* range of `i` is 1 - 10 */ })
CCD_ 13是而不是等价于CCD_ 14。这里有一个很大的区别:迭代方法不会在消隐索引中包含元素。示例:
var enumerated = [];
function callback (x, i) {
enumerated.push(i);
}
[,,].forEach(callback);
console.log(enumerated); // logs []
[undefined, undefined,].forEach(callback);
console.log(enumerated); // logs [1, 2]
基于https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Array_literals
在较新的浏览器中会忽略尾随逗号。
- 是索引数组文字的好做法
- 如何避免“;使用数组文字表示法“;以下javascript代码中的jslint错误
- 是否可以将字符串转换为文字对象数组
- 如何检查文字对象是否在 Javascript 数组中
- 混合了文字和数组的Javascript数组
- 为什么有逗号但没有元素的数组文字的长度不为0
- 如何在 JS 中编写数组文字表示法
- Javascript 数组“文字” - 这只是描述它是如何创建的,因为它可以即时更改
- 任意重新排序和排序对象文字的 JavaScript 数组
- 如何简化 JavaScript/ECMAScript 数组文字生成
- JavaScript/ECMAScript 数组文字生产的 LOOKAHEADs
- Javascript 对象数组文字的可靠长度
- 为什么JSLint告诉我“;使用数组文字符号[]&”;
- 使用JavaScript[]文字的数组的长度是否真正反映了其在内存中的物理大小
- 最奇怪的javaScript数组文字
- 带字符串拆分的JS Lint数组文字符号
- JavaScript数组文字定义中逗号后面的值是什么
- 将JSON名称/值转换为具有对象文字的数组
- 对象数组的 Javascript 文字表示法
- 在JavaScript中重写数组文字