本文为 100offer 发起的知乎 Live「如何学习和实践ES201X?」活动整理分享。分享嘉宾为百姓网 前端工程师 贺师俊 (hax)。

下篇主要包含以下几个方面的内容:

五、如何学习每年的新标准?

六、如何在实践中采用新特性?

七、Stage0-4 是什么意思?

八、Typescript 和 JavaScript 以及 Babel 和 Typescript 的区别和联系

九、ES201X 在面试时,如何考察?

PS:上篇主要包含以下几个方面的内容:

一、为什么 JavaScript 每年都有新标准?

二、为什么会造成在10年的时间里面都没有新的语言的标准?

三、每年的 ECMAScript 201X 标准又是如何制定和发布的?

四、为什么要学习和实践 ES201X?我能不学(用)它们而继续只写 ES5(ES3)吗?

五、如何学习每年的新标准?

关于这个方面,我推荐大家去订阅一些博客或者一些比较好的网站,里面会有一些专栏,经常性会有一些有关于新特性的文章。

对于如何学习新标准,这里推荐两种方法,一种是等待新标准发布,然后通过相关文章来了解,如果对具体的新特性比较关注,想实时了解, 也可以访问:https://github.com/tc39/proposals。tc39 就是 ECMAScript 制定标准的组织,这个仓库内部有比较完整的 ECMAScript 标准的文章,大家可以去查看。这个仓库的 Proposal 里面列了已经进入 tc39 流程的提案。 大家也可以去查看。

所以当我们去查看仓库时,打开网页的 readme,里面列举了许多 active proposal,也就是它的 stage 是 1 到 3,也就是在积极讨论中的提案,它上面还有一些链接,可以链接到 stage0 的 proposal 和 finish proposal,像 finish proposals里面是列举了已经讨论完成的 proposal,也就是要么已经进入今年新标准的要么是已经讨论完成,但是没赶得及进入今年新标准的,会进入下一年新标准的提案。

比如我们打开 finish proposal,我们就可以看到 ES2016,ES2017 里面加的新的特性,其实都比较简单,在 ES2016 里面主要加了两个特性,一个是在数组上加了 includes 方法,比如原来怎么判断一个对象是否在数组里,是用 indexof 判断是否等于-1,写起来比较麻烦,现在用 includes 方法直接用来解决这个问题。

那为什么这个方法不叫 contains 呢?

其实这是个兼容性问题,在其他语言中都叫做contains,只是因为和 mootools 有关,因为代码里的 bug,如果叫 contains,则就不工作了,所以改名叫 includes。

还有就是乘方的运算符,两个乘号连在一起就表示乘方,这个其实也比较简单,ES2016主要就是加了这两个特性。

ES2017也就是2017年发布的这个版本加的东西就比较多,比如像 values、entrance 这些新的 API,values、entrance 也比较容易理解,如果你已经用了ES5,比如像 object.keys 这个方法,其实你大概就知道values、entrance是干什么的了,然后还有像padding,其实是加了 padStart 和 padEnd 方法,也就是在字符串前面或者后面补一串特殊字符。

还有就是函数参数,在调用的时候可以多加一个逗号,这个很简单,看一眼就能明白,这和数组或者对象每一个条目的最后面可以有一个多余的逗号,这主要是为了写代码方便,防止出错。

回过头我们再看一下还在讨论中的提案,其实很多浏览器都已经加上实现了,比如在proposal仓库首页的readme的第三个,Rest/Spread Properties,这是个对象,对象的构造可以直接用三个点去表示,这和数组有点像,这大家有兴趣可以自己去看一下。这里的 proposal 都可以点进去,里面的 reason 都有 example 实例代码,如果你不是深究到特性的一些边边角角,看 example 的实例代码就差不多可以了。

这里面当然也有我前面提到的 dynamic import 以及符号的一些写法,可以用于动态的导入和按需加载的一些特性。大家看一眼可以知道,里面 stage3 草案里面有很多都跟正则表达式相关,这些很有可能会进入明年的标准里面,因为已经进入到 stage3 之中了,那有没有必要学呢,如果你现在的工作没有怎么用到,那就没必要,如果你的工作很多地方都用到正则表达式,那就去看一下。

六、如何在实践中采用新特性?

这里就要说到 Babel 了,它是一个转译器,它可以把新特性通过编译和转译,使其可以在没有新特性的老的浏览器上跑起来,但并不是所有的新特性都可以转译,不过大多数都是可以的。

简单说一下,大家都知道 Babel 有 preset,因为有 preset,所以实际上用起来就比较简单。

比如说你用了 ES2016 的 preset,那么它可以把 ES2016 通过编译解决的一些特性可以编译成在 ES2015 上跑,以此类推,比如说你用了 ES2017 的 preset,那么它可以编译成在 ES2016 上跑,如果你两个都用,那么可以 ES2016、ES2017 编译成在 ES2015 上可以跑。

如果你比较细致化,你可以一个一个去开启,因为 preset 是由若干个 bubble plugin 组成,而每个 bubble plugin 对应一个或多个特性,所以你也单独使用某个 bubble plugin 去做特性转化。紫云飞的 Blog 中有很多 ES6 的文章,大家可以去学习。

七、stage0-4 是什么意思?

stage0-4 表示每一个草案都有一个阶段,标明草案的成熟度:

stage0 表示的是一个想法,比如说可以弄这样一个特性,写出来代码是什么,提交给委员会,并且委员会也觉得这个想法可以进入下一步;

stage1 表示委员会已经开会讨论过,觉得这个方向或想法可以进行下去,并且会指派一个负责人来跟进;

stage2 表示委员会对负责人的设计的语法和语义开始进行讨论;

stage3 就开始涉及到实现,等到四大主要的浏览器实现的差不多了,开始进入下一步;

一般来说 stage4 的提案,就可以进入标准了,这个新特性(提案)在一些浏览器 stable 版本上就可以使用了。

stage0 和 stage2 的特性也不是完全不能用,只是会存在一些风险,比如说语义或者语法会被修改,最糟糕的就是提案有可能会被撤销。

语法修改问题不大,因为可以自己写一个 Babel 插件,进行语法转换;语义修改会比较麻烦,具体的只能 case by case 的去看;被撤销的提案也有,但是非常非常少,大家平常应该遇不到。

在工作中,如果你认为某些特性可能有问题或者有缺陷,可以在 GitHub 或者 ESDiscuss 邮件列表上面进行讨论,当然在提出疑问的之前,最好确认一下自己是不是已经很好的理解了这个特性。至于我们怎么样参与到标准的制定,方法有很多,比如可以通过 ESDiscuss 邮件列表、proposals、业界大牛的 Blog 来发表自己的观点、提交新特性的小测试,翻译新特性等等方式来参与标准的制定,当然也可以尝试自己提一个提案,提供自己的想法。

八、Typescript 和 JavaScript 以及 Babel 和 Typescript 的区别和联系

Typescript 简单点来说就是 JavaScript+ 静态类型,在设计上确保对 JavaScript 兼容,称为 JavaScript 超级,如果想要更深入的了解 Typescript 可以访问:https://www.zhihu.com/question/64563945。

其实 Babel 和 Typescript 的关系是有一些互补的地方,Typescript 所关注的是怎么把静态类型加入到 JavaScript 语言中去,Babel 关注的是转化的问题,就是怎么把代码从一种形式转化到另一种形式,那么它就可以用来做很多事情,比如说可以用来做编译,比如说可以写一些插件等,Typescript 也可以做编译,但目前为止这不是 Typescript 的核心东西,两则在架构上也有区别,Babel 是插件化的,Typescript 则没有很好的插件化。

九、ES201X 在面试时,如何考察?

首先面试官一般不会特意考察新特性,除非一些非常重要的特性可能会问到

当然如果新特性能够非常好的回答上来,肯定是加分项。

大部分面试官主要还是看你对新技术有没有追求,有没有求知欲。当然也是分人的,如果一个人对业务这块比较强,能够创造足够的价值,对他的新特性要求就没有那么高,只要有计划的去获取新知识就可以。

如果是要求比较有冲劲的岗位,对新特性的要求会高一些,当然任何情况下多了解一些新特性肯定是好的。对于新人来讲,知道一些新特性对面试肯定是有帮助的,面试的思路就是没有成就,就讲经历,没有经历就讲心得,学习心得在这个时候完全可以展示出来。

作为面试官一般不太会问纯粹知识性的问题,比如 API 的名字是什么,参数是什么,返回是什么,这样的问题最多知道他有没有学过。面试官想要知道的是他对新特性有没有全面的了解,比如说异步,主要考察对异步的理解,不需要指定特定的新特性,而是看他如何来完成这个需求的。

如何区别众多面试者呢?

首先可以看他的代码,如果他涉及的比较多,可以更加详细的细问一下。

二来可以把题目中加入一些额外的东西,比如异步处理中的异常处理,一下就可以看出区分度,实践过很多的人,对错误处理的经验也会比较丰富。

再往下就需要case by case继续深挖了。

对于面试者,如果面试官问的你都知道那是最好的,如果不知道,你可以告诉面试官你知道一些什么,虽然有些具体的不是很清楚,很确定,但是你可以告诉面试官你通过一些渠道了解过。如果想要更加详细的了解面试这块,可以再去找一些相关资源深入了解一下,100offer 以前的Live也会涉及到这块,大家可以多去看一下。

最后大家要知道面试官不是想要刁难你,而是想要找到你的闪光点,而你要做的就是如何让面试官发现你的闪光点。

以上,就是关于学习 ES201X 的分享。欢迎大家持续关注我们的指南栏目,会有更多干货奉上。

---

更多「指南」文章:

程序员喜提「豪宅」指南

不得不说的谈薪技巧

相关文章