JavaScript中的稀疏数组与密集数组
JavaScript中的数组是相当容易使用的。然而,有一个细微的差别你应该注意:有些数组可能会有漏洞。
在这篇文章中,我将介绍JavaScript中稀疏数组和密集数组的区别。同时,你会发现创建稀疏数组的常见方法,只是要注意一下。
1.密集数组
JavaScript中的数组是一个代表项目有序集合的对象。
数组中的项目有一个确切的顺序。你可以用一个特殊的数字--索引来访问数组的第n个项目。
javascript
const names = ['Batman', 'Joker', 'Bane'];
console.log(names[0]); // logs 'Batman'
console.log(names[1]); // logs 'Joker'
console.log(names[2]); // logs 'Bane'
console.log(names.length); // logs 3
names[0] 访问索引为 (第一个元素)的数组中的项目。
该数组还有一个属性length ,它表示数组中的项目数。在前面的例子中,names.length 是3 ,因为数组中的项目数是3 。
这里有一个函数isDense(array) ,可以确定数组在每个索引上是否有项目。
javascript
function isDense(array) {
for (let index = 0; index < array.length; index++) {
if (!(index in array)) {
return false;
}
}
return true;
}
const names = ['Batman', 'Joker', 'Bane'];
console.log(isDense(names)); // logs true
其中index in array 确定array 是否在index 位置上有一个项目。
这里有一个有趣的问题:JavaScript中所有的数组都是密集的吗?或者有一些数组,当isDense(array) 会返回false?
让我们进一步挖掘吧!
2.稀疏的数组
不幸的是......有些情况下,JavaScript的数组会有漏洞。这样的数组被命名为稀疏数组。
例如,如果你使用数组字面,但省略了一个项目,那么就会在缺失的项目的位置上产生一个洞。结果就是创建了一个稀疏数组。
const names = ['Batman', , 'Bane'];
console.log(names[0]); // logs 'Batman'
console.log(names[1]); // logs undefined
console.log(names[2]); // logs 'Bane'
console.log(isDense(names)); // logs false
['Batman', , 'Bane'] array literal创建了一个稀疏数组,在 索引处有一个洞。如果你访问一个洞的值-- --它被评估为 。1 names[1] undefined
要明确地检查在一个特定的索引处是否有洞,你需要使用index in names 表达式。
const names = ['Batman', , 'Bane'];
// No hole
console.log(0 in names); // logs true
// Hole
console.log(1 in names); // logs false
当然,如果你在一个稀疏数组上运行isDense() ,它将返回false 。
javascript
const names = ['Batman', , 'Bane'];
console.log(isDense(names)); // logs false`
现在你对稀疏数组有了一个线索。但是,创建稀疏数组的常见方法是什么呢?
让我们在下一节中了解一下。
3.创建稀疏数组的方法
这里列出了在JavaScript中创建稀疏数组的最常见的方法。
3.1 数组字面
正如已经提到的,在使用数组字面的时候,省略一个值就可以创建一个稀疏数组(注意记录器数组中的empty 字)。
javascript
const names = ['Batman', , 'Bane'];
console.log(names); // logs ['Batman', empty, 'Bane']
3.2数组() 构造函数
调用Array(length) 或new Array(length) (带数字参数)会创建一个完全稀疏的数组。
javascript
const array = Array(3);
console.log(isDense(array)); // logs false
console.log(array); // logs [empty, empty, empty]
5.总结
在JavaScript中,一个数组可以是密集的,也可以是稀疏的。
如果一个数组从0 ,直到array.length - 1 ,每个索引都有项目,那么这个数组就是密集的。否则,如果在任何一个索引上至少缺少一个项目,这个数组就是稀疏的。
虽然你不会经常和稀疏数组打交道,但是你应该知道在哪些情况下会产生稀疏数组
- 当跳过一个数组字头内的一个值时
[1, , 3] - 当使用
Array(length) - 时,使用
delete array[index] - 增加
array.length属性时
稀疏数组的问题是,一些JavaScript函数(如array.forEach(),array.map(), 等)在迭代数组项目时跳过空洞。
你还知道哪些在JavaScript中创建稀疏数组的方法?