const声明的对象为什么可以修改

很多人看到const声明的对象类型的变量被修改了,感到很奇怪。

困惑

其实,我们所讲的使用const声明的变量不可以被修改,严格意义上来说是保存变量值的内存地址不能被修改。

对于基本类型的变量来说,变量就保存着内存地址的值,所以不能直接修改;

而对于引用类型的变量来说,变量保存的是一个指向数据内存地址的指针,只要该指针固定不变,我们就可以改变数据本身的值。

const person = {
  age: 12
};
person.name = 'andy';
person.age = 13;
console.log(person); // {age: 13, name: 'andy'}
person = {age: 12}; // TypeError: Assignment to constant variable.

在上面这个示例中,我们使用const定义了一个person变量,而且这个变量的值是“对象类型”,不管是新增属性还是修改属性,都能正常输出。

但是最后一行我们重新给person变量赋值的时候,就抛出异常。因为保存变量值的内存地址被修改了。