const修饰基本类型时值与地址均不可变,修饰对象时仅地址不可变而内容可改;声明必须初始化且为块级作用域。

const 修饰基本类型和对象,行为完全不同——关键不在“值能不能变”,而在“绑定的内存地址能不能换”。
修饰基本类型:值不可改,地址也不可换
基本类型(string、number、boolean、null、undefined、symbol、bigint)的值直接存在变量所指向的内存位置。const 声明后,这个位置的内容和地址都锁定:
- ✅ 正确:const count = 42; const flag = true; const name = "Alice";
- ❌ 报错:count = 43; // TypeError: Assignment to constant variable.
- ❌ 报错:name = "Bob"; // 同样报错,字符串字面量是基本类型
修饰对象(含数组、函数、日期等):地址不可换,内容可改
对象类型存储的是引用(即内存地址)。const 只禁止你把变量重新指向另一个地址,但不阻止你通过当前地址修改里面的数据:
-
✅ 正确:const user = { name: "Tom", age: 25 };
user.age = 26; // ✅ 修改属性没问题
user.job = "Engineer"; // ✅ 添加新属性也没问题 -
✅ 正确:const list = [1, 2];
list.push(3); // ✅ 数组方法可操作内部元素
list[0] = 99; // ✅ 直接改索引值也允许 -
❌ 报错:user = { name: "Jerry" }; // TypeError:试图换地址
list = []; // 同样报错
想真正冻结对象?得用 Object.freeze()
如果连对象内部也不希望被修改,const 不够用,要配合内置方法:
立即学习“Java免费学习笔记(深入)”;
-
✅ 冻结后不可增删改属性:const config = Object.freeze({ api: "https://api.example.com" });
config.api = "new"; // ❌ 无效(静默失败,严格模式下报错) - ⚠️ 注意:Object.freeze() 是浅冻结。若对象里嵌套了另一个对象,那个内层对象仍可修改,需递归冻结或使用第三方库。
声明时必须初始化,且作用域为块级
const 有两条硬性规则,和类型无关:
- ❌ 报错:const item; // SyntaxError:缺少初始化值
- ✅ 正确:const item = {}; 或 const item = [];
- if (true) { const x = 10; } console.log(x); // ReferenceError:x 在块外不可访问


















