提问人:ljmccode 提问时间:7/4/2022 更新时间:7/4/2022 访问量:30
函数中的对象赋值对全局对象值的影响
Affects of object assignment within a function on global object values
问:
有人可以帮忙解释为什么 obj1 的值属性保持不变,而在 obj2 中它发生了变化?我知道这与 obj1 在更改函数中被分配给 obj2 有关,但我不确定为什么。谢谢!
let obj1 = {
value: "a"
}
let obj2 = {
value: "b"
}
function change(obj1, obj2) {
obj1 = obj2
obj1.value = "c"
}
change(obj1, obj2);
console.log("obj1: ", obj1, "obj2: ",obj2);
答:
1赞
Konrad
7/4/2022
#1
让我们重命名一些变量,以便您可以查看发生了什么
let obj1 = {
value: "a"
}
let obj2 = {
value: "b"
}
function change(param1, param2) {
param1 = param2
param1.value = "c"
}
change(obj1, obj2);
console.log("obj1: ", obj1, "obj2: ",obj2);
现在正如你所看到的,它永远不会改变。您要更改的是函数的参数,其名称与外部作用域中的变量相同。obj1
change
评论
0赞
ljmccode
7/4/2022
我想知道的是,为什么更改函数中的 param1.value = “c” 行更新了 obj2 的值而不是 obj1 的值?
1赞
Konrad
7/4/2022
因为你从来没有分配过,你改变了obj2
obj1
obj2
1赞
IT goldman
7/4/2022
#2
这是因为对象的变量实际上是指向对象的指针。这就是为什么当它们传递给函数时,指针属性的任何更改都会更改实际对象。然而,如果只是将值分配给 object 类型的变量,则指针本身会更改,而不是对象。
因此,将 obj1 指针设置为 obj2 指针。现在,如果对象 obj1(现在是 obj2)的属性将发生变化,从而影响原始对象。obj1 = obj2
obj1.value = "c"
评论
1赞
ljmccode
7/4/2022
我理解。假设我们将 change 函数中的参数重命名为 pointer1 和 pointer2(因为这些参数是指向内存中具有对象值的地址的指针)。当我们在 change 函数中分配 pointer1 = pointer2 时,我们现在说 change 函数中的 pointer1 变量现在是指向与 pointer2 相同的地址的指针。分配 pointer1 = pointer2 不会影响 obj1 指向的地址,因此 obj1 值保持不变。同时,obj2 指向的内存地址已更新为 value = “c”,因此已更新。
评论