const锁住的是变量绑定的内存地址而非内容:基本类型不可变,引用类型内部属性可修改;需Object.freeze()实现浅冻结,深冻结需递归处理。

能修改,但仅限于对象、数组等引用类型内部的属性或元素;基本类型(如数字、字符串)一旦用 const 声明,值就完全不可变。
const 锁住的是“地址”,不是“内容”
JavaScript 中,const 保证的是变量绑定的内存地址不可更改——也就是你不能把变量重新指向另一个对象或值。但它不控制该地址所指向的数据结构是否可变。
- 基本类型(Number、String、Boolean、null、undefined、Symbol、BigInt)直接存放在栈中,地址和值是一体的 → const 声明后无法修改
- 引用类型(Object、Array、Function、Date、RegExp 等)在栈中只存一个指向堆中实际数据的指针 → const 只锁指针,不锁堆里的内容
哪些操作对 const 对象是安全的?
只要不改变变量本身的指向,以下操作都合法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 修改已有属性:obj.name = 'Tom'
- 新增属性:obj.age = 25
- 删除属性:delete obj.id
- 调用会变更自身的原生方法:arr.push(4)、map.set('key', 'val')
怎么真正禁止修改对象内容?
用 Object.freeze() 实现浅冻结:
立即学习“Java免费学习笔记(深入)”;
- const user = Object.freeze({ name: 'Alice' });
- 此时 user.name = 'Bob' 不生效(严格模式下直接报错)
- 注意:它只冻结第一层,嵌套对象仍可改;如需深冻结,需递归调用或借助 lodash.clonedeep 等工具
常见误用提醒
别把 const 当成“不可变对象”的语法糖:
- const arr = [1, 2]; arr = [3, 4]; → ❌ 报错(改了地址)
- const arr = [1, 2]; arr.push(3); → ✅ 合法(地址没变,只改了内容)
- const obj = {}; obj = { a: 1 }; → ❌ 报错
- const obj = {}; obj.a = 1; → ✅ 合法


















