在javascript中,变量引用objects are passed a "copy of the reference"。我正在努力解决这个概念,因为它涉及合并两个对象,以及对这些对象的引用的影响。尝试使用下划线扩展,请使用以下(coffeescript)代码:
a = {
id: 1
type: "cat"
name: "Angry"
}
b = {
id: 1
type: "dog"
owner: "Bill"
}
c = a
d = c
e = b
_.extend(a, b)
b = a
d.home = "Nashville"
console.log(a) //Object {id: 1, type: "dog", name: "Angry", owner: "Bill", home: "Nashville"}
console.log(b) //Object {id: 1, type: "dog", name: "Angry", owner: "Bill", home: "Nashville"}
console.log(c) //Object {id: 1, type: "dog", name: "Angry", owner: "Bill", home: "Nashville"}
console.log(d) //Object {id: 1, type: "dog", name: "Angry", owner: "Bill", home: "Nashville"}
console.log(e) //Object {id: 1, type: "dog", owner: "Bill"}
正如我们所看到的,下划线并没有“合并”。对象。相反,发生的事情是下划线设置了由b
引用的a
引用的对象的属性。稍后,当我们将b
所持有的引用替换为指向a
引用的对象时,e
继续保留对b
最初引用的对象的引用。这是因为e
未分配对b
的引用,而是b
所持引用的副本。同样,d
包含引用,而不是c
,而是a
引用的对象。
我想找到一种真正合并两个对象的方法,以便对两个对象的所有引用都指向一个目标。这在Javascript中是可行的,还是由于Javascript的对象传递结构而导致我无法做到这一点?
答案 0 :(得分:3)
我想找到一种真正合并两个对象的方法,以便对两个对象的所有引用都指向一个目标。这在Javascript中是可行的,还是由于Javascript的对象传递结构而导致我无法做到这一点?
如果不更改参考文件,即在访问所有变量并使用新参考值重新分配它们时,这是不可能的 - 在您的情况下,e = b
就像您b = a
一样
要获得预期的结果,您可能希望_.extend(a, b); _.extend(b, a);
使它们具有相同的属性 - 但它们会保留两个不同的对象。