繁体   English   中英

JavaScript数组是否关联?

[英]Are JavaScript arrays associative?

例如,如果我做[1000000] = 1; 它会为1000000个元素使用内存还是只为这个元素使用?

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

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

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


现在,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"

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

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

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

JS阵列正在自动增长。 在空数组上将[100]设置为1将使用“undefined”填充前99个元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM