Javascript:通过引用传递对象

Posted

技术标签:

【中文标题】Javascript:通过引用传递对象【英文标题】:Javascript: Passing objects by reference 【发布时间】:2012-07-16 00:23:21 【问题描述】:

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

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 传递数据属性。然后将其分配给插件内部的一个属性。请记住,传递的数据是一个对象,我的问题是,这是在内存中创建两个变量还是插件中的数据属性引用了 DataStore 对象中的属性?

如果它在分配后没有保留引用,我如何将 DataStore 传递给插件并在本地保留对它的引用?或者我是否需要将 DataStore 作为全局变量保留在我的应用程序范围内并从插件全局引用它?

【问题讨论】:

AFAIK javascript 对象总是引用 @AlvinWong 不完全是。像 JavaScript 这样的 ECMAScript 实现中的对象只能通过引用访问,而对象引用是(可以赋值)。其他编程语言中已知的按引用调用不存在,它是始终按值调用。这与例如在 Java 中相同。 【参考方案1】:

dataStore.dataplugin.data 都引用了同一个对象 - 在这些“类”中的任何一个中改变对象(因为没有更好的术语)将导致对象对它们都发生突变(因为它们都是持有对同一对象的引用)。

【讨论】:

这是正确的,可能是未来谷歌人想要的实用信息。虽然此处的其他答案/cmets 列出了 javascript 实际上不是“按引用调用”的技术原因,但从程序员的角度来看,它在处理对象参数时的行为仍然非常相似。此外,我还要补充一点,如果您不希望出现这种行为,您需要执行以下操作(使用 jQuery,但每个库都有自己的实现)var copy = $.extend(true, , data); 然后传递 copy data【参考方案2】:

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

例如:

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

【讨论】:

不,没有“JS中的传递引用”,函数参数与其他值没有区别。在语言级别没有指针(可能在实现级别,但未指定)。引用不被覆盖,参数值是,参数是函数本地的。 @SeainMalkin 您接受了错误的答案。你明白只有引用值被复制(按值调用),而不是对象吗? @techfoobar "Call-by-reference" 或者,正如你所说的,"pass-by-reference" 在编程中有特定的含义。说“函数参数通过引用传递”(在 JS 中)简直是错误,就好像它们在某些方面很特殊,因为它们不是。分配什么,传递什么,是一个引用值,它被传递给函数(按值调用)。另请参阅"Functions and function scope" at MDN。 @techfoobar 更正:SpiderMonkey 是用 C 编写的。 @PointedEars 他的术语可能并不完美,但它传达了重点,这个例子证明了我想知道的。

以上是关于Javascript:通过引用传递对象的主要内容,如果未能解决你的问题,请参考以下文章

Javascript通过引用传递对象然后更新

Javascript 是不是通过引用或值将数组传递给函数?

通过引用javascript传递原始变量[重复]

JavaScript 是按引用传递还是按值传递语言?

使对象不通过引用传递

在 Javascript 中通过引用传递字符串