溫馨提示×

const和readonly有何區(qū)別

小樊
81
2024-10-12 17:08:19
欄目: 編程語言

constreadonly 在 JavaScript 中都用于聲明不可變的變量,但它們之間存在一些關(guān)鍵區(qū)別:

  1. 聲明方式const 用于聲明一個常量變量,其值在聲明時(shí)必須被賦值,且之后不能再次修改。而 readonly 用于聲明一個只讀的屬性,它可以用于聲明對象屬性或數(shù)組元素,其值在聲明時(shí)可以不被賦值,但之后也不能再次修改。
  2. 作用域const 聲明的變量具有塊級作用域,它只在聲明它的代碼塊內(nèi)有效。而 readonly 聲明的屬性具有對象級作用域,它只在定義它的對象內(nèi)有效。
  3. 賦值:對于 const 聲明的變量,其值在聲明時(shí)必須被賦值,且之后不能再次修改。而對于 readonly 聲明的屬性,其值在聲明時(shí)可以不被賦值,但之后也不能再次修改。需要注意的是,const 變量可以是對象或數(shù)組,但它們的屬性仍然是可變的。而 readonly 屬性必須是對象的屬性或數(shù)組的元素。

以下是一些示例代碼,以更好地理解 constreadonly 的區(qū)別:

// 使用 const 聲明一個常量變量
const pi = 3.14;
pi = 3.14159; // 報(bào)錯:TypeError: Assignment to constant variable.

// 使用 const 聲明一個具有塊級作用域的變量
if (true) {
  const message = "Hello, world!";
}
console.log(message); // 報(bào)錯:ReferenceError: message is not defined.

// 使用 readonly 聲明一個只讀的屬性
const obj = {
  name: "John",
  age: 30,
  readonly address: "123 Main St",
};
obj.address = "456 Elm St"; // 報(bào)錯: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; // 報(bào)錯:TypeError: Cannot assign to read only property 'sum' of object '[1, 2, 3]'.

需要注意的是,constreadonly 不能互換使用。const 聲明的變量不能被重新賦值,但它的屬性仍然是可變的;而 readonly 聲明的屬性不能被重新賦值,也不能被刪除。

0