3

我需要在javascript中创建一个关联数组,其中的integer键如下;

a["10"] = "ten";

但是当我创建一个数组时,它会将值放入数组的10th索引中,并创建一个长度为 11 的数组。我希望它是一个键值对。我知道这可以通过使用对象来完成,但我只需要一个数组。

4

2 回答 2

8

JavaScript 没有关联数组。在 JavaScript 中做到这一点的唯一方法是使用对象:

var a = {
    '10': 'ten'
};
于 2013-01-14T04:49:10.770 回答
2

ECMAScript确实关联数组1 - 对象(以及扩展的数组)就是一个例子

但是数组的某些属性会被特殊处理

数组对象对某一类属性名称给予特殊处理。属性名称P(以字符串值的形式)是数组索引当且仅当ToString(ToUint32(P))等于P..

..具体来说,每当添加名称为数组索引的属性时,如有必要,长度属性会更改为比该数组索引的数值大一..

因此,给定arr = [],表达式arr["1"]arr[1]引用相同的属性名称。由于P(属性名称)是“1”并且length从上面是 0,因此分配给此类属性将设置arr.lengthToUint32(P)+1或 2。

无法更改此行为。如果您不希望有特殊length属性,请使用“普通”对象而不是数组。但是,许多Array.prototype函数可以length与具有属性的任意对象(除了一些实现怪癖)一起使用,并且可以创建一个 Object 以便它Array.prototype用作自己的原型。

尽管如此,帖子并没有说明真正的问题是什么。与其假设它必须以那种特定的方式完成,不如考虑解释其意图是什么:例如为什么 a["10"]?如果对象将在列表中使用,那么如果有“11 个项目”有什么问题?


1请在辩论此声明之前阅读文章:名称中的术语“数组”并不意味着有序序列,也不排除长度的附加概念或哈希的使用等。如果您使用不同的定义,请确保指定它是什么以及给定操作所需的行为是什么。

于 2013-01-14T05:17:03.517 回答