JavaScript数组是否关联?

Lem*_*m0n 6 javascript arrays associative

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

ken*_*ytm 8

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

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

lengthlength

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


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


Tom*_*lak 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
Run Code Online (Sandbox Code Playgroud)

JS数组是否关联?

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

var o = { "key1": "value1", "key2": "value2" };
var i = "key2";
var v = o[i]; // -> v := "value2"
Run Code Online (Sandbox Code Playgroud)

  • 数组是具有字符串数字键的对象.像所有对象一样,它们*是*关联的.浏览器通常*也*为数组中的数字键提供优化,但这是内部实现问题,而不是语言的一部分. (4认同)
  • 不,他们不是. (3认同)
  • JS数组_are_ associative. (2认同)