我正在我的一个项目中执行以下代码,其结果让我感到困惑。
function changeSomethingsValue (thingToChange) {
thingToChange = "something else";
}
var something = "something";
changeSomethingsValue(something);
console.log(something); // prints out "something"
我很困惑为什么
something
变量的值在通过 "something"
函数传递后仍然是字符串 changeSomethingsValue
。为什么会发生这种情况以及如何让函数将新值分配给传入的任何变量?
参数按值传递,而不是按引用传递。对于字符串,参数是字符串引用的副本。通过分配新引用来更改函数内的副本不会更改原始副本。
如果传入一个对象或数组,则可以更改其中的项目,而无需更改对该对象或数组的引用:
function changeSomethingsValue(thingToChange) {
thingToChange[0] = "something else";
}
var something = [ "something" ];
changeSomethingsValue(something);
console.log(something[0]); // prints out "something else"
当函数应将一个值作为输入并将更改后的值作为输出时,一种常见模式是返回值:
function changeSomethingsValue(thingToChange) {
return thingToChange + " else";
}
var something = "something";
something = changeSomethingsValue(something);
console.log(something); // prints out "something else"
传递基元(如字符串或数字)时,它是按值传递的。 您期望的是它通过引用传递。
修复方法是将
something
设置为 changeSomethingsValue
的返回值
function changeSomethingsValue (thingToChange) {
thingToChange = "something else";
return thingToChange;
}
var something = "something";
something = changeSomethingsValue(something);
console.log(something); // prints out "something"