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
请注意,您修改了变量声明以实现此行为。
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
请注意,您修改了变量声明以实现此行为。