javascript传递对象作为参考

Bas*_*sit 39 javascript variables reference object 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'};    
}
Run Code Online (Sandbox Code Playgroud)

Ada*_*kis 121

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

这意味着在完成函数执行后,您可以看到对该对象所做的任何更改.

码:

var obj = {
  a: "hello"
};

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

modify(obj);
console.log(obj.a); //prints "hello world"
Run Code Online (Sandbox Code Playgroud)


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

码:

var obj = {
  a: "hello"
};

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

modify(obj);
console.log(obj.a); //prints just "hello"
Run Code Online (Sandbox Code Playgroud)

  • 我该如何解决这个问题?如果我想更改对象本身而不是其副本引用怎么办? (4认同)
  • +1用于清楚地描述与传统的传递参考不同的内容. (3认同)
  • http://en.wikipedia.org/wiki/Evaluation_strategy - 我更喜欢“通过[对象]共享调用”,因为它的直接性、实现问题的分离以及减少与其他调用约定的歧义。ECMAScript 在规范的任何部分*不*为此目的使用“参考”。(参考规范类型不适用于函数调用。) (2认同)
  • 我想我已经明确表示传递的是对象引用的副本,而不是对象本身。 (2认同)

new*_*cct 7

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

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

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

  • 确实 - 所以对象引用的副本是......“通过” -_- (3认同)

Ash*_*wat 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
Run Code Online (Sandbox Code Playgroud)
  • 适用于 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" }
Run Code Online (Sandbox Code Playgroud)
  • JS 引擎将对象分配给变量c,它指向一些内存,比如 (0x012)
  • d=c,在这一步中 d 指向同一个位置(0x012)。
  • 改变两个变量的任何改变值的值。
  • 函数是对象

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

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