例如,如果我做 a[1000000]=1; 它会将内存用于 1000000 个元素还是仅用于这个元素?
4 回答
在 ECMAScript 标准(第 15.4 节)中,关于数组的唯一特殊之处是length
属性会自动更新(以及一堆特定于数组的原型函数):
数组对象对某一类属性名称给予特殊处理。当且仅当P等于P且P不等于 2 32 -1时,属性名称P(以字符串值的形式)是数组索引。 ... 每个 Array 对象都有一个属性,其值始终是小于 2 32的非负整数。该属性的值在数值上大于名称为数组索引的每个属性的名称;...
ToString(ToUint32(
))
ToUint32(
)
length
length
除此之外,数组只是一个对象,这意味着它可以被视为一个关联数组,尽管你不应该.
如今,JS 引擎应该检测数组是密集还是稀疏,并在内部使用线性数组或关联数组之间切换。在您的情况下,JS 引擎不会分配一百万个元素。
会创建 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"
在某些情况下,您可以将对象文字用作一种“关联数组”:
var object = {
"first": "1",
"second": "2",
"third": "3",
"fourth": "4"
};
object.fifth = "5";
object.["sixth"] = "6";
但它有其局限性......没有神奇的“长度”参数,您将无法访问每个数组都有的方法。
JS 数组是自动增长的。在空数组上将 a[100] 设置为 1 将使用“未定义”填充前 99 个元素。