Eloquent JavaScript表示字符串值是不可变的,因为第一个Stackoverflow问题的答案是:Understanding Javascript immutable variable
但是如果我们写下以下内容:var string = "hello world"; string = "permitted";
,字符串就会被修改。
我上面提到的答案只是解释了对象是可变的,而不是其他值。
由于字符串可以像我上面告诉你的那样进行修改,这是否意味着字符串原语值在成功'='时自动转换为对象?
因此,之前的代码将严格等同于:var string = new String("hello world"); string = new String("permitted")
。这可以解释为什么字符串的值被修改。
答案 0 :(得分:2)
您需要区分重新分配和变异:
let x = "abc";
x = "123"; // reassignment
console.log(x);
x[0] = "9"; // mutation
console.log(x);
突变后x
仍然包含"123"
,因为String
是不可变的。如果String
s是可变的,那么它当然会包含"912"
。
您还必须区分以下术语:
使用此声明let x = "abc"
,您声明变量x
并使用值"abc"
对其进行初始化。
每当你的代码中使用x
时(除非声明),它只是一个标识符,必须通过Javascript绑定到相应的变量声明。请注意,您可以在不同的范围内有多个let x = "abc"
声明,因此需要进行名称绑定:
let x = "abc";
{ // another scope
let x = "123";
{ // and yet another scope
console.log(x); // which is the corresponding variable of this identifier?
}
}
如果您想防止变量可以重新分配,您可以在ES2015中实际执行此操作:
const x = "abc";
x = "123"; // throws an Error
请注意,您修改了变量声明以实现此行为。
答案 1 :(得分:1)
也许演示会告诉你字符串是不可变的意义。
var stringobject = new String("test"); // or "test"; both yield same result
console.assert(stringobject.valueOf() === "test", "before");
stringobject[0] = "T"; // replace first char
console.assert(stringobject.valueOf() === "Test", "after");
console.log("Success?"); // or is it?