const 限制变量绑定不可变而非对象内容不可变;对基本类型值完全不可变,对引用类型仅锁定内存地址,允许修改属性或调用原生变更方法,禁止重新赋值变量;真正冻结对象需 object.freeze()。

因为 const 限制的是变量绑定(即内存地址)不可变,不是对象内容不可变。
const 锁住的是“指针”,不是“盒子”
JavaScript 中,对象是引用类型,变量存储的其实是指向堆内存中对象的地址。const 做的只是确保这个地址不被替换——就像把一把锁装在门把手上,但没锁住门里的抽屉。
- ✅ 允许:修改属性(
obj.name = 'Tom')、新增属性(obj.age = 25)、删除属性(delete obj.id) - ✅ 允许:调用会改变自身的原生方法(如
arr.push(4)、map.set('key', 'val')) - ❌ 禁止:重新赋值整个变量(
obj = {x: 1}或arr = [5,6])——这会试图更换“门把手指向的位置”,触发报错
基本类型和引用类型的区别很关键
const 对不同类型的作用效果不同:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 基本类型(string/number/boolean/null/undefined/symbol):值直接存在栈上,const 确实让值完全不可变
- 引用类型(object/array/function/Date/RegExp 等):变量存的是地址,const 只冻结该地址,不冻结地址所指的数据结构
想真正禁止修改属性?得用 Object.freeze()
Object.freeze() 是浅冻结,能阻止添加、删除、重写自有属性:
- ✅
user.name = 'Bob'失效(严格模式下报错,非严格模式静默失败) - ⚠️ 注意:它不递归冻结嵌套对象。例如
user.profile.city = 'Shanghai'仍可能成功 - ? 如需深冻结,需手动遍历或借助库(如
immer或自定义递归 freeze 函数)
常见误用提醒
别把 const 当作“不可变数据声明”,它本质是“不可重绑定声明”:
- const 数组可以
.push()、.pop()、.sort(),但不能= [] - const 函数可以正常调用,也能在内部修改外部对象(只要不给函数名重新赋值)
- for-of 循环中
for (const item of arr)每次迭代都新建一个 const 绑定,安全且推荐
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










