✅ ES6 中 `const` 的特点与变量声明方式总结

111 阅读2分钟

一、关于 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 声明变量的六种方法

序号命令特点
1var函数作用域,存在变量提升
2function函数声明,有函数提升
3let块级作用域,无变量提升,支持暂时性死区
4const块级作用域,常量(引用地址不可变),必须初始化
5import用于导入模块中的变量或函数
6class声明类,具有块级作用域

💡 总结:ES5 只有 varfunction 两种声明方式;ES6 新增了 letconstimportclass,总共 6 种声明变量的方式


📝 学习建议

  • 在需要不可变数据时优先使用 const
  • 如果只是希望变量不会被重新赋值,但允许修改内容(如对象属性),可以配合使用 const + Object.freeze()
  • 尽量避免在块级作用域中使用函数声明,推荐用函数表达式替代。
  • 使用 letconst 替代 var,以避免变量提升带来的潜在问题。