n00b问题:
假设你调用一个更新数字或字符串的函数
var x = "well";
var helloify = function(str){
str += "hello"
};
我期待这种行为:
helloify(x);
console.log(x)
\\ "well hello"
但我得到了
\\ "well"
不是“+ =”更改“x”的值?这种变化只会持续存在于功能范围内而不会存在于全球环境中吗?
谢谢!
- 混淆
答案 0 :(得分:3)
当您致电helloify(x);
时,您将x
(字符串)的值而不是引用传递给x
。< / p>
str += "hello"
修改str
并单独留下x
。
注意:对象仅通过引用进行寻址,因此如果x
是对象的引用,那么您将修改由这两个变量寻址的单个对象。简单的字符串不是对象。
答案 1 :(得分:0)
这是因为参数的发送方式,因为字符串的处理方式,以及+=
运算符的实际作用。
参数按值发送,因此函数不会获取字符串变量,它会获取对字符串对象的引用的副本。
字符串是不可变的,这意味着您永远不会更改字符串对象 1 。当你改变一个字符串时,实际上会创建一个带有新值的新字符串。
str += "hello"
是str = str + "hello"
的缩写。这意味着它将创建一个值为str + "hello"
的新字符串,并将该字符串对象的引用放在变量str
中。
由于参数不是您发送到函数中的变量而是副本,因此为参数指定新字符串不会更改您在函数调用中使用的变量。
1 Javascript引擎实际上可能会更改一个字符串对象,如果它知道该字符串将永远不再使用,即它可以安全地执行,同时保持不可变字符串的行为。