任何提供数组(列表,向量,元组等)的编程语言都必须决定它们是否具有引用或值语义,通常/明显的选择是可变数组的引用语义和不可变数组的值语义。
提供可变数组的JavaScript似乎选择了引用语义,例如:给定
var a = [1, 2, 3]
var b = [1, 2, 3]
然后a != b
,正如预期的那样,因为虽然它们具有相同的内容,但它们是不同的数组。
然而,当您将它们用作对象中的键时,图像会发生变化;如果您将obj[a]
设置为某个值,则obj[b]
会获得相同的值。此外,如果更改数组的内容,这仍然是正确的;至少当我在Rhino中测试它时,它的行为似乎是解释器在每次查找时递归地比较提供和存储的键数组的全部内容,并检查如果其中一个数组被制作就会发生无限循环指出自己。
这是所有实现中的预期/指定行为吗?
它是否也适用于用作键的对象?
有没有办法获得其他行为,即使用数组作为具有引用语义的键来查找值?
答案 0 :(得分:8)
当数组用作属性名时,它们将被转换为字符串:
[1,2,3].toString() == '1,2,3'
转换为字符串值后,具有相同内容的数组将映射到同一属性。
要回答上一个问题,您不能使用对象来引用属性名称(键),只有同一个对象映射到同一属性(1:1映射)。
答案 1 :(得分: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"
}