javascript - 合并 Javascript 对象和指向它们的所有引用

标签 javascript underscore.js pass-by-reference

在 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/

相关文章:

javascript - Google Analytics 统计数据错误下降了 97%

javascript - Lodash:将具有重复值的数组转换为具有重复出现次数的对象

javascript - 我如何判断 Backbone.js 中的模型是否未更改?

javascript - 如何完成从下划线模板到 mustache 的For-Each循环

c++ - const 引用函数参数 : Is it possible to disallow temporary objects?

javascript - 如何在旋转javascript后获取裁剪坐标

javascript - 使用ajax获取数据时出错

c++ - 如何在我的实际参数中通过引用传递数组

javascript - 访问后端在另一个域上设置的 cookie

c++ - 简单程序中奇怪的引用传递问题