传递引用 JavaScript 对象

IT技术 javascript
2021-01-29 06:53:20

请阅读下面代码中的注释以了解我想问什么。

预期输出:根据 JavaScript 中的按引用传递机制,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 {}.
6个回答

当您将一个变量分配给另一个变量时,并不是这两个变量现在都通过引用链接;您误解了“通过​​引用传递”的含义。

保存对象的变量不会“直接”保存对象。它保存的是对对象引用当您将该引用从一个变量分配给另一个变量时,您正在制作该引用的副本。现在这两个变量都持有一个对象的引用。通过该引用修改对象会更改持有该对象引用的两个变量。

当您为其中一个变量分配一个新值时,您只是在修改该变量保存的值。该变量现在不再持有对对象的引用,而是持有其他东西。另一个变量仍然保留对原始对象的引用,赋值完全没有影响它。

@Caleth:这纯粹是按值传递的。是的,该值可以是对象引用。对象引用只是像任何其他值一样的值。
2021-03-14 06:53:20
@Caleth:(如果你不是@作者,他们不会收到你的评论通知。)这不是传递引用的意思,所以如果你遇到那些人,解释一下给他们。:-) 引用传递是计算机科学世界中的一个艺术术语它指的是将一个变量的引用传递给一个函数。JavaScript 不会那样做。要了解 JavaScript 等语言中的对象引用,最重要的事情之一就是它们只是值
2021-03-23 06:53:20
@jpmc26 不。如果您分配对象以外的其他内容,则将不再有“引用”。变量保存的值是一个引用,但变量也可以保存其他值。
2021-03-29 06:53:20
是的,并且使用该值可以为您提供对象上的引用语义,这就是人们在说“通过引用传递”时所关心的
2021-03-30 06:53:20
“你误会了什么‘按引用传递’的意思在这里”我想借此机会告诉他们,JavaScript并没有通过引用有通可言
2021-04-02 06:53:20

当你评价

objTwo = {};

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

如果你想通过引用从 objOne 中删除一个键,你可以使用delete关键字:

delete objTwo.x;  // also deletes the x property of objOne

当 2 个变量指向同一个对象时,并不意味着它们现在神奇地相互“绑定”了。

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

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

objOne并且objTwo是两个完全不同的变量。当你这样做时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 -> {}

我同意接受的答案,这只是一些支持它的代码。

let objOne = {x: 1, y: 2};
let objTwo = objOne; // referencing to same thing

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

let objThree = {};
objTwo = objThree; // notice this. Same as "objTwo = {}", except now you have objThree as initial reference
console.log(objOne, objTwo, objThree); // output {x:2, y:2}, {}, {}

您可以通过更改objTwo引用或添加完整的新值来轻松注意到发生了什么,如问题示例中所示。