雄辩的JavaScript:不可变的字符串值

时间:2016-09-17 11:48:57

标签: javascript string variables const immutability

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

但是如果我们写下以下内容:var string = "hello world"; string = "permitted";,字符串就会被修改。

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

由于字符串可以像我上面告诉你的那样进行修改,这是否意味着字符串原语值在成功'='时自动转换为对象?

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

2 个答案:

答案 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?