这里的 n00b 问题:
假设您调用一个函数来更新这样的数字或字符串
var x = "well";
var helloify = function(str){
str += "hello"
};
我希望这种行为:
helloify(x);
console.log(x)
\\ "well hello"
但相反我得到
\\ "well"
“+=”不会改变“x”的值吗?这种变化是否只存在于函数的范围内而不存在于全局环境中?
谢谢!
- 使困惑
这里的 n00b 问题:
假设您调用一个函数来更新这样的数字或字符串
var x = "well";
var helloify = function(str){
str += "hello"
};
我希望这种行为:
helloify(x);
console.log(x)
\\ "well hello"
但相反我得到
\\ "well"
“+=”不会改变“x”的值吗?这种变化是否只存在于函数的范围内而不存在于全局环境中?
谢谢!
- 使困惑
当您调用时,helloify(x);
您传递(字符串)的值而x
不是对x
.
str += "hello"
修改并单独str
离开。x
注意:对象只能通过引用来寻址,因此如果x
是对对象的引用,那么您将修改由两个变量寻址的单个对象。简单的字符串虽然不是对象。
这是因为参数的发送方式、字符串的处理方式以及操作员的+=
实际操作。
参数是按值发送的,因此该函数不会获取字符串变量,而是获取对字符串对象的引用的副本。
字符串是不可变的,这意味着您永远不会更改字符串对象1。当您更改字符串时,实际上会创建一个具有新值的新字符串。
是的str += "hello"
缩写str = str + "hello"
。这意味着它将使用该值创建一个新字符串,str + "hello"
并将对该字符串对象的引用放入变量中str
。
由于参数不是您发送到函数中的变量而是副本,因此为参数分配新字符串不会更改您在函数调用中使用的变量。
1如果 Javascript 引擎知道该字符串将不再被使用,即当它可以安全地这样做同时保持不可变字符串的行为时,它实际上可能会更改字符串对象。