[5-1] ES6+ 高频新特性 · 变量声明与数据结构的革命

2 阅读2分钟

所属板块: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]

SetNaN 的处理:SetNaN === 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. 小结 & 复习时的“现代化视角”

  • varlet/const:解决作用域与提升问题
  • 数组/对象 → Set/Map/Weak*:更安全、更高效的数据存储
  • [5-1] 的变量与数据结构革命,为后面箭头函数、Proxy、模块化打下基础

下一篇文章会进入 [5-2]:函数的全面进化(箭头函数四大特性 + 默认参数 + Rest 参数)。

返回总目录:戳这里