# 1 ES5、ES6和ES2015有什么区别?
⚡ 30 秒速记
ES6=ES2015,同一版标准两个叫法:ES6是制定时的版本号,发布后改用年份命名ES5是2009年的,中间隔了6年,攒得太大、实现太慢,之后TC39改成每年6月发一版- 口语里的
ES6常泛指2015年后的现代JS:async/await是ES2017,?.是ES2020 - 提案走到
Stage 4才算进标准;进了标准也不等于浏览器都支持 - 工程上能用什么看
browserslist基线:语法交给Babel转,新API靠core-js补
严格讲 ES6 就是 ES2015,是同一版标准;ES5 是 2009 年的上一版。 ES6 是第六版在制定期间的叫法,因为攒了六年、特性太多,浏览器实现得很慢,所以发布时改用年份命名,之后每年出一版。日常说「ES6 语法」其实经常是泛指,里面可能有 ES2017 的 async/await、ES2020 的可选链。真到项目里,能不能用某个特性不看它是 ES 几,看你的 browserslist 基线和 Babel、core-js 配没配好。
先分清这三个词指的是什么:
ES5—— 2009 年发布的语言标准,是ES6之前用了六年的版本。ES2015—— 2015 年 6 月发布的那一版标准,正式名称就叫ECMAScript 2015。ES6——ES2015在制定期间的代号。因为它是第 6 版,社区叫惯了ES6,发布后名字改成按年份命名,但口语里ES6一直沿用下来。
所以严格说:ES6 = ES2015,是同一版标准的两个叫法。
但日常语境里 ES6 经常被泛化使用,指"ES2015 及之后的所有现代 JS"—— 比如有人说"这段代码用了 ES6",里面可能有 ES2017 的 async/await 或 ES2020 的可选链。这种用法不精确但很常见,面试时能点破这一点是加分项。
为什么 2015 年之后改成按年份命名?
ES6 制定了整整六年(ES5 是 2009 年),中间积压了大量特性一次性发布,导致规模庞大、浏览器实现缓慢。TC39 因此改成了年度发布制:每年 6 月发布一版,成熟一个特性就纳入一个,避免再出现"一版憋六年"的情况。
后续版本的代表特性:
| 版本 | 代表特性 |
|---|---|
ES2015 |
let/const、箭头函数、class、模板字符串、解构、Promise、Module、Map/Set、Symbol |
ES2016 |
includes、指数运算符 ** |
ES2017 |
async/await、Object.entries、padStart |
ES2018 |
对象展开、Promise.finally、异步迭代 |
ES2019 |
flat、Object.fromEntries、可选 catch 绑定 |
ES2020 |
可选链 ?.、空值合并 ??、BigInt、动态 import |
ES2021 |
replaceAll、逻辑赋值 ??=、WeakRef |
ES2022 |
类私有字段 #、at()、顶层 await |
ES2023+ |
findLast、数组的不可变方法(toSorted/toReversed) |