Javascript 引用对象的console.log不打印我导出的内容

Javascript 引用对象的console.log不打印我导出的内容,javascript,function,object,pass-by-reference,pass-by-value,Javascript,Function,Object,Pass By Reference,Pass By Value,我有两个对象、一个函数和一些console.log: 让obj1={ 价值:“a” } 设obj2={ 值:“b” } console.log(obj1.value) console.log(obj2.value) 功能更改(obj1、obj2){ obj1=obj2; obj2.value=“c”; console.log(obj1.value) console.log(obj2.value) } 变更(obj1、obj2); console.log(obj1.value) console.

我有两个对象、一个函数和一些console.log:

让obj1={
价值:“a”
}
设obj2={
值:“b”
}
console.log(obj1.value)
console.log(obj2.value)
功能更改(obj1、obj2){
obj1=obj2;
obj2.value=“c”;
console.log(obj1.value)
console.log(obj2.value)
}
变更(obj1、obj2);
console.log(obj1.value)

console.log(obj2.value)
将函数的参数命名为与全局变量相同的参数时,函数将在内存中为此变量创建另一个空间。在这种情况下,函数只更改自身内部的值

尝试:


赋值
=
运算符只生成对对象的引用,而不复制对象。在这种情况下,obj1已经存在,且未进行参考。JavaScript与对象和赋值运算符(与其他变量相比)有点混淆

对象分配

通过使用assigment
=
操作符,您告诉编译器对对象进行引用,而不是复制/浅复制。如果这是一个新变量,它将允许两种不同的方式来获取相同的数据(如C中的指针)。但是obj1已经存在(它是函数上的一个参数),因此它不会进行该引用

现在将obj2更改为c,obj1保持在a(因为未进行引用)。因此,结果是
abccacc
,而不是
abccc

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

对于一篇关于对象的好文章(或者我很喜欢):

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

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