在JavaScript中,const关键字用于声明一个常量。一旦使用const声明了一个变量并用一个值对其进行了初始化,那么这个变量的值就不能被改变了。然而,这并不意味着const声明的变量就完全不能改变。特别是当我们用const来声明一个对象时,虽然我们不能重新为这个const变量赋值一个新的对象,但我们仍然可以修改这个对象的属性值。
举个例子,我们来看下面这段代码:
```javascript
const obj = { a: 10, b: 20 };
obj.a = 30; // 正确
obj.b = 40; // 正确
console.log(obj); // 输出:{ a: 30, b: 40 }
obj = { c: 50, d: 60 }; // 错误,TypeError: Assignment to constant variable.
console.log(obj);
```
在上面的代码中,我们首先使用const关键字声明了一个名为obj的对象,并为其初始化了一些属性和值。然后,我们尝试修改这个对象的一些属性值,这是完全可以的。但是,当我们试图将一个新的对象赋值给这个const变量时,就会抛出一个TypeError。
为什么会这样呢?这是因为JavaScript中的const关键字只是阻止了你直接更改引用类型变量的引用地址,也就是说你不能将新的引用类型的值赋给已经使用const声明过的变量。但是,它并没有阻止你修改这个变量所引用的对象的内部状态,也就是它的属性值。
如果我们真的想要创建一个不能被修改的对象,我们应该怎么做呢?我们可以使用Object.freeze()方法,这个方法可以冻结一个对象,使得不能再添加新的属性、删除已有属性以及修改属性的值和属性描述符。
例如:
```javascript
const obj = Object.freeze({ a: 10, b: 20 });
obj.a = 30; // 无效
obj.b = 40; // 无效
console.log(obj); // 输出:{ a: 10, b: 20 }
```
在这里,我们先创建了一个新对象,然后立即调用Object.freeze()方法将它冻结,然后再用const关键字声明并初始化变量obj。现在,无论我们怎么尝试修改obj的属性,都不会有任何效果。
通过这样的方式,我们就可以确保使用const关键字声明的对象不会被修改,从而实现真正的常量定义。