Skip to Content

面试导航 - 程序员面试题库大全 | 前端后端面试真题 | 面试

TypescriptTS 中 const 和 readonly 的区别

在 TypeScript 中,constreadonly 都是用来确保变量或对象的不可变性,但它们的作用范围和使用场景有所不同。

const

const 是 JavaScript 和 TypeScript 中的一种声明变量的方式,用来定义常量。它用于确保变量的值在声明后不能被重新赋值。const 只影响变量的绑定,而不是对象或数组本身的可变性。

  • 作用:确保变量的引用不可改变(即不能重新赋值)。

  • 范围:只作用于变量的绑定,不会影响对象或数组内部的内容。

如下例子所示:

const x = 10; // x = 20; // 错误:不能重新赋值 const arr = [1, 2, 3]; arr.push(4); // 允许:数组本身的内容可以修改 // arr = [4, 5, 6]; // 错误:不能重新赋值整个数组

在上面的代码中,x 被声明为常量,不能重新赋值。而 arr 的内容可以被修改,比如使用 push() 方法添加新元素,但不能将 arr 重新赋值为一个新的数组。

readonly

readonly 是 TypeScript 类型系统的一部分,它实际上并不改变运行时的行为,而是通过 类型检查 来保证不可修改性。具体来说,readonly 修饰符会使得对象的属性或数组的元素变得 只读,并且在类型检查阶段,TypeScript 会在编译时报告试图修改这些属性或元素的操作。

  • 作用:确保对象或数组的内容不可修改(即属性不可写)。

  • 范围:影响对象或数组中的元素(值本身),而不是变量的绑定。

如下例子所示:

interface Person { readonly name: string; readonly age: number; } const person: Person = { name: 'Alice', age: 25 }; person.name = 'Bob'; // 错误:不能修改 readonly 属性

在上面的例子中,nameage 被标记为 readonly,这意味着一旦为 person 对象赋值后,不能再修改这些属性的值。

对于数组,也可以使用 readonly 来确保数组的内容不可更改:

const numbers: readonly number[] = [1, 2, 3]; numbers.push(4); // 错误:不能修改 readonly 数组 // numbers = [4, 5, 6]; // 错误:不能重新赋值整个数组

在这里,numbers 被声明为只读数组,意味着不能对其内容进行任何修改。

constreadonly 的区别

特性constreadonly
作用对象变量绑定(不能重新赋值)对象的属性或数组的元素(不能修改其值)
修改对象内容允许修改对象的内容(如果对象是可变的)不允许修改对象的内容或数组的元素
作用范围只作用于变量的绑定,限制的是变量的引用作用于对象或数组元素,限制的是元素的可变性
数组示例允许修改数组内容,但不能重新赋值整个数组不能修改数组内容,包括添加、删除、修改元素
对象示例允许修改对象的属性值,但不能重新赋值整个对象不能修改对象的属性值,确保对象的属性为只读

结合使用 constreadonly

在某些情况下,你可能需要同时使用 constreadonly 来保证变量绑定和对象属性的不可变性。比如,你可以使用 const 来确保变量不重新赋值,使用 readonly 来确保对象或数组的元素不被修改。

// 使用 const 和 readonly 确保不可变性 const person: { readonly name: string; readonly age: number } = { name: 'Alice', age: 25, }; // person = { name: 'Bob', age: 30 }; // 错误:不能重新赋值整个对象 person.name = 'Bob'; // 错误:不能修改 readonly 属性

在这个例子中,const 保证 person 不能被重新赋值,readonly 保证 nameage 不能修改。

总结

const 用于确保变量的引用不可重新赋值,但不影响对象或数组内部的内容;而 readonly 用于确保对象的属性或数组的元素不可修改,常用于保证数据结构的不可变性。两者的主要区别在于,const 限制的是变量的绑定,readonly 限制的是对象或数组的元素的可变性。

最后更新于:
Copyright © 2025Moment版权所有粤ICP备2025376666