使用const语法创建变量,一旦创建成功,就不能改变它们的值,因此我们称为常量。如果你尝试改变一个const变量,则会抛出异常
const a = 2;
a = 3
VM27863:1 Uncaught TypeError: Assignment to constant variable.
at <anonymous>:1:3
原理:阻隔变量所对应内存地址被改变
ES6在对变量的引用进行读取时,会从该变量当前所对应的内存地址所指向内存空间中读取内容。当变量改变时,引擎会重新从内存分配一个新的内存以存储新值,并将新值的内存地址与变量进行绑定。const的原理便是在变量名与内存地址时间建立不可变的绑定。
可变的对象变量
const obj = {name: 111}
obj.name = 222
这样是可以改变的,改变的只是对象属性的值,对象本身的地址引用并没有改变,所以不报错
obj = {age: 12}
这样就会报错,因为尝试去改变obj的地址引用
如何让对象的属性不可变呢
可以用Object.freeze(),该方法为浅冻结
const obj = Object.freeze({
name: 222,
school: {
name: '学校'
}
})
obj.name = 333 // 不会有任何变化,严格模式下会报错
obj.school.name = 'jj' // 会重新赋值