JavaScript中常量的定义
2025年12月5日大约 3 分钟
JavaScript中常量的定义
基本类型
值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、空(Null)、未定义(Undefined)、Symbol
使用const定义
引用类型
引用数据类型(对象类型):对象(Object)、数组(Array)、函数(Function),还有两个特殊的对象:正则(RegExp)和日期(Date)。
在JavaScript中,引用类型的数据指向创建对象的内存地址
const创建的对象为 变量的绑定不可变,即为绑定的对象内存地址不可变,内部数据可以改变
Object.freeze
Object.freeze() 是 JavaScript 中用于冻结一个对象的方法。一旦对象被冻结,就无法再添加、删除或修改其属性。
Object.freeze() 的冻结只对单层对象生效,对于嵌套对象使用循环递归处于
function deepFreeze(obj) {
Object.getOwnPropertyNames(obj).forEach(prop => {
if (typeof obj[prop] === 'object' && obj[prop] !== null) {
deepFreeze(obj[prop]);
}
});
return Object.freeze(obj);
}Object.freeze() vs Object.seal() vs Object.preventExtensions()
JavaScript 提供了三种限制对象结构的方法,分别是 Object.freeze()、Object.seal() 和 Object.preventExtensions()。它们控制对象属性的添加、删除和修改能力。
🔍 对比表格
| 特性 | Object.preventExtensions() | Object.seal() | Object.freeze() |
|---|---|---|---|
| ✅ 是否可添加新属性 | 否 | 否 | 否 |
| 🗑️ 是否可删除已有属性 | 是 | 否 | 否 |
| ✏️ 是否可修改已有属性值 | 是 | 是 | 否 |
| ⚙️ 是否可修改属性描述符 | 是 | 否 | 否 |
| 🔁 是否递归冻结嵌套对象 | 否 | 否 | 否(可手动递归实现) |
1. Object.preventExtensions(obj)
- 禁止添加新属性。
- 允许删除和修改已有属性。
- 属性仍然是可配置的。
const obj = { name: 'Alice' };
Object.preventExtensions(obj);
obj.age = 30; // ❌ 无效,不能添加新属性
delete obj.name; // ✅ 可以删除属性
obj.name = 'Bob'; // ✅ 可以修改属性值Object.seal(obj)
- 禁止添加和删除属性。
- 允许修改属性值。
- 所有属性会被设为 configurable: false。
const obj = { name: 'Alice' };
Object.seal(obj);
obj.age = 30; // ❌ 无效,不能添加新属性
delete obj.name; // ❌ 无效,不能删除属性
obj.name = 'Bob'; // ✅ 可以修改属性值Object.freeze(obj)
- 禁止添加、删除和修改属性。
- 所有属性会被设为 configurable: false 且 writable: false。
const obj = { name: 'Alice' };
Object.freeze(obj);
obj.age = 30; // ❌ 无效
delete obj.name; // ❌ 无效
obj.name = 'Bob'; // ❌ 无效检查状态方法
Object.isExtensible(obj); // 是否可扩展
Object.isSealed(obj); // 是否被 seal
Object.isFrozen(obj); // 是否被 freeze背景
「JavaScript中常量的定义」属于语言语义边界主题。该类问题在重构阶段最容易引发“代码没报错但行为变了”的隐性风险。
核心原理
需要同时理解语法定义与运行时行为:作用域、提升规则、this 绑定、短路语义、类型判定边界。
实现方式 / 示例
建议每个结论都配“正例 + 反例 + 适用边界”,并明确推荐写法与禁用写法。
常见问题
- 只背结论,不验证边界。
- 在不同场景复用同一写法,忽略语义差异。
- 对常量语义(值不可变与引用可变)的认知不一致,会在评审与重构阶段持续引发分歧。
最佳实践
将知识点同步到 ESLint 规则、代码评审清单与模板代码,形成自动化约束。
总结
围绕「JavaScript中常量的定义」的关键不是记忆语法,而是把语义边界沉淀为可执行规范。
