const
和 readonly
在 JavaScript 中都用于聲明不可變的變量,但它們之間存在一些關鍵區別:
const
用于聲明一個常量變量,其值在聲明時必須被賦值,且之后不能再次修改。而 readonly
用于聲明一個只讀的屬性,它可以用于聲明對象屬性或數組元素,其值在聲明時可以不被賦值,但之后也不能再次修改。const
聲明的變量具有塊級作用域,它只在聲明它的代碼塊內有效。而 readonly
聲明的屬性具有對象級作用域,它只在定義它的對象內有效。const
聲明的變量,其值在聲明時必須被賦值,且之后不能再次修改。而對于 readonly
聲明的屬性,其值在聲明時可以不被賦值,但之后也不能再次修改。需要注意的是,const
變量可以是對象或數組,但它們的屬性仍然是可變的。而 readonly
屬性必須是對象的屬性或數組的元素。以下是一些示例代碼,以更好地理解 const
和 readonly
的區別:
// 使用 const 聲明一個常量變量
const pi = 3.14;
pi = 3.14159; // 報錯:TypeError: Assignment to constant variable.
// 使用 const 聲明一個具有塊級作用域的變量
if (true) {
const message = "Hello, world!";
}
console.log(message); // 報錯:ReferenceError: message is not defined.
// 使用 readonly 聲明一個只讀的屬性
const obj = {
name: "John",
age: 30,
readonly address: "123 Main St",
};
obj.address = "456 Elm St"; // 報錯:TypeError: Cannot assign to read only property 'address' of object 'obj'.
// 使用 readonly 聲明一個具有對象級作用域的屬性
const arr = [1, 2, 3];
Object.defineProperty(arr, "sum", {
value: function () {
return this.reduce((a, b) => a + b, 0);
},
writable: false, // 等同于 readonly
});
arr.sum = 6; // 報錯:TypeError: Cannot assign to read only property 'sum' of object '[1, 2, 3]'.
需要注意的是,const
和 readonly
不能互換使用。const
聲明的變量不能被重新賦值,但它的屬性仍然是可變的;而 readonly
聲明的屬性不能被重新賦值,也不能被刪除。