# 1 ES5、ES6和ES2015有什么区别?

⚡ 30 秒速记

  • ES6 就是 ES2015,同一版标准的两个叫法 —— ES6 是制定期间的代号,发布后改用年份命名
  • 日常语境里 ES6 常被泛指"2015 年之后的现代 JS",包含 async/await(ES2017)、可选链(ES2020)等
  • ES5 是 2009 年的上一代标准,两者相隔六年
  • 改成年度发布制是因为 ES6 憋了六年、一次性发布导致规模过大、浏览器实现缓慢
  • 工程上真正决定"能用什么"的不是标准版本,而是 browserslist 基线 + Babel 转译 + core-js polyfill

严格来说,ES6 就是 ES2015,而 ES5 是 2009 年发布的上一代标准。 ES6 是第六版标准在制定期间的叫法,2015 年正式发布后改用年份命名;因为这一版积累了六年、规模较大,之后转成年度发布。日常说“ES6 代码”时,常常泛指 ES2015 之后的现代 JavaScript,甚至包含 async/await 和可选链。工程里真正决定能否使用某项能力的,是 browserslistBabelcore-js 配置,而不是口头上的版本名。

先分清这三个词指的是什么:

  • ES5 —— 2009 年发布的语言标准,是 ES6 之前用了六年的版本。
  • ES2015 —— 2015 年 6 月发布的那一版标准,正式名称就叫 ECMAScript 2015
  • ES6 —— ES2015 在制定期间的代号。因为它是第 6 版,社区叫惯了 ES6,发布后名字改成按年份命名,但口语里 ES6 一直沿用下来。

所以严格说:ES6 = ES2015,是同一版标准的两个叫法。

但日常语境里 ES6 经常被泛化使用,指"ES2015 及之后的所有现代 JS"—— 比如有人说"这段代码用了 ES6",里面可能有 ES2017async/awaitES2020 的可选链。这种用法不精确但很常见,面试时能点破这一点是加分项。

为什么 2015 年之后改成按年份命名?

ES6 制定了整整六年(ES5 是 2009 年),中间积压了大量特性一次性发布,导致规模庞大、浏览器实现缓慢。TC39 因此改成了年度发布制:每年 6 月发布一版,成熟一个特性就纳入一个,避免再出现"一版憋六年"的情况。

后续版本的代表特性:

版本 代表特性
ES2015 let/const、箭头函数、class、模板字符串、解构、PromiseModuleMap/SetSymbol
ES2016 includes、指数运算符 **
ES2017 async/awaitObject.entriespadStart
ES2018 对象展开、Promise.finally、异步迭代
ES2019 flatObject.fromEntries、可选 catch 绑定
ES2020 可选链 ?.、空值合并 ??BigInt、动态 import
ES2021 replaceAll、逻辑赋值 ??=WeakRef
ES2022 类私有字段 #at()、顶层 await
ES2023+ findLast、数组的不可变方法(toSorted/toReversed
webapp
公众号
开发者导航
切换夜间模式
点击侧边栏上一篇
点击侧边栏下一篇
折叠侧边栏
收起全部