一、关于 const
🔒 基本特性
const声明的是常量,值一旦设定就不能更改。- 必须在声明时初始化,不能先声明后赋值。
const PI = 3.14;
// const PI; // ❌ 报错:必须立即赋值
📦 作用域
- 和
let一样,具有块级作用域,只在{}内有效。
{
const name = 'Tom';
}
console.log(name); // ❌ ReferenceError: name is not defined
⚠️ 注意:const 并不是让对象“不可变”
const只保证变量指向的地址不变,如果值是对象或数组,其内部数据是可以被修改的。
const obj = { name: 'Tom' };
obj.name = 'Jerry'; // ✅ 合法
🧊 真正冻结对象的方法:使用 Object.freeze()
- 冻结后,不能新增、删除或修改对象的属性(在严格模式下会报错)。
const foo = Object.freeze({});
foo.prop = 123;
// 非严格模式:无效但不报错
// 严格模式:TypeError: Cannot add property prop, object is not extensible
🧱 彻底冻结对象(包括嵌套对象)
const constantize = (obj) => {
Object.freeze(obj);
Object.keys(obj).forEach((key) => {
if (typeof obj[key] === 'object' && obj[key] !== null) {
constantize(obj[key]);
}
});
};
二、ES6 声明变量的六种方法
| 序号 | 命令 | 特点 |
|---|---|---|
| 1 | var | 函数作用域,存在变量提升 |
| 2 | function | 函数声明,有函数提升 |
| 3 | let | 块级作用域,无变量提升,支持暂时性死区 |
| 4 | const | 块级作用域,常量(引用地址不可变),必须初始化 |
| 5 | import | 用于导入模块中的变量或函数 |
| 6 | class | 声明类,具有块级作用域 |
💡 总结:ES5 只有
var和function两种声明方式;ES6 新增了let、const、import和class,总共 6 种声明变量的方式。
📝 学习建议
- 在需要不可变数据时优先使用
const。 - 如果只是希望变量不会被重新赋值,但允许修改内容(如对象属性),可以配合使用
const+Object.freeze()。 - 尽量避免在块级作用域中使用函数声明,推荐用函数表达式替代。
- 使用
let和const替代var,以避免变量提升带来的潜在问题。