3

这里的 n00b 问题:

假设您调用一个函数来更新这样的数字或字符串

var x = "well";
var helloify = function(str){
  str += "hello"
};

我希望这种行为:

helloify(x);
console.log(x)
\\ "well hello"

但相反我得到

\\ "well"

“+=”不会改变“x”的值吗?这种变化是否只存在于函数的范围内而不存在于全局环境中?

谢谢!

- 使困惑

4

2 回答 2

5

当您调用时,helloify(x);您传递(字符串)的x不是x.

str += "hello"修改并单独str离开。x


注意:对象只能通过引用来寻址,因此如果x是对对象的引用,那么您将修改由两个变量寻址的单个对象。简单的字符串虽然不是对象。

于 2015-11-01T18:01:46.363 回答
0

这是因为参数的发送方式、字符串的处理方式以及操作员的+=实际操作。

参数是按值发送的,因此该函数不会获取字符串变量,而是获取对字符串对象的引用的副本。

字符串是不可变的,这意味着您永远不会更改字符串对象1。当您更改字符串时,实际上会创建一个具有新值的新字符串。

是的str += "hello"缩写str = str + "hello"。这意味着它将使用该值创建一个新字符串,str + "hello"并将对该字符串对象的引用放入变量中str

由于参数不是您发送到函数中的变量而是副本,因此为参数分配新字符串不会更改您在函数调用中使用的变量。


1如果 Javascript 引擎知道该字符串将不再被使用,即当它可以安全地这样做同时保持不可变字符串的行为时,它实际上可能会更改字符串对象。

于 2015-11-01T18:13:07.110 回答