所属板块:5. ES6+ 高频新特性
记录日期:2026-03-xx
更新:遇到 let/const 或 Map/WeakMap 相关题时补充
1. let / const:彻底告别 var 的历史包袱
ES6 之前只有 var,存在三大问题:函数作用域、变量提升、挂载到全局对象。
let / const 的核心改进:
- 块级作用域:
{}就能形成独立作用域(if、for、单独 {} 都行) - 暂时性死区 (TDZ):声明前访问会直接报 ReferenceError(而不是 undefined)
- 不挂载到全局:
let/const声明的变量不会成为window的属性
console.log(a); // ReferenceError(TDZ)
let a = 1;
if (true) {
let b = 2;
}
console.log(b); // ReferenceError(块级作用域)
const 的误区:
const 只保证内存地址不变,对象内部属性仍可修改:
const obj = { name: "张三" };
obj.name = "李四"; // 可以
obj = {}; // 不可以(报错)
想完全冻结对象:Object.freeze(obj)
2. 解构赋值(Destructuring):写代码的“减法”
// 数组解构
const [a, b, ...rest] = [1, 2, 3, 4, 5];
// 对象解构(重命名 + 默认值 + 嵌套)
const { name: myName, age = 18, info: { city } } = user;
实战技巧:
- 交换变量(无需中间变量):
[a, b] = [b, a] - 提取嵌套 JSON:
const { data: { list } } = response;
3. Set 与 Map:更现代的数据结构
Set(成员唯一,自动去重):
const arr = [1, 2, 2, 3];
const unique = [...new Set(arr)]; // [1, 2, 3]
Set 对 NaN 的处理:Set 中 NaN === NaN(与数组不同)
Map(键可以是任意类型):
const map = new Map();
map.set(obj1, "value1"); // 对象也能做 key
map.set("string", 123);
console.log(map.get(obj1));
Map vs Object:
- Map 迭代顺序严格按插入顺序
- Map 可以用对象做 key(Object 只能用字符串/Symbol)
- Map 有原生 size 属性
4. WeakSet 与 WeakMap:内存管理的利器
核心特性:
- 键名必须是对象
- 弱引用(不会阻止垃圾回收)
经典用途:
- Vue3 响应式系统:用 WeakMap 存储依赖收集(对象被销毁时自动清理,避免内存泄漏)
- 在 DOM 节点上存储额外数据(节点销毁时自动释放)
const wm = new WeakMap();
wm.set(obj, "额外数据");
// obj 被垃圾回收后,wm 中对应的键值对自动消失
5. 小结 & 复习时的“现代化视角”
var→let/const:解决作用域与提升问题- 数组/对象 → Set/Map/Weak*:更安全、更高效的数据存储
- [5-1] 的变量与数据结构革命,为后面箭头函数、Proxy、模块化打下基础
下一篇文章会进入 [5-2]:函数的全面进化(箭头函数四大特性 + 默认参数 + Rest 参数)。
返回总目录:戳这里