关键字'const'不会使值不可变.这是什么意思?

Muk*_*mar 83 javascript const ecmascript-6

Axel Rauschmayer博士在Exploring ES6中const定义:

const像let一样工作,但是你声明的变量必须立即初始化,其值不能随后改变.[...]

const bar = 123;
bar = 456;  // TypeError: `bar` is read-only
Run Code Online (Sandbox Code Playgroud)

然后他写道

陷阱:const不会使值不可变

const 仅表示变量始终具有相同的值,但并不意味着值本身是或变为不可变的.

我对这个陷阱感到困惑.任何人都可以清楚地定义const这个陷阱吗?

Can*_*rop 149

当您使用constJavaScript创建内容时,您无法重新分配变量本身以引用其他内容.但是,变量仍然可以引用可变对象.

const x = {a: 123};

// This is not allowed.  This would reassign `x` itself to refer to a
// different object.
x = {b: 456};

// This, however, is allowed.  This would mutate the object `x` refers to,
// but `x` itself hasn't been reassigned to refer to something else.
x.a = 456;
Run Code Online (Sandbox Code Playgroud)

对于字符串和数字等基元,const更容易理解,因为您不会改变值,而是为变量赋值.

  • 这个答案要比公认的好得多.更简洁,包含实际的示例代码.(换句话说,*到达点*.)+ 1 (17认同)

Mik*_*ost 96

MDN总结得很好:

const声明创建对值的只读引用.它并不意味着它拥有的值是不可变的,只是不能重新赋值变量标识符.例如,在内容是对象的情况下,这意味着对象本身仍然可以被更改.

更简洁:const创建一个不可变的绑定.

换句话说:const,就像var一样,为你提供了一个可变的内存块,你可以在其中存储一些东西.但是,const指示你必须继续引用同一块内存 - 你不能将变量重新分配给不同的内存块,因为变量引用是常量.

要在你宣布它之后真正做出一些不变和不变的东西,你需要使用类似的东西Object.freeze().但是,这很浅,仅适用于键/值对.冻结整个对象需要更多的努力.以高效的方式反复这样做更具挑战性.如果你真的需要它,我建议你看看像Immutable.js这样的东西

  • 在C术语中:如果正常的`var x`是`struct Object*x`,则`const x`是`struct Object*const x`.指针无法更改; 它指向的东西可以. (20认同)

小智 15

重新绑定

constlet声明控制是否允许标识符和值之间的重新绑定(也称为重新分配):

const x = "initial value";
let y = "initial value";

// rebinding/reassignment

try { x = "reassignment" } catch(e) { console.log(x) } // fails

y = "reassignment"; // succeeds
console.log(y);
Run Code Online (Sandbox Code Playgroud)

不变性

不变性在类型级别受到控制.Object是一个可变类型,而是String一个不可变类型:

const o = {mutable: true};
const x = "immutable";

// mutations

o.foo = true; // succeeds
x[0] = "I"; // fails

console.log(o); // {mutable: true, foo: true}
console.log(x); // immutable
Run Code Online (Sandbox Code Playgroud)