传递引用的JavaScript对象

Abh*_*hay 22 javascript

请阅读下面代码中的注释,以了解我想要问的内容.

预期输出:根据JavaScript中的pass-by-reference机制,objOne预计会{}在最后登录,因为objTwo已初始化{}.

var objOne = {
  x: 1,
  y: 2
};

var objTwo = objOne;

// change the x vlaue to 2 by objTwo
objTwo.x = 2;

// Change the value of key x in objOne as well - pass by reference mechanism
console.log(objOne); // { x: 2, y: 2 }

/*** Pass by reference is understood in code, above this comment ***/

// Now what if objTwo initialized with empty object
objTwo = {};

console.log(objOne); // { x: 2, y: 2 } but expected output = {}

// As per pass by reference mechanism. objOne is expected to log {}, because objTwo was initialized with {}.
Run Code Online (Sandbox Code Playgroud)

dec*_*eze 43

当您将一个变量分配给另一个变量时,并不是这两个变量现在都通过引用链接; 你误解了"通过​​引用传递"在这里意味着什么.

保持对象的变量不"直接"保持对象.它拥有的是对象引用.当您将该引用从一个变量分配给另一个变量时,您将复制该引用.现在两个变量都包含对象的引用.通过该引用修改对象会为包含对该对象的引用的两个变量更改它.

为其中一个变量分配新值时,只需修改变量所保存的值即可.变量现在停止持有对象的引用,而是持有其他东西.另一个变量仍然保留对原始对象的引用,赋值根本不影响它.

  • *"你误解了什么"通过引用传递"在这里意味着"*我借此机会告诉他们JavaScript根本没有通过引用****. (17认同)
  • @Caleth:这纯粹是传递价值.是的,该值可以是对象引用.对象引用就像其他任何值一样. (5认同)
  • @jpmc26 不。如果您分配对象以外的其他内容,则将不再有“引用”。变量保存的值是一个引用,但变量也可以保存其他值。 (2认同)
  • 是的,并使用该值为您提供了对象的引用语义,这是人们在说"通过引用传递"时所关心的 (2认同)
  • @Caleth :(如果你不是`@'不是作者的人,他们将不会收到你评论的通知.)这不是传递参考的意思,所以如果你遇到那些人,向他们解释.:-) Pass-by-reference是计算机科学界的一个艺术术语*.它指的是将**变量**的引用传递给函数.JavaScript不会这样做.在JavaScript等语言中理解对象引用最有力的事情之一是*它们只是值*. (2认同)
  • @Caleth:不,完全没有.再次:传递引用意味着将引用传递给**变量**,这样如果将该变量(通过引用)传递给函数,该函数可以更改**变量**.JavaScript没有那个.C++使用`&`参数,C#使用`ref`和`out`关键字,但JavaScript(如Java)不行.传递参考示例(在C#中):`void foo(ref arg){arg = 2; } int x = 1; foo(ref x); Console.WriteLine(x);`显示2,因为`foo`改变了`x`. (2认同)

Raz*_*ssa 14

当你评价

objTwo = {};
Run Code Online (Sandbox Code Playgroud)

Javascript解释为将objTwo重新分配给新的文字空对象,并将其旧值保留.

如果要通过引用从objOne中删除键,可以使用以下delete关键字:

delete objTwo.x;  // also deletes the x property of objOne
Run Code Online (Sandbox Code Playgroud)


hai*_*770 7

当2个变量指向同一个对象时,并不意味着它们现在神奇地"绑定"在一起.

在您的情况下,objTwo = {}只需更改objTwo为指向您创建的新对象.


Jos*_*eph 5

objTwo = {};并不像你想象的那样工作。我通常建议将变量视为“指针”。

objOneobjTwo是两个完全不同的变量。当你这样做时objTwo = {};,它所做的就是让objTwo变量指向另一个对象。它不会改变objOne变量。

让我们想象一下:

var objOne = {
  x: 1,
  y: 2
};

// objOne -> { x: 1, y: 2 }

var objTwo = objOne;

// objOne -> { x: 1, y: 2 } <- objTwo

objTwo.x = 2;

// objOne -> { x: 2, y: 2 } <- objTwo (update object via objTwo variable)

objTwo = {};

// objOne -> { x: 2, y: 2 }, objTwo -> {}
Run Code Online (Sandbox Code Playgroud)