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

Axel Rauschmayer博士在探索ES6中有const定义 :

const像let一样工作,但是你声明的variables必须立即被初始化, 并且后面的值不能被改变 。 […]

 const bar = 123; bar = 456; // TypeError: `bar` is read-only 

然后他写道

陷阱:const不会使值不可变

const只意味着一个variables总是具有相同的值,但这并不意味着该值本身是或变成不可变的。

我很困惑这个陷阱。 任何人都可以用这个缺陷清楚地定义const吗?

MDN总结得很好:

const声明为一个值创build一个只读引用。 这并不意味着它所拥有的价值是不可变的,只是variables标识符不能被重新分配。 例如,如果内容是一个对象,这意味着对象本身仍然可以被改变。

更简洁:const创build一个不可变的绑定。

换句话说:const,就像var一样,给你一个可变的内存块,用来存储内容。 然而,const指出你必须继续引用同一块内存 – 你不能将variables重新分配给不同的内存块,因为variables引用是不变的。

在声明它之后,为了使事情保持不变和不变,你需要使用类似Object.freeze()东西。 然而,这是浅的,只适用于键/值对。 冻结整个对象需要更多的努力。 以一种高效的方式反复这样做更具挑战性。 如果你真的需要这个,我build议检查一下像Immutable.js这样的东西

当你在JavaScript中做一些const的时候,你不能重新分配variables本身来引用别的东西。 但是,variables仍然可以引用可变对象。

 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. xa = 456; 

对于像string和数字这样的基本types来说, const更容易理解,因为你不会改变这个值,而是给这个variables赋一个新的值。

重新绑定

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); 

const意思是:你不能改变初始赋值。

首先,定义js中的什么是价值 。 值可以是:布尔值,string,数字,对象,函数和未定义的值。

就像:人们用你的名字打电话给你,这不会改变。 但是,你换衣服。 人与你之间的约束就是你的名字。 其余的可以改变。 对不起,这个奇怪的例子。

那么,让我举几个例子:

 // boolean const isItOn = true; isItOn = false; // error // number const counter = 0; counter++; // error // string const name = 'edison'; name = 'tesla'; // error // objects const fullname = { name: 'albert', lastname: 'einstein' }; fullname = { // error name: 'werner', lastname: 'heisenberg' }; 
 // NOW LOOK AT THIS: // // works because, you didn't change the "value" of fullname // you changed the value inside of it! fullname.name = 'hermann'; const increase = aNumber => ++aNumber; increase = aNumber => aNumber + 1; // error // NOW LOOK AT THIS: // // no error because now you're not changing the value // which is the decrease function itself. function is a // value too. let anotherNumber = 3; const decrease = () => --anotherNumber; anotherNumber = 10; // no error decrease(); // outputs 9 const chaos = undefined; chaos = 'let there be light' // error const weird = NaN; weird = 0 // error 

正如你所看到的,除非你不把“第一个”赋值给一个const,否则没有错误。 每当你试图将第一个赋值改为别的东西时,它就会生气,并且会产生错误。

所以,这是使用const时你可能知道的第二件事。 也就是说, 它应该被初始化为其声明的价值,否则将会生气。

 const orphan; // error const rich = 0; // no error