javascript 函数内的突变

aoa*_*ony 4 javascript scope mutation

这里有n00b问题:

假设您调用一个函数来更新数字或字符串,如下所示

var x = "well";
var helloify = function(str){
  str += "hello"
};
Run Code Online (Sandbox Code Playgroud)

我期望这种行为:

helloify(x);
console.log(x)
\\ "well hello"
Run Code Online (Sandbox Code Playgroud)

但相反我得到

\\ "well"
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

- 使困惑

Que*_*tin 7

当您调用时,helloify(x);您传递的是(字符串)的而不是对 的引用xx

str += "hello"修改str并保留x


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

  • 这似乎是一种令人困惑的解释正在发生的事情的方式。字符串是不可变的,因此 `str += "hello"` 创建一个新字符串,并将该新字符串分配给 `str` 参数变量,该变量与最初传入的字符串无关。它的工作方式与传入一个对象而不是字符串,并将一个新对象分配给“str”。在内部,“str”本质上可能是一个指向“x”指向的同一字符串的指针(不是引用,而是指针)。分配给“str”然后将一个新的字符串指针放置在“str”变量中。 (3认同)