控制台.log引用的对象不会打印我所表达的内容



我有两个对象,一个函数和一些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 B C C A C

我期望:

A B C CC

有人可以解释为什么值是 A 而不是 C 吗?

/* 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.

当您将函数的参数命名为与全局变量相同时,该函数将在内存上为该变量创建另一个空间。在这种情况下,函数只会更改自身内部的值...

尝试:

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)

赋值=运算符仅生成对对象的引用,但不复制它。在这种情况下,obj1 已经存在,并且不会进行引用。JavaScript 与对象和赋值运算符(相对于其他变量(有点混淆。

对象同化

通过使用 assigment=运算符,您可以告诉编译器引用对象而不是副本/浅副本。如果这是一个新变量,它将允许 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

但是,在悬挂此类变量时要小心,从技术上讲,您将在更改函数之外更改变量。您可能希望将它们传回并在同一级别分配,而不是在更改函数中分配。

相关内容

最新更新