javaScript中常量的定义
2025年6月25日大约 2 分钟
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