控制台 .log 引用对象不打印我执行的内容 [复制]

console.log of referenced object doesnt print what i expcected [duplicate]

提问人:juanisimioli 提问时间:1/25/2020 最后编辑:Calvin Nunesjuanisimioli 更新时间:1/25/2020 访问量:298

问:

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

JavaScript 函数 对象 按引用传递

评论


答:

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 ca b c c c c

如果你想改变 obj1,你必须直接在 change() 函数中修改它,你不能使用 .或者使用 .assign() 创建 obj1 的克隆/副本。=

对于一篇关于物体的好文章(或者我喜欢它):https://scotch.io/bar-talk/copying-objects-in-javascript

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