2012-07-17 134 views
4

在我的应用程序中,当我将它传递给不同的对象时,我不确定是否复制数据。正如一个例子看看下面的代码:Javascript:通过引用传递对象

var DataStore = function(data) { 
    this.data = data; // <-- typeof data === 'object' 
} 

var Controller = function() { 
    var dataStore = new DataStore({foo: 'bar'}); 
    var plugin = new Plugin(dataStore.data); 
} 

var Plugin = function(data) { 
    this.data = data; 
} 

var app = new Controller(); 

当我创建插件它传递数据属性从dataStore。然后将其分配给Plugin内的属性。请记住,传递的数据是一个对象,我的问题是,这是在内存中创建两个变量,还是Plugin中的data属性引用DataStore对象中的属性?

如果在赋值之后没有保留引用,我该如何将DataStore传递到插件并在本地保存对它的引用?或者我需要将DataStore作为全局变量保存在我的应用程序范围中,并从插件全局引用它?

+0

AFAIK JavaScript对象总是引用 – 2012-07-17 05:25:50

+3

@AlvinWong不太。像JavaScript这样的ECMAScript实现中的对象只能通过引用来访问,而对象引用则是可以赋值的*值*。从其他编程语言*中已知的引用调用*不存在*,它总是*按值调用。这与例如Java中的相同。 – PointedEars 2012-07-17 05:32:37

回答

11

两个dataStore.dataplugin.data引用相同的对象 - 变异在任这些“类”的对象(因为缺乏一个更好的词)将导致对象被突变对他们俩的(因为它们都抱着引用同一个对象)。

+2

这是正确的,可能是未来Google员工所需的实用信息。虽然这里的其他答案/评论列出了为什么javascript实际上不是“通过引用调用”的技术原因,但它在处理对象参数时仍然表现得与程序员的角度非常相似。另外,我还会补充一点,如果你不希望出现这种行为,你需要做如下的事情(使用jQuery,但是每个库都有它自己的实现)'var copy = $ .extend(true, {},data);'然后传递'copy'而不是'data' – 2012-12-05 11:50:34

0

函数参数总是通过引用在JS中传递。当你传递一个对象作为参数时,通过的对象实际上是一个指针到对象在内存中的位置。如果您尝试覆盖引用本身,则原始对象不会发生任何变化,但是如果您更改了任何对象属性的值,则原始对象将被修改。

例:

function f1(_x) { 
    _x = 5; 
} 

function f2(_y) { 
    _y.name = 'Hello'; 
} 

var x = 10; 
f1(x); 
console.log(x); // no change to x 

var y = {name: 'Tom'}; 
f2(y); 
console.log(y.name); // y.name is now Hello 
+0

不,没有“JS中的传递引用”,函数参数与其他值没有区别。在语言层面没有指针(可能在执行级别,但没有指定)。参考不会被覆盖,参数值是,参数对于函数是局部的。 – PointedEars 2012-07-17 05:56:52

+0

谢谢。正是我想知道的。 – 2012-07-17 06:00:28

+1

@SeainMalkin你接受了一个错误的答案。你知道只有参考值被复制(按值),而不是对象? – PointedEars 2012-07-17 06:27:56