# 1 ES5、ES6和ES2015有什么区别?
⚡ 30 秒速记
ES6就是ES2015,同一版标准的两个叫法 ——ES6是制定期间的代号,发布后改用年份命名- 日常语境里
ES6常被泛指"2015 年之后的现代JS",包含async/await(ES2017)、可选链(ES2020)等 ES5是 2009 年的上一代标准,两者相隔六年- 改成年度发布制是因为
ES6憋了六年、一次性发布导致规模过大、浏览器实现缓慢 - 工程上真正决定"能用什么"的不是标准版本,而是
browserslist基线 +Babel转译 +core-jspolyfill
严格来说,ES6 就是 ES2015,而 ES5 是 2009 年发布的上一代标准。 ES6 是第六版标准在制定期间的叫法,2015 年正式发布后改用年份命名;因为这一版积累了六年、规模较大,之后转成年度发布。日常说“ES6 代码”时,常常泛指 ES2015 之后的现代 JavaScript,甚至包含 async/await 和可选链。工程里真正决定能否使用某项能力的,是 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) |