javascript传递对象作为参考

时间:2013-06-02 06:37:48

标签: javascript variables object reference pass-by-reference

我有一个对象,它在函数内的许多不同函数中传递。这些函数可能会也可能不会更改对象的值,但如果它们确实更改了它,那么我希望获得对象的最新更改。

以下是我想要做的事情:

var ob = {text: 'this is me', name: 'john'}

function (object) {

     changeObject(object);
     customObjectChanger(object);
     callback = function (object) {
          object.text = 'new text';
     }

     callback(object);

     // object value here should be object{text: 'new text', name: 'john'};    
}

3 个答案:

答案 0 :(得分:109)

在JavaScript中,对象始终通过copy-reference传递。我不确定这是否是完全正确的术语,但是会传递对象引用的副本。

这意味着在执行完该功能后,您可以看到对该对象所做的任何更改。

代码:

var obj = {
  a: "hello"
};

function modify(o) {
  o.a += " world";
}

modify(obj);
console.log(obj.a); //prints "hello world"


话虽如此,因为只有副本传入的引用,如果你重新分配你函数内部的对象,这将 在函数外部不可见,因为它只是副本您更改的引用。

代码:

var obj = {
  a: "hello"
};

function modify(o) {
  o = {
    a: "hello world"
  };
}

modify(obj);
console.log(obj.a); //prints just "hello"

答案 1 :(得分:4)

“对象”不是JavaScript中的值,也不能“传递”。

您正在处理的所有值都是引用(指向对象的指针)。

传递或指定引用会给出另一个指向同一对象的引用。当然,您可以通过其他参考修改同一个对象。

答案 2 :(得分:1)

这是有关按值传递和按引用传递(Javascript)的更多说明。 在这个概念中,他们正在谈论通过引用传递变量和通过引用传递变量。

按值传递(原始类型)

var a = 3;
var b = a;

console.log(a); // a = 3
console.log(b); // b = 3

a=4;
console.log(a); // a = 4
console.log(b); // b = 3
  • 适用于JS中的所有原始类型(字符串,数字,布尔值,未定义,空)。
  • a分配了一个内存(例如0x001),并且b在内存中创建了一个值的副本(例如0x002)。
  • 因此,更改变量的值不会影响其他变量,因为它们都位于两个不同的位置。

通过引用传递(对象)

var c = { "name" : "john" };    
var d = c;

console.log(c); // { "name" : "john" }
console.log(d); // { "name" : "john" }

c.name = "doe"; 

console.log(c); // { "name" : "doe" }    
console.log(d); // { "name" : "doe" }
  • JS引擎将对象分配给变量c,它指向某个内存,例如(0x012)
  • d=c时,在此步骤d中指向相同的位置(0x012)。
  • 更改两个变量的任何更改值的值。
  • 功能就是对象

特殊情况,通过引用传递(对象)

c = {"name" : "jane"}; 
console.log(c); // { "name" : "jane" }    
console.log(d); // { "name" : "doe" }
  • equal(=)运算符设置新的内存空间或地址