const
和 readonly
都可以用来声明常量,但它们的使用场景和作用略有不同。
const
用于声明一个在整个生命周期都不变的变量,即其值在初始化后不能被重新赋值。这意味着 const
变量必须是基本数据类型(如字符串、数字、布尔值等)或者一个不可变的引用类型(如不可变的数组、对象等)。对于引用类型,const
只保证引用本身不变,而引用的对象的内容仍然可以改变。
示例:
const num = 42; // 基本数据类型,不可变
const str = "hello"; // 基本数据类型,不可变
const arr = [1, 2, 3]; // 引用类型,但数组内容不可变
const obj = { key: "value" }; // 引用类型,但对象内容不可变(需要使用 Object.freeze())
readonly
用于声明一个只读的属性,即其值在初始化后不能被重新赋值。readonly
可以用于修饰对象的属性或者类的属性。对于修饰对象的属性,readonly
只保证属性值不可变,但属性的引用仍然可以改变。对于修饰类的属性,readonly
保证属性值不可变,并且在类的构造函数之外无法修改。
示例:
const obj = {
key: "value",
readonly anotherKey: "anotherValue", // 只读属性
};
obj.key = "newValue"; // 报错:TypeError: Cannot assign to read only property 'key' of object
obj.anotherKey = "anotherNewValue"; // 报错:TypeError: Cannot assign to read only property 'anotherKey' of object
class MyClass {
readonly myProperty: string;
constructor(myProperty: string) {
this.myProperty = myProperty;
}
}
const instance = new MyClass("initialValue");
instance.myProperty = "newValue"; // 报错:TypeError: Cannot assign to read only property 'myProperty' of object
总结:
const
保证变量本身及其引用的对象内容在初始化后不可变(对于基本数据类型)或不可变引用(对于引用类型)。readonly
保证属性值在初始化后不可变,但属性的引用仍然可以改变(对于对象的属性)或在类的构造函数之外无法修改(对于类的属性)。