53

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

以下是我想要做的事情:

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'};    
}
4

5 回答 5

157

在 JavaScript 中,对象总是通过复制引用传递。我不确定这是否是完全正确的术语,但将传入对象引用的副本。

这意味着对对象所做的任何更改都将在函数执行完成后对您可见。

代码:

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"

于 2013-06-02T06:45:38.853 回答
7

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

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

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

于 2013-06-03T08:52:31.450 回答
5

这是对按值传递和按引用传递(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( =) 运算符设置新的内存空间或地址
于 2018-09-25T17:24:53.393 回答
0

基本上,在 JavaScript 中,没有传递引用的概念,因为传递值的目的是使 JS 如此特别。当我们在 JavaScript 中传递一个对象时,1)函数需要带有值并且该值是引用副本 2)这个值是原始对象的地址。

于 2021-10-12T15:34:44.787 回答
0
于 2021-12-24T03:30:43.700 回答