例如,如果我这样做 一个[百万] = 1; 它会为1000000个元素使用内存还是只为这个元素使用?
答案 0 :(得分:8)
在ECMAScript标准(第15.4节)中,关于数组的唯一特殊之处是length
属性会自动更新(以及一堆特定于Array的原型函数):
Array对象对某类属性名称进行特殊处理。当且仅当
ToString(ToUint32(
P {{ 1}}等于 P 和))
PToUint32(
不等于2 32 -1。<登记/> ...
每个Array对象都有一个)
属性,其值始终是小于2 32 的非负整数。length
属性的值在数值上大于名称为数组索引的每个属性的名称; ...
除此之外,Array只是一个Object,这意味着它可以被视为关联数组although you shouldn't。
现在JS引擎应检测阵列是密集还是非常稀疏,并在内部使用线性或关联数组之间切换。在您的情况下,JS引擎不会分配一百万个元素。
答案 1 :(得分: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's answer所示.JavaScript对象是完全关联的:
var o = { "key1": "value1", "key2": "value2" };
var i = "key2";
var v = o[i]; // -> v := "value2"
答案 2 :(得分:1)
在某些情况下,您可以使用对象文字作为一种“关联型aray”:
var object = {
"first": "1",
"second": "2",
"third": "3",
"fourth": "4"
};
object.fifth = "5";
object.["sixth"] = "6";
但它有其局限性......没有魔术'长度'参数,你将无法访问每个数组都有的方法。
答案 3 :(得分:0)
JS数组正在自动增长。在空数组上将[100]设置为1将使用“未定义”填充前99个元素。