const仅防止变量重新赋值,不冻结对象内容;实现“局部冻结”需在块级作用域内用const声明引用类型并配合object.freeze()进行浅冻结,确保该引用在块内不可修改且作用域隔离。

块级作用域本身不冻结变量,const 也不冻结值——它只防止重新赋值。要实现“局部冻结”,关键在于:在块内用 const 声明引用类型(如对象、数组),再配合 Object.freeze() 或类似方法冻结其内容,从而让该引用在当前块内不可被修改。
const 确保引用不可重绑定
const 的作用是禁止对变量标识符进行二次赋值,但不阻止对象内部属性的变更。例如:
{
const obj = { a: 1 };
obj.a = 2; // ✅ 允许:修改属性
obj.b = 3; // ✅ 允许:添加属性
obj = {}; // ❌ 报错:不能重新赋值
}
因此,const 是“局部冻结”的第一步:锁定变量名与内存地址的绑定关系。
Object.freeze() 冻结对象自身可变性
在同一个块内,紧接着调用 Object.freeze() 可阻止添加、删除、修改自有属性(浅冻结):
Java Linux版下载入口,提供 Oracle JDK 26.0.2 官方 Linux 安装包、Java 环境配置、JDBC 数据库连接和 Java 服务端开发相关信息。
{
const obj = { a: 1 };
Object.freeze(obj);
obj.a = 99; // ⚠️ 静默失败(非严格模式)或报错(严格模式)
obj.b = 2; // ❌ 无效
delete obj.a; // ❌ 无效
}
注意:Object.freeze() 是浅冻结,嵌套对象仍可变。若需深冻结,需递归处理或使用第三方库(如 deep-freeze)。
配合块级作用域控制影响范围
将 const + freeze 放在花括号内,能确保冻结行为仅作用于该块,不影响外部同名变量或全局状态:
let globalObj = { x: 1 };
{
const localObj = { y: 2 };
Object.freeze(localObj);
// 此处 localObj 不可变,且离开块后自动销毁
}
// globalObj 不受影响,localObj 已不可访问
- 块外无法访问
localObj,天然隔离了冻结副作用 - 避免污染全局或函数作用域,适合配置对象、常量字典等一次性只读结构
- 结合
export可封装为模块级只读数据(如export const CONFIG = Object.freeze({...}))
数组和 Map/Set 的冻结方式
数组可用 Object.freeze(arr) 冻结(禁止增删改索引项),但要注意:
- 数组长度和元素值均受保护(浅层)
-
push/pop/splice等方法会静默失败或抛错 -
Map和Set无法直接冻结,需封装只读代理或转为冻结后的普通对象/数组
例如只读数组:
{
const list = [1, 2, 3];
Object.freeze(list);
list.push(4); // ❌ 无效
list[0] = 9; // ❌ 无效
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










