请阅读下面代码中的注释,以了解我想要问的内容.
预期输出:根据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
当您将一个变量分配给另一个变量时,并不是这两个变量现在都通过引用链接; 你误解了"通过引用传递"在这里意味着什么.
保持对象的变量不"直接"保持对象.它拥有的是对象的引用.当您将该引用从一个变量分配给另一个变量时,您将复制该引用.现在两个变量都包含对象的引用.通过该引用修改对象会为包含对该对象的引用的两个变量更改它.
为其中一个变量分配新值时,只需修改变量所保存的值即可.变量现在停止持有对象的引用,而是持有其他东西.另一个变量仍然保留对原始对象的引用,赋值根本不影响它.
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)
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 -> {}
Run Code Online (Sandbox Code Playgroud)