JavaScript是按值传递还是按引用传递?

JavaScript始终是按值传递的。这意味着JavaScript中的所有内容都是值类型,函数参数始终按值传递。然而,对象类型会引起一些困惑。

困惑之处在于对象类型是引用类型,它们是按值传递的。尽管听起来很奇怪,但是对象的引用是按值传递给函数的。这里的微妙差别在于,按值传递的对象引用与按引用传递对象不同。

简单来说,在函数内部对对象进行的更改会影响原始对象,因为它们都引用同一个对象。然而,重新分配原始对象的变量值不会影响函数引用的对象。让我用一个例子来演示:

let myObj = { a: 1 };
const myFunc = obj => {
  obj.a++;
  return obj;
}
let otherObj = myFunc(myObj);

myObj;                  // { a: 2 }
otherObj;               // { a: 2 }
myObj === otherObj;     // true

myObj = { a: 4, b: 0 };

myObj;                  // { a: 4, b: 0 }
otherObj;               // { a: 2 }
myObj === otherObj;     // false

在这个例子中,myObj是一个普通的JavaScript对象,作为参数传递给myFunc函数。myFunc函数内部的obj参数是对同一个对象myObj的引用。对obj进行的任何更改都会影响myObj,因为它们引用的是同一个对象。这意味着将函数调用的结果(obj)赋值给另一个变量otherObj,将传递相同的引用给该变量。结果是myObjotherObj都引用相同的对象值。

myObj重新分配为一个新的对象值不会对otherObj产生任何影响。otherObj仍然引用原始对象。如果JavaScript是按引用传递的,重新分配myObj将会影响otherObj,但事实并非如此。