6

例如,如果我做 a[1000000]=1; 它会将内存用于 1000000 个元素还是仅用于这个元素?

4

4 回答 4

8

在 ECMAScript 标准(第 15.4 节)中,关于数组的唯一特殊之处是length属性会自动更新(以及一堆特定于数组的原型函数):

数组对象对某一类属性名称给予特殊处理。当且仅当P等于PP不等于 2 32 -1时,属性名称P(以字符串值的形式)是数组索引。 ... 每个 Array 对象都有一个属性,其值始终是小于 2 32的非负整数。该属性的值在数值上大于名称为数组索引的每个属性的名称;...ToString(ToUint32())ToUint32()

lengthlength

除此之外,数组只是一个对象,这意味着它可以被视为一个关联数组,尽管你不应该.


如今,JS 引擎应该检测数组是密集还是稀疏,并在内部使用线性数组或关联数组之间切换。在您的情况下,JS 引擎不会分配一百万个元素。

于 2010-04-04T21:19:57.267 回答
7

会创建 1,000,000 个元素吗?

不,数组是稀疏的,但它们的索引将是持久的。编辑:实际上,它们的稀疏性将是特定于实现的,但在我看来,保持它们的稀疏性a[1000000] = 1似乎是合乎逻辑的事情。

var a = [1, 2, 3, 4];
var x = a[1]; // -> x := 2

delete a[1];
var y = a[1]; // -> y := undefined

a[9] = 10;
var y = a[8]; // -> z := undefined

JS 数组是关联的吗?

JavaScript 数组是关联数组的子集(因为索引必须是整数,如KennyTM 的答案所示。JavaScript对象是完全关联的:

var o = { "key1": "value1", "key2": "value2" };
var i = "key2";
var v = o[i]; // -> v := "value2"
于 2010-04-04T20:52:15.087 回答
1

在某些情况下,您可以将对象文字用作一种“关联数组”:

var object = {
  "first": "1",
  "second": "2",
  "third": "3",
  "fourth": "4"
};
object.fifth = "5";
object.["sixth"] = "6";

但它有其局限性......没有神奇的“长度”参数,您将无法访问每个数组都有的方法。

于 2010-04-04T21:03:10.327 回答
0

JS 数组是自动增长的。在空数组上将 a[100] 设置为 1 将使用“未定义”填充前 99 个元素。

于 2010-04-04T20:53:06.743 回答