关键字'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赋一个新的值。
重新绑定
const
并let
声明控制标识符和值之间是否允许重新绑定(又名重新分配):
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