yinguangyao / blog

关于 JavaScript 前端开发、工作经验的一点点总结。

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

JavaScript 的前世今生

yinguangyao opened this issue · comments

commented

本文是改善 JavaScript 系列专栏的第一篇,主要介绍了 JavaScript 的由来、ECMAScript 的历史版本、新的语法从提案到被加入到 ECMAScript 标准中需要经历的步骤。读完本文,相信可以提高你对 JavaScript 的认识。

JavaScript的由来

在 JavaScript 诞生之前,必须要将表单数据发送到服务端才能实现一些验证的操作。在那个网速只有10kb左右的年代,这样的操作实在是太耗时了,如果可以将这些数据在发送到服务端前就进行检验,无疑大大提高了用户的体验。

为了增强 Navigator 浏览器的交互性,Netscape 公司决定开发一种可以嵌入网页的脚本语言,用来控制浏览器的一些行为。

1995年,就职于 Netscape 公司的 Brendan Eich 着手开发这门脚本语言,他借鉴了C语言的基本语法、Java语言的数据结构、Scheme的函数、Self语言基于原型的继承机制等等,仅仅用了10天,就设计完成了这种语言的第一版。由于设计比较匆忙,也导致了 JavaScript 语言本身存在各种各样的问题。

Netscape 公司的这种浏览器脚本语言最初名字叫做 Mocha,1995年9月改为 LiveScript。为了蹭 Java 的热度,在 Netscape Navigator2 正式发布的前夕,Netscape 公司与 Sun 公司达成协议,临时将 LiveScript 改名为 JavaScript,于是 JavaScript 正式诞生了。

当然,非要说 JavaScript 和 Java 有什么关系,那就是雷锋和雷峰塔的关系了。

JavaScript和ECMAScript

随着 JavaScript v1.0 的大放异彩,1996年8月,微软模仿JavaScript在IE3.0中内置了一种名为 JScript 的语言。由于没有任何标准和规定的存在,JavaScript出现了多个不同版本,这也导致了JavaScript标准化的问题被提上了日程。

1996年11月,Netscape 公司决定将 JavaScript 提交给国际标准化组织 ECMA(European Computer Manufacturers Association,欧洲计算机制造商协会)。ECMA 的39号技术委员会(TC39,Technical Committee 39)负责制定和审核这个标准,TC39 由业内各大公司派出的工程师组成。

经过数月的努力发布了262号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为 ECMAScript。

因此,ECMAScript 只是一个语言标准,JavaScript 是其一种实现。准确来说,JavaScript 是由 ECMAScript、DOM(文档对象模型)和BOM(浏览器对象模型)三部分组成。

ECMAScript历史版本

image_1dm5k4cfm214171unqe1e7e193r9.png-54.2kB

1997年,ECMAScript 1.0发布。

1998年,ECMAScript 2.0版发布。

1999年,ECMAScript 3.0版发布,成为 JavaScript 的通行标准,得到了广泛支持。

2007年10月,ECMAScript 4.0版草案发布,对3.0版做了大幅升级,但由于4.0版的目标过于激进,导致了各浏览器厂商发生了严重分歧,ECMA最终决定中止该版本的发布,但其中部分功能成为了ES5的Harmony基础。

2008年7月,ECMA决定将ECMAScript 4.0中的一小部分发布为 ECMAScript 3.1,而将其他激进的设想扩大范围,放入以后的版本,该版本的项目代号起名为 Harmony(和谐)。不久之后,ECMAScript 3.1 就改名为 ECMAScript 5。

2009年12月,ECMAScript 5.0版 正式发布。Harmony 项目则一分为二,一些较为可行的设想定名为
JavaScript.next 继续开发,后来演变成 ECMAScript 6;一些不是很成熟的设想,则被视为
JavaScript.next.next,在更远的将来再考虑推出。TC39 的总体考虑是,ECMAScript 5 与 ECMAScript
3基本保持兼容,较大的语法修正和新功能加入,将由 JavaScript.next 完成。当时,JavaScript.next
指的是ECMAScript 6。第六版发布以后,将指 ECMAScript 7。TC39 预计,ECMAScript 5会在2013年的年中成为 JavaScript 开发的主流标准,并在此后五年中一直保持这个位置。

2011年6月,ECMAScript 5.1版发布,并且成为 ISO 国际标准(ISO/IEC
16262:2011)。

2013年3月,ECMAScript 6草案冻结,不再添加新功能。新的功能设想将被放到 ECMAScript 7。

2013年12月,ECMAScript 6草案发布。然后是12个月的讨论期,听取各方反馈。

2015年6月17日发布的 ECMAScript 2015(ES6)是一个具有里程碑意义的语言标准。在该标准中,不仅引入了诸如类、模块、Promise、Map 等众多新的语言特性,还制定了更加规范化和快速的标准制定发布流程。
虽然浏览器还未全部实现对 ES6 标准的支持,但通过 Babel 等转译器,人们已经可以使用全部 ES6 特性。

2016年3月,ECMAScript 7发布。该版本变动幅度非常小只新增了Array.prototype.includes、幂运算(Exponentiation Operator)两项。根据ECMAScript 2015制定的版本发布规范,只有进入当年初的 Stage 4提议阶段才会被写入当年的语言规范,所以 ECMAScript 2016及其后的版变动幅度应该都不会太大。

2017年6月,ECMAScript 8由 TC39 委员会正式发布。该版本新增了async/await关键字来更好的处理异步操作,也引入了一个新的低级别Atomics命名空间对象和一个SharedArrayBuffer构造函数,来作为更高级别并发抽象的原始构建块。这使开发人员能够共享多个service worker和核心线程之间的SharedArrayBuffer对象的数据。

2018年6月,ECMAScript 9正式发布。该版本主要新增了异步迭代器(原生支持在 JavaScript 中对异步获取的数据做迭代)、Object Rest/Spread PropertiesPromise.prototype.finally等等。

对 ECMAScript 规范感兴趣的同学可以看一下官方文档的 PDF:Ecma-262.pdf

ECMAScript标准的制定过程

TC39 由包括浏览器厂商在内的各方组成,他们开会推动 JavaScript 提案沿着一条严格的发展道路前进:

  1. Stage 0: strawman(初稿阶段) —— 最初想法的提交,任何在 TC39 注册过的或 TC39 成员都可以提交,提交网址如下:Stage 0 Proposals

  2. Stage 1: proposal(提案阶段)—— 由TC39至少一名成员作为 Champion 并审阅通过的初步编写标准,需要有实现的 Demo 或者 Polyfill,提案文件需要包括问题描述、解决方案示例、语法语义API、关键的算法及抽象、实现在的复杂度等。

  3. Stage 2: draft(草案阶段)—— 功能规范的初始版本,该版本需要包含功能规范的两个实验实现和更规范化语法特性和语意的说明。

  4. Stage 3: candidate(候选阶段)—— 该阶段的提议已接近完成,只需要得到提议实现方的反馈。该阶段需要编写测试用例、TC39审稿人审核通过以及开发者的足够认可。

  5. Stage 4: finished(完成阶段)—— 该阶段的提案确定会被加入 ECMAScript,并且需要 Test 262验收测试通过、两个符合规范的实现通过、TC39审核通过、开发者的支持和认可。

总结

在 JavaScript 发展的历史长河中,ES6就是这变化过程中的一大步,当然这肯定不是终点,JS语法肯定会越来越完善,更多的API也会被加入到标准中。考虑到标准每年都会更新,因此学会如何和最新标准保持一致也非常重要。

比如,最近一直处于风口浪尖的class私有属性的提案,现在已经到了 stage3 阶段,但受到了很多开发者的口诛笔伐。具体可以看一下hax组织的研讨会:JavaScript的『class fields』提案中文讨论

ES是一个持续更新的标准,学习新标准最好的方法是浏览TC39的建议库,尤其是需要注意处于stage3阶段的提议,很可能就是之后的标准。