const和readonly如何保證數(shù)據(jù)不變

小樊
82
2024-10-12 17:14:19

constreadonly 都可以用來聲明常量,但它們的使用場(chǎng)景和作用略有不同。

const 用于聲明一個(gè)在整個(gè)生命周期都不變的變量,即其值在初始化后不能被重新賦值。這意味著 const 變量必須是基本數(shù)據(jù)類型(如字符串、數(shù)字、布爾值等)或者一個(gè)不可變的引用類型(如不可變的數(shù)組、對(duì)象等)。對(duì)于引用類型,const 只保證引用本身不變,而引用的對(duì)象的內(nèi)容仍然可以改變。

示例:

const num = 42; // 基本數(shù)據(jù)類型,不可變
const str = "hello"; // 基本數(shù)據(jù)類型,不可變
const arr = [1, 2, 3]; // 引用類型,但數(shù)組內(nèi)容不可變
const obj = { key: "value" }; // 引用類型,但對(duì)象內(nèi)容不可變(需要使用 Object.freeze())

readonly 用于聲明一個(gè)只讀的屬性,即其值在初始化后不能被重新賦值。readonly 可以用于修飾對(duì)象的屬性或者類的屬性。對(duì)于修飾對(duì)象的屬性,readonly 只保證屬性值不可變,但屬性的引用仍然可以改變。對(duì)于修飾類的屬性,readonly 保證屬性值不可變,并且在類的構(gòu)造函數(shù)之外無法修改。

示例:

const obj = {
  key: "value",
  readonly anotherKey: "anotherValue", // 只讀屬性
};

obj.key = "newValue"; // 報(bào)錯(cuò):TypeError: Cannot assign to read only property 'key' of object
obj.anotherKey = "anotherNewValue"; // 報(bào)錯(cuò):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"; // 報(bào)錯(cuò):TypeError: Cannot assign to read only property 'myProperty' of object

總結(jié):

  • const 保證變量本身及其引用的對(duì)象內(nèi)容在初始化后不可變(對(duì)于基本數(shù)據(jù)類型)或不可變引用(對(duì)于引用類型)。
  • readonly 保證屬性值在初始化后不可變,但屬性的引用仍然可以改變(對(duì)于對(duì)象的屬性)或在類的構(gòu)造函數(shù)之外無法修改(對(duì)于類的屬性)。

0