在 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 的对象传递结构,我无法这样做?
最佳答案
I would like to find a way to truly merge the two objects, so that all references to both objects point at a single destination. Is this possible in Javascript, or am I precluded from doing this as a result of Javascript's object passing structure?
如果不更改引用,即访问所有变量并使用新的引用值重新分配它们,这是不可能的 - 在您的情况下,e = b
就像您对 b 所做的那样=a
.
要获得预期结果,您可能需要执行 _.extend(a, b); _.extend(b, a);
以便它们具有相同的属性 - 但它们仍然是两个不同的对象。
关于javascript - 合并 Javascript 对象和指向它们的所有引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28742013/