我需要在javascript中创建一个关联数组,其中的integer
键如下;
a["10"] = "ten";
但是当我创建一个数组时,它会将值放入数组的10th
索引中,并创建一个长度为 11 的数组。我希望它是一个键值对。我知道这可以通过使用对象来完成,但我只需要一个数组。
我需要在javascript中创建一个关联数组,其中的integer
键如下;
a["10"] = "ten";
但是当我创建一个数组时,它会将值放入数组的10th
索引中,并创建一个长度为 11 的数组。我希望它是一个键值对。我知道这可以通过使用对象来完成,但我只需要一个数组。
JavaScript 没有关联数组。在 JavaScript 中做到这一点的唯一方法是使用对象:
var a = {
'10': 'ten'
};
ECMAScript确实有关联数组1 - 对象(以及扩展的数组)就是一个例子
但是,数组的某些属性会被特殊处理:
数组对象对某一类属性名称给予特殊处理。属性名称
P
(以字符串值的形式)是数组索引当且仅当ToString(ToUint32(P))
等于P
....具体来说,每当添加名称为数组索引的属性时,如有必要,长度属性会更改为比该数组索引的数值大一..
因此,给定arr = []
,表达式arr["1"]
和arr[1]
引用相同的属性名称。由于P
(属性名称)是“1”并且length
从上面是 0,因此分配给此类属性将设置arr.length
为ToUint32(P)+1
或 2。
无法更改此行为。如果您不希望有特殊length
属性,请使用“普通”对象而不是数组。但是,许多Array.prototype
函数可以length
与具有属性的任意对象(除了一些实现怪癖)一起使用,并且可以创建一个 Object 以便它Array.prototype
用作自己的原型。
尽管如此,帖子并没有说明真正的问题是什么。与其假设它必须以那种特定的方式完成,不如考虑解释其意图是什么:例如为什么 a["10"]?如果对象将在列表中使用,那么如果有“11 个项目”有什么问题?
1请在辩论此声明之前阅读文章:名称中的术语“数组”并不意味着有序序列,也不排除长度的附加概念或哈希的使用等。如果您使用不同的定义,请确保指定它是什么以及给定操作所需的行为是什么。