4

任何提供数组(列表、向量、元组等)的编程语言都必须决定它们是否具有引用或值语义,通常/显而易见的选择是可变数组的引用语义和不可变数组的值语义。

提供可变数组的 JavaScript 似乎选择了引用语义,例如给定

var a = [1, 2, 3]
var b = [1, 2, 3]

然后a != b,正如预期的那样,因为尽管它们具有相同的内容,但它们是不同的数组。

但是,当您将它们用作对象中的键时,图片会发生变化;如果您设置obj[a]为一个值,则obj[b]获得相同的值。此外,如果您更改数组的内容,这仍然是正确的;至少当我在 Rhino 中测试它时,它的行为就好像解释器在每次查找时递归地比较提供和存储的键数组的全部内容,并检查如果其中一个数组被创建时会发生的无限循环指向自己。

这是所有实现中的预期/指定行为吗?

它是否也适用于用作键的对象?

有没有办法获得其他行为,即使用数组作为具有引用语义的键来查找值?

4

2 回答 2

8

当数组用作属性名称时,它们被转换为字符串:

[1,2,3].toString() == '1,2,3'

一旦转换为字符串值,具有相同内容的数组将映射到相同的属性。

要回答您的最后一个问题,您不能使用对象来引用属性名称(键),从而只有相同的对象映射到相同的属性(1:1 映射)。

于 2013-04-01T15:32:48.570 回答
4

obj[a]并将 在数组上obj[b]运行该toString函数并为两者产生相同的结果。它不会尝试将数组用作键。

var a = [1,2,3];


var x = {};

x[a] = "test";

var i;
for(i in x)
{
   alert(i);  //"1,2,3"
}

jsFiddle 示例

于 2013-04-01T15:33:22.593 回答