JavaScript中的稀疏数组与密集数组介绍及应用

151 阅读3分钟

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.length3 ,因为数组中的项目数是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中创建稀疏数组的方法?

喜欢这篇文章吗?请分享!