例如,如果我执行a[1000000]=1;,它会使用内存来存储1000000个元素还是仅用于这一个元素?
length
属性会自动更新(以及一堆Array特定的原型函数):
除此之外,数组只是一个对象,这意味着它可以被视为一个关联数组,尽管你不应该这样做。数组对象对某些属性名称给予特殊处理。当且仅当
ToString(ToUint32(
P))
等于P且ToUint32(
P)
不等于232−1时,属性名P(以字符串值的形式)是一个数组索引。
...
每个数组对象都有一个length
属性,其值始终为小于232的非负整数。length
属性的值在数值上大于每个名称为数组索引的属性的名称;...
会创建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
JavaScript数组是否是关联数组?
JavaScript数组是关联数组的一个子集(索引必须为整数,如KennyTM的回答所示)。而JavaScript对象则是完全的关联数组:
var o = { "key1": "value1", "key2": "value2" };
var i = "key2";
var v = o[i]; // -> v := "value2"
slice()
复制该数组将得到一个没有原始 "str" 属性的数组。如果需要在 Javascript 中使用关联数组,请使用对象。没有使用数组的好处,或者仅仅因为它表面上看起来可以作为关联数组而认为它是一个关联数组。 - Josh Townzen在某些情况下,您可以使用对象字面量作为一种“关联数组”:
var object = {
"first": "1",
"second": "2",
"third": "3",
"fourth": "4"
};
object.fifth = "5";
object.["sixth"] = "6";
JS数组是自动增长的。在空数组上将a[100]设置为1会用“undefined”填充前99个元素。
a[100]
)都将是未定义的。 - Miguel Venturaa[1]=undefined
。现在,a.length===2
,a['0']===undefined
且a[1]===undefined
,但是尽管 '1' in a
为 true
,'0' in a
却为 false
。 - bobince