javascript传递对象作为参考

IT技术 javascript variables object reference pass-by-reference
2021-01-23 23:45:11

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

以下是我想要做的:

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个回答

在 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"

+1 清楚地描述了与传统传递引用的不同之处。
2021-03-17 23:45:11
en.wikipedia.org/wiki/Evaluation_strategy - 我更喜欢“Call By [Object] Sharing”,因为它的直接性、实现问题的分离以及与其他调用约定的歧义减少。ECMAScript在规范的任何部分没有为此目的使用“参考”。(参考规范类型不适用于函数调用。)
2021-03-25 23:45:11
我该如何处理这个问题?如果我想更改对象本身而不是它的副本引用怎么办?
2021-03-25 23:45:11
我想我已经明确表示传递的是对象引用的副本,而不是对象本身。
2021-04-05 23:45:11
@Abhinav1602 我想在函数内重新分配一个对象,它的新值在调用函数中可见。
2021-04-11 23:45:11

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

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

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

确实 - 所以对象引用的副本是......“通过” -_-
2021-03-25 23:45:11
简单,简洁的答案。将对象分配给变量时,分配的值是对该对象的引用。所以所有变量都持有一个值,但有些值是对对象的引用(例如对象、函数、数组),有些是文字(例如数字、字符串、布尔值和其他原语)。
2021-03-30 23:45:11
事实上,对象不会被传递,但引用会被传递,如果你在接收器函数内部改变它们,你可以修改它的属性
2021-04-09 23:45:11

这是对按值传递和按引用传递(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( =) 运算符设置新的内存空间或地址

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