# 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)
webapp
公众号
开发者导航
切换夜间模式
点击侧边栏上一篇
点击侧边栏下一篇
折叠侧边栏
收起全部