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
保證屬性值在初始化后不可變,但屬性的引用仍然可以改變(對于對象的屬性)或在類的構造函數之外無法修改(對于類的屬性)。