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
,将传递相同的引用给该变量。结果是myObj
和otherObj
都引用相同的对象值。
将myObj
重新分配为一个新的对象值不会对otherObj
产生任何影响。otherObj
仍然引用原始对象。如果JavaScript是按引用传递的,重新分配myObj
将会影响otherObj
,但事实并非如此。