本文为 100offer 发起的知乎 Live「如何学习和实践ES201X?」活动整理分享。分享嘉宾为百姓网 前端工程师 贺师俊 (hax)。
上篇主要包含以下几个方面的内容:
一、为什么 JavaScript 每年都有新标准?
二、为什么会造成在10年的时间里面都没有新的语言的标准?
三、每年的 ECMAScript 201X 标准又是如何制定和发布的?
四、为什么要学习和实践 ES201X?我能不学(用)它们而继续只写 ES5(ES3)吗?
一、为什么JavaScript为什么每年都有新标准?
我们知道的前年有 ES2015,去年有 ES2016,今年六月份发布的 ES2017,明年还会有 ES2018,以此类推。但是 JavaScript 以前并不是这样子的,大家知道 ES2015 其实就是 ES6,之前迭代的版本是 ES1,ES2,ES3,ES5,没有ES4。
其中第一个版本是 1997 年发布的,ES3 是一个重要的版本,是 1999 年发布的,ES5 大概是 2009 年发布的,两个重要的版本 ES3 和 ES5 之间隔了十年,这就导致了很多问题。
编程语言和软件、项目一样,都是需要进化和发展的,而 JavaScript 在长达 10 年的时间没有很好的进化。如果一个语言从一开始就设计的非常好,非常完备,可以说它基本不需要变化了,但是 JS 显然不是这样子的。从著名的「犀牛书」《JavaScript权威指南》和 Douglas Crockford的《 JavaScript 语言精粹》两本宝典的厚度对比中就可以看得出来,JS 语言还是有很多问题的。
二、为什么会造成在 10 年的时间里面都没有新的语言的标准?
浏览器的发展对于语言是一种拖累
我们经常说的浏览器的发展对于语言的发展是一种拖累,因为大家知道如果浏览器不升级,在写代码的时候要考虑到浏览器的兼容性,也就没有办法使用最新的特性。这个问题也反映在 ES5 上面,前面讲过 ES5 是在 2009 年发布的,但是到 2011 年大多数的 WEB 开发者还是在用 ES3 在写程序,并没有用到 ES5 的新特性。据我所知司徒正美(钟钦成,著名的 JavaScript 专家,去哪儿网前端架构师,曾出版《JavaScript 框架设计》一书)也参加了我的这次 Live。他做了很多的框架,比方说 Avalon,最近又复刻了 React 的一个框架,它们有很多特点,包括支持 IE6 等老旧浏览器,大家有兴趣的可以去尝试一下。
现在大部分的框架已经不支持 IE6,IE8 了,基本从 IE9 开始,更有甚者直接从 IE10 和 IE11 开始。但是往前推 5-6 年还不是这个样子的。所以这个一方面就影响了 JavaScript 语言的进化。
语言委员会中的政治斗争问题
在语言委员会中可能有些政治斗争的问题,ES4 的死亡有些是因为技术原因,还有些是技术以外的原因,在这块就不过多涉及了。
因为上述原因,所以每个大版本之间隔得时间会比较长,而且 ES6(ES2015)加了非常多的新特性,例如 Class、iterator、generator、Modules 等这些都是新语言级别的特性,所以需要很长的时间来讨论和研发。
在 ES6(ES2015)之后,语言委员会也总结了,认为以后再推进语言的发展,最好不要像 ES6(ES2015)那样,一次性加入那么多的特性,这样做会有很大的困难,需要考虑兼容,JS 是用在 WEB 上的,所以对兼容性的要求就更高。因此委员会决定从 ES6(ES2015)之后,改进之前的推进标准的方法,以前的方法是:
大家一起讨论要加入一些什么特性,全部讨论完之后,一次性加入进去;以后不会再这么做了,而是单个特性一个一个去加,每个特性单独提案,再根据每个特性自己的发展是不是成熟,浏览器的实现是不是跟进了,再来决定这个特性是不是能够加入到下一年的标准里。
基于这样的改变,我们现在的标准就变成了 ES2015,2016,2017,以年份来命名的版本号。当然 ES7,ES8,ES9 也可以继续用这个称呼,因为数字 6、7、8、9 实际上是标准的版本号,这个标准实际上叫 ECMAScript,也就是 ECMA 标准化组织所制定的标准,每个标准上面都有一个 edition,也就是说这个标准可以不断的有新的版本,一个完整的 ES6 称呼应该是 ECMAScript edition 6,你可以用数字编号,但是用年份会更加清楚。
三、每年的 ECMAScript 201X 标准又是如何制定和发布的?
现在每一年的标准是在 ES6(ES2015)的基础上的更新,比方说 ES2017 就是对 ES2016 的更新,ES2016 就是对 ES2015 的更新,它的更新把当年已经完全成熟并且决定可以进入标准的新的特性提案合并提交到标准文本里面,到下一年发布出来。
现在是在每年的六、七月份发布正式标准,实际上到底哪些特性可以进入下一年的标准很早就确定了,基本在当年的一月份就已经确定了,如果说一个提案到一月份都没确定进入标准,就不可能进入到当年的标准,需要放到下一年的标准里面。
四、为什么要学习和实践 ES201X?我能不学(用)它们而继续只写 ES5(ES3)吗?
首先 JavaScript 不会去破坏以前代码的兼容性,以前代码跑的结果基本上是不会变的,除非是在非常个别的地方,而且这个地方不仅经过委员会讨论,数据也表明整个互联网都没有人会写出这样的代码,这样我们就要改,否则就一定不会改。例如 typeof(null) 返回的是 object,大家也会觉得比较奇怪,针对这点之前也讨论过是否要修改,但是最后还是没有改,保持了原样。
所以说继续写 ES5 和 ES3 也是可以的,代码是可以跑起来。但是新的版本肯定是有它的好处,毕竟是那些优秀的人聚集在一起,克服各种困难研究出来的,肯定是有些值得学习的地方。我可以举两个例子大家看一下:
1.ES6(ES2015)加了 Module,Module 这特性为什么要加,能不能不加?
当然 Module 可以不加也可以用,有各种各样的方案,比如 CommonJS 方式可以达到类似的效果。其实这种方式有些问题,因为它不是标准的,有些人会想我也搞一套更好的行不行。虽然现在 CommonJS用的很多,但是在 Browser 中是无法直接用 CommonJS 的,肯定是它的某种变形,比较常见的是 AMD。所以我们需要一个更加统一的格式,像 Module 如果没有一个统一的标准,就没有办法成立了,它是一个重要的代码复用单元,如果不统一,各用各的,就无法进行下去了。而且 ES6 增加的 Module 是一个静态的,可以进行静态分析和更好的性能优化,webpack、rollup 还可以对打包进行简化,这些都是 CommonJS 不能做的,Module 还有很多的好处,具体大家可以看我的 Blog 上的相关文章,我记得之前有翻译过一篇相关的文章。
现在有些社区中非常有名的人,对加入 Class 持保留态度,有各种意见很正常,但是我想说的是,Class现在有很多人在用,又没有标准方式,虽然都大家都是基于原型的,但是还是会有些细微的差别,有时候一点差别比很大的差别更糟糕,因为当有BUG的时候反而更不容易被发现,既然有很多人有这样的需求,还不如把它标准化。
2. 我们再举一个还没有进入标准的例子
可能就是明年的 ES2018 的,是与 Module 相关的,叫 dynamic import,dynamic import 就是你可以在代码里直接写入 import,它类似于函数,你传入 Module 名字,它返回 promise,promise 的值是 Module 对象,你就可以使用 Module 导出的函数。为什么它会被加入到标准里面呢?因为它是非常有用的,前面我们讲过 ES6 加入 Module 是静态的,它在程序运行之前已经存在了,所以它没有办法实现按需加载这样的需求,所以这样的内容需要被加入到标准里面。
所以对于学不学习新东西,单纯的从完成某些需求上来说,可以不用,因为老的方法也可以做出来,但是它可能会存在一些缺陷或者问题,新的东西肯定有它的优势,比如可能会提供更好的编程体验,或者与其他东西相关提供更好的性能等等诸如此类的原因,当然可能还有一个更实际的原因,就是新的技术如果不学,可能会被淘汰。
一些公司招人的时候,肯定会问一些新的东西会不会,如果说不会,这肯定是个问题,当然说学这个不仅仅是为了求职,肯定是考虑去完成工作,去实现一些东西,利用这些新特性把它做得更好。这个东西其实是两面的,为什么说求职市场为什么要求你会这个,是因为是互为因果的关系。之后可能会有人会反过来这样提,我能不能只学新的,只学 ES2016、ES6 及以后的,不学 ES5、ES3 的某些东西,我觉得这肯定是可以的,你已经用了 let,const,你就回去不会搞那些 var 以及 var 那些奇奇怪怪的地方,如果你已经用了新的东西,当然可以不用去管那些比如说 with,因为 with 在 script 模式下 Module 里根本不能用,所以说学了没太大意义。
反过来说,ES3,ES5 一些老的边缘性东西可以不用去看,不用去学,但是这是对于初级、中级程序员来讲,高级程序员的话,可能还是要被迫去学一下,因为可能你需要维护老的代码,可能一些老的底层机制你还是要去研究一下,比如说你虽然已经不用去写class了,但是class底下还是有原型的,所以原型的机制还是要学习一下的,但是一般在用的时候,你完全不用底层原型也是可以的,比如说用 typescript,只要你一直用新的东西,你就不会触碰到原型,反而在某一些特定的场合,你需要用到的时候再去学习一下,再去深挖历史。
---
本周的指南栏目就到此位置了,关于如何学习这些新标准、如何在实践中学习这些新特性,将在下周的指南栏目中接着放送。
如果你实在是等不及,也可以去听听这篇分享的知乎 LIVE(点击原文即可到达传送门)。
领取专属 10元无门槛券
私享最新 技术干货