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