提问人:juanisimioli 提问时间:1/25/2020 最后编辑:Calvin Nunesjuanisimioli 更新时间:1/25/2020 访问量:298
控制台 .log 引用对象不打印我执行的内容 [复制]
console.log of referenced object doesnt print what i expcected [duplicate]
问:
我有两个对象,一个函数和一些console.logs:
let obj1 = {
value: "a"
}
let obj2 = {
value: "b"
}
console.log(obj1.value)
console.log(obj2.value)
function change(obj1, obj2) {
obj1 = obj2;
obj2.value = "c";
console.log(obj1.value)
console.log(obj2.value)
}
change(obj1, obj2);
console.log(obj1.value)
console.log(obj2.value)
结果:
一 乙 丙 丙 一 丙
我期望:
一、
有人可以解释为什么价值是 A 而不是 C 吗?
答:
1赞
Siva K V
1/25/2020
#1
/* function scope obj1 and obj2, refer like function(f_obj1, f_obj2)
f_obj1 is reference to global obj1
f_obj2 is reference to global obj2 */
function change(obj1, obj2) {
/* f_obj1 = reference of f_obj2 */
obj1 = obj2;
/* f_obj2 is referring global obj2 and value updated in global */
obj2.value = "c";
/* printing the f_obj1 and f_obj2 values */
console.log(obj1.value)
console.log(obj2.value)
}
// Now out of the function, So f_obj1 and f_obj2 are out of scope.
0赞
Jackson D
1/25/2020
#2
当您将函数的参数命名为与全局变量相同时,该函数将在内存上为此变量创建另一个空间。在这种情况下,函数只会更改其内部的值...
尝试:
let obj1 = {
value: "a"
}
let obj2 = {
value: "b"
}
console.log(obj1.value)
console.log(obj2.value)
function change() {
obj1 = obj2;
obj2.value = "c";
console.log(obj1.value)
console.log(obj2.value)
}
change();
console.log(obj1.value)
console.log(obj2.value)
0赞
wouterlucas
1/25/2020
#3
赋值运算符仅生成对对象的引用,但不复制该对象。在本例中,obj1 已存在,并且未进行引用。JavaScript 与对象和赋值运算符(相对于其他变量相比)有点混淆。=
对象同化
通过使用同化运算符,您可以告诉编译器引用对象,而不是复制/浅拷贝。如果这是一个新变量,它将允许 2 种不同的方式获取相同的数据(就像 C 中的指针一样)。但是,obj1 已经存在(它是函数上的一个参数),因此它不会进行该引用。=
现在将 obj2 更改为 c,obj1 保持在 a(因为没有进行引用)。因此结果是 和 不是 .a b c c a c
a b c c c c
如果你想改变 obj1,你必须直接在 change() 函数中修改它,你不能使用 .或者使用 .assign() 创建 obj1 的克隆/副本。=
对于一篇关于物体的好文章(或者我喜欢它):https://scotch.io/bar-talk/copying-objects-in-javascript
但是,在提升这样的变量时要小心,从技术上讲,您是在更改函数之外更改变量。您可能希望将它们传回并在同一级别分配它们,而不是在更改函数中分配它们。
评论