Eloquent JavaScript :不可变的字符串值

Eloquent JavaScript : immutable string values

Eloquent JavaScript 表示字符串值是不可变的,作为第一个 Whosebug 问题的答案:Understanding Javascript immutable variable

但是如果我们这样写:var string = "hello world"; string = "permitted";,字符串真的被修改了。

我上面提到的答案只是说明对象是可变的,而不是其他值。

既然上面说的字符串是可以修改的,那是不是意味着字符串原始值在'='成功时自动转换为对象?

所以前面的代码将严格等同于:var string = new String("hello world"); string = new String("permitted")。这可以解释为什么修改字符串的值。

也许演示会告诉您字符串不可变意味着什么。

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?

您需要区分重新分配和变异:

let x = "abc";

x = "123"; // reassignment
console.log(x);

x[0] = "9"; // mutation
console.log(x);

变异后x仍然包含"123",因为String是不可变的。如果 String 是可变的,它当然会包含 "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

请注意,您修改了变量声明以实现此行为。