基础特性
声明时必须赋值 const
声明的变量必须在定义时初始化,否则报错
js
const PI; // 报错!未初始化
const PI = 3.14; // 正确
这一点与 let
和 var
不同(它们可以先声明后赋值)
变量名绑定不可变(基本类型)
用 const
声明基本类型(数字、字符串、布尔值)时,值不可修改
js
const MAX = 100;
MAX = 200; // 报错!常量值不可变
如果强行修改,浏览器会直接抛出错误
引用类型的特殊行为
常量指向的地址不变,但属性可修改
当 const
声明对象或数组时,变量保存的是内存地址(类似门牌号)。
- 门牌号不可变 → ❌ 不能重新赋值整个对象
- 屋内的家具可调整 → ✅ 可修改对象属性或数组元素
js
const person = { name: "小明" };
person.name = "小红"; // 允许!修改属性
person = { age: 18 }; // 报错!禁止更换对象
彻底冻结对象的方法 若需完全禁止修改对象,可使用 Object.freeze()
js
const obj = Object.freeze({ key: "值" });
obj.key = "新值"; // 修改无效(严格模式下报错)
注意:freeze
只能冻结第一层属性,嵌套对象仍需递归处理
其他规则
块级作用域
与 let
一致,const
只在 {}
内有效
js
if (true) {
const x = 10;
}
console.log(x); // 报错!x 未定义
禁止重复声明 & 存在暂时性死区(TDZ)
- 同作用域内不可重复声明:
const a=1; const a=2; // 报错
- 声明前访问会触发死区报错
js
console.log(a); // 报错!死区限制
const a = 5;
对比 const
vs let
vs var
特性 | const |
let |
var |
---|---|---|---|
作用域 | 块级作用域 | 块级作用域 | 函数/全局作用域 |
重复声明 | ❌ 禁止 | ❌ 禁止 | ✅ 允许 |
声明时初始化 | ✅ 必须 | ❌ 可选 | ❌ 可选 |
值可变性 | ❌ 基本类型不可变 ✅ 引用属性可修改 | ✅ 可随意修改 | ✅ 可随意修改 |
何时用 const
- 声明后永不改变的标识符(如数学常数、配置项)
- 引用类型数据(如对象、数组)需保持引用不变时
- 替代
var
避免意外覆盖
牢记
"const
认门牌:安家即落户(必须初始化),门牌永不换(绑定地址),屋里随便改(属性可调)。"