const保证基本类型变量不可重新赋值,靠的是运行时绑定约束机制:声明时将变量名与栈中原始值一次性绑定,后续任何赋值操作均触发TypeError;它不检查值是否改变,而是禁止变更绑定关系。

const 保证基本类型变量不可被重新赋值,靠的是语言层面的绑定约束机制:它把变量名和某个具体值(如数字、字符串)在内存中**一次性绑定**,之后任何试图用 = 给该变量名赋予新值的操作,都会在运行时触发 TypeError。
const 对基本类型的限制是直接且严格的
基本类型(string、number、boolean、symbol、bigint、null、undefined)的值本身存储在栈内存中。const 声明时,引擎不仅记录“这个变量叫什么”,还锁定“它只能指向这个原始值”。后续赋值不是修改值,而是想换一个新值来绑定——这被明确禁止。
-
声明必须初始化:不能写
const count;,否则报SyntaxError: Missing initializer -
赋值后无法覆盖:例如
const age = 25;,再写age = 26;会立刻抛出TypeError: Assignment to constant variable -
连“看似没变”的操作也不行:比如
const str = 'hello'; str[0] = 'H';不会报错但无效,因为字符串在 JS 中本就是不可变原始类型,const 在这里只是进一步封死了重新赋值的路径
它和 let/var 的本质区别不在“值”,而在“绑定”
var 和 let 允许你多次执行 = 操作,相当于不断更新变量名所关联的值;const 则把这扇门焊死了——从声明那一刻起,这个变量名就永久绑定到那个初始值上,不管它是 42 还是 'pi'。
- 这种约束发生在**运行时**,不是编译时检查(所以错误出现在执行那行代码时)
- 它不依赖类型系统或静态分析,是 JS 引擎对词法环境(Lexical Environment)中绑定记录(Binding Record)的强制保护
- 正因为基础类型值小、确定、不可拆分,const 的这种“绑定即锁定”策略对它们来说效果最直观、最彻底
为什么说“不可重新赋值”不等于“值不可变”?
这句话容易混淆,但关键在于:基本类型本身就没有“内部可变性”。比如你不能给数字加属性、不能 push 到字符串里——所以 const 对基本类型的保护,实际就是 100% 阻止了所有形式的值变更。这不是额外加锁,而是恰好匹配了它们的天然特性。
立即学习“Java免费学习笔记(深入)”;
-
const n = 100;→ 你既不能改n指向别的数,也不能让100变成101(因为数字值不可变) - 对比对象:
const obj = {};→ 你不能让obj指向另一个空对象,但可以往当前这个对象里加属性,因为对象本身是可变容器


















