以下是代码:
var a = {};
var b = {name:"Spork"};
function connect(o1,o2){
o1 = o2;
};
connect(a,b);
console.log(a);
console.log(b);
打印:{}{name:"Spork"}
应该是:{name:"Spork"}{name:"Spork"}
请告诉我为什么最后没有指向b。如果在函数中通过引用传递对象,我认为我的函数告诉a指向与b相同的内存空间。
答案 0 :(得分:0)
关于变量的可见性,看到你在connect方法之外声明setInterval
,然后将它们传递给connect方法,var a = {}; var b = {name:"Spork"};
是o1 and o2
方法的本地方法并且connect
方法中发生的任何变化都不会反映在它之外,那就是为什么在打印它们时你不是空值connect
答案 1 :(得分:0)
"通过引用传递"只是一种抽象;您实际上是通过值传递对内存中对象的引用。因此o1
和o2
是包含a
和b
包含的相同引用的不同变量。
简单来说,a
和o1
是两个具有相同内容的不同容器。与b
和o2
相同。
由于o1
和o2
独立于a
和b
,因此将一个引用分配给另一个引用不会在函数外部执行任何操作;所有这一切都会覆盖o1
中的引用,这意味着o1
和o2
将引用相同的对象..
您想要的是修改引用指向的对象。在您的情况下,您希望将所有属性从一个对象(即o2
指向的对象)复制到另一个对象(o1
指向的对象)。
Javascript使用Object.assign()
提供了一种方便的方法:
function connect(o1, o2){
Object.assign(o1, o2);
}
Here是一个演示。