【问题标题】:How does JavaScript create sparse arrays?JavaScript 如何创建稀疏数组?
【发布时间】:2026-01-08 16:15:01
【问题描述】:

虽然我不知道这个功能的名称:

a = []
a[57] = "test";

console.log(a.length)
console.log(a[57])
console.log(a)

我很敬畏这是可能的。来自 C 背景,这种行为与分配内存之类的行为非常不同。所以有几个问题:

  1. Javascript 是否为数组中的前 57 个“空”条目分配内存?
  2. 如果不是,Javascript 如何保持 O(1) 用于使用碎片内存地址进行查找?
  3. Javascript 数组真的是一个数组还是只是一个以整数为键的对象?
  4. 这种设计模式叫什么,以便我可以进一步研究?

【问题讨论】:

  • C 是一种非常低级的语言,而JS 则不是。这就像一种“随心所欲地”的语言,我们将弄清楚如何做事情的后端。请记住,将变量分配给另一个变量的值是复制引用而不是值。
  • 根据标准 ecma 262,数组是一个exotic object
  • @Xorifelse “请记住,将变量分配给另一个变量的值是复制引用而不是值。”这仅适用于我理解的非原始数据,而不适用于布尔值、数字和字符串。

标签: javascript arrays


【解决方案1】:
  1. Javascript 是否为数组中的前 57 个“空”条目分配内存?

1.没有

JS 数组可能密集取决于引擎、构建它们的方式以及之后的使用方式。

只要您在定义所有元素且没有漏洞的情况下构造它们时,流行的引擎就会创建 密集 数组。

密集数组定义:

[0,1,2,3,4];

Array.apply(null, Array(4)); // This is creating an Array expanding the internal Sparse Array as it initial values.

稀疏数组定义:

[0,,2,3,4];

new Array();

new Array(4);
  1. 如果不是,Javascript 如何保持 O(1) 用于使用碎片内存地址进行查找?

2.取决于数组

对于密集数组,它将所有内容存储在同一块内存中。

对于稀疏数组,它将创建一个哈希表并独立存储指向每个元素的指针。

  1. Javascript 数组真的是数组还是只是一个以整数为键的对象?

3.它们是Object的一种类型

数组是常规的对象,具有一些属性,可以让它们按照您的预期运行。

使用1 等整数键(或"1" 等表示整数的字符串)访问元素将检索存储在该键下的任何内容。使用非整数(也不是整数的字符串表示)仍将设置/检索对象属性。

数组length只是Object的一个属性,它的值不受修改Object属性的影响。

  1. 这种设计模式叫什么,以便我可以进一步研究它?

4.不确定

【讨论】: