ES6是实质性语言升级,核心在于用let/const修复作用域、箭头函数约束this、解构赋值简化数据提取、模块系统规范依赖管理,关键在设计决策而非语法记忆。

ES6(ECMAScript 2015)不是“新特性集合”,而是一次实质性语言升级——它改变了你写 JavaScript 的基本方式。能否用好,不取决于是否知道 let 和 const,而在于是否理解它们如何影响作用域、提升可维护性、避免隐式错误。
let/const 替代 var:不是语法糖,是作用域修复
var 的函数作用域和变量提升常导致意外行为,比如循环中闭包捕获错误的索引值;let 和 const 引入块级作用域,并禁止重复声明与未声明赋值(ReferenceError),让逻辑更贴近直觉。
- 用
const声明所有不重新赋值的变量(包括对象、数组),强制你思考不可变意图 - 仅在明确需要重新赋值时用
let,避免滥用成“更安全的var” - 注意:对象用
const声明 ≠ 不可变,只是引用不可变;需配合Object.freeze()或结构化 clone 控制深层变更
箭头函数:简洁背后有 this 和 arguments 的硬约束
箭头函数没有自己的 this、arguments、super 或 new.target,它继承外层词法作用域的 this。这在事件回调、定时器、Promise 链中极有用,但绝不能用于需要动态 this 的场景(如 Vue 方法、React 类组件生命周期、jQuery 插件方法)。
- 适合:异步回调(
.then(x => {...}))、数组遍历(arr.map(x => x * 2))、返回函数(x => y => x + y) - 不适合:对象方法定义(
{ fn: () => this.x }中this指向错误)、构造函数、需要arguments的参数处理 - 单参数且只有一条表达式时可省略括号和
return,但别为了省字符牺牲可读性(例如users.filter(u => u.active && u.role === 'admin')已足够清晰)
解构赋值 + 默认值:减少样板代码,但别嵌套过深
解构不只是写法短,它把“从数据结构中提取值”的逻辑显式暴露出来,配合默认值能自然处理 undefined 边界情况。
立即学习“Java免费学习笔记(深入)”;
- 函数参数解构最实用:
function render({ title = 'Untitled', count = 0, tags = [] } = {}) { ... }—— 明确依赖、自动兜底、无需手动||判断 - 嵌套解构要克制:
const { data: { user: { name, avatar } } } = response容易因某层为null报TypeError;优先用可选链response?.data?.user?.name(ES2020)或先校验再解构 - 数组解构可用于交换变量(
[a, b] = [b, a])、忽略中间项([first, , third] = arr)、获取剩余项([head, ...tail] = arr)
模块系统(import/export):必须配合构建工具,原生 type="module" 有路径限制
ES6 模块是静态的、编译时解析的,这意味着 import 必须在顶层,不能条件加载(动态 import() 是另一机制)。现代项目几乎都通过 Webpack/Vite/Rollup 处理模块,但要注意几个关键点:
- 默认导出(
export default)和具名导出(export const x = 1)不能混用在同一个import语句中;正确写法是分开导入或用import * as ns - Node.js 中使用 ES 模块需设置
"type": "module"或用.mjs后缀;否则import会报SyntaxError: Cannot use import statement outside a module - 不要在
node_modules中直接import未打包的 CJS 包(如早期版本的lodash),Vite/Webpack 可能无法正确解析exports字段
真正难的不是记住每个特性怎么写,而是判断某个场景下该用解构还是可选链、该用 const 还是 let、该导出一个对象还是多个具名值——这些选择直接影响代码可读性、调试成本和协作效率。ES6 的价值不在“新”,而在它迫使你更早面对这些设计决策。











