JavaScript(简称:JS)是一种动态类型、弱类型的直译式脚本语言。也就是说它的数据类型不需要声明,不同类型之间会隐式转换为被赋值的类型。它不需要编译,直接由浏览器解释执行。JavaScript由ECMAScript(简称:ES)、DOM、BOM三大部分组成:ECMAScript规定了语言的语法和基本对象;DOM(文本对象模型)处理网页的节点内容;BOM(浏览器对象模型)与浏览器进行交互。
早期Nombas公司设计了一种简单的嵌入式脚本语言ScriptEase,有人将这个东西与后来的JavaScript、JScript称为三足鼎立,我不大认同。当时网景(Netscape)为给网页加点特技,避免用户的某些失误操作只有在服务器响应后才知道,它与ScriptEase无论从哪个方面都构不成对立。还有人认为ScriptEase是JavaScript的基础,如果非要牵强的理解,大概源于它的设计理念:保持与某些语言的相似性,以便开发人员很快学会(ps:据说这是个谣言)。
为了解决当时的交互问题,网景雇佣Brendan Eich开发了这种脚本语言,这哥们儿就用了10天。最初叫Mocha,后又改名LiveScript,再后来与Sun公司达成协议,蹭一下正火的Java的WIFI,更名JavaScript。它和Java没有太大关系,除了语法有点像之外,毕竟有点模仿的影子在。WIFI蹭的好,一下子火了,IE又在其基础上搞了个JScript。这样搞下去就不好玩了,于是网景大佬将JavaScript提交给了Ecma国际组织,希望以此将JavaScript作为国际标准掌握话语权。最终Ecma召集了许多大佬来参与这个标准讨论,随后便有了这个标准——ECMAScript。
ECMAScript相当于是建立在JavaScript基础之上,为什么反而成为自己的标准呢?接下来是我个人的观点,不喜勿喷。首先,ECMAScript抛弃了一些JavaScript不兼容的东西,毕竟最初设计是为了自己服务,成了标准提取都有用的部分。其次,各家大佬纷纷提出自己的一些观点,原本JavaScript又会有一些增删。最后,大家都提JavaScript,而不直接提ECMAScript,这就意味着JavaScript才是这个标准的符号。那为什么不以JavaScript为名作为标准?因为它是网景的商标,而且它其实还是有差异的。JavaScript总体上以ECMAScript为标准,却不保证与标准版本兼容,在浏览器最终部署上还将会有一些不属于标准的浏览器特性。
换句话说,ECMAScript只是语法上的统一,JavaScript才是真正的统一。不管浏览器搞什么幺蛾子,反正你叫JavaScript,不会再叫JScript。某一天哪家浏览器内核一家独大,那么ECMAScript没有通过的标准,它也是标准!比如当下的手机市场,两大主流系统:苹果的IOS和谷歌的安卓。它们的浏览器内核都是webkit,并不能单纯地说它在前端的兼容性就统一了,两码事。每个手机部署的浏览器版本不同,软件与系统的兼容不同,都会带来表现形式的问题。只能说,相对IE时代,没有那么多的特性要去处理,问题会相对少很多。
1997年ECMAScript 1.0发布,到1999年ECMAScript 3.0发布并被浏览器广泛地支持,成为JavaScript的通行标准。2007年ECMAScript 4.0草案发布,要求对3.0进行大幅升级,提出了不少在当时很超前的概念,保守势力和开放势力一直相持不下。到2008年,决定废除4.0的开发,只做一小部分改善成为了ECMAScript 5.0。2011年ECMAScript 5.1成为国际标准,此后ECMAScript相当于没有发展。直到ECMAScript 2015诞生,也就是俗称的ECMAScript 6.0,并宣布一年发布一个版本,以“ECMAScript 年份”命名。
ECMAScript 3.0之后其实都没有什么太大的发展,尽管存在诸多缺陷,但依旧能满足开发需要。随着时代的进步,旧的版本在思想上开始显得落后。市场上出现了许多更为先进的思想,比如为了模块化而出现的CommonJS规范、AMD规范、CMD规范等等。没准儿就被超越被干掉,如果有更为便捷的脚本编写方式,比如CoffeScript、TypeScript等等,虽说它的最终会被编译为JS文件。有时候淘汰并不一定是被弃用,而是即便存在也不被关注。ECMAScript 6.0给人的感觉就是出现得很被动,还算幸运的是有babel这样的辅助工具存在,可以将新标准编译为通用版本。否则,ECMAScript标准升级与否,或许还真不被人关心。
ES6也并没有让下面的编程玩家失望,新的特性完善了旧版本的同时也加入了更为便捷的特性。举个例子来说。ES5声明变量var,这个关键字是有变量提升的现象的,没有块作用域。let关键字改变了这一现状,写循环的时候不用再害怕始终是一个值。ES5完全没有继承这个概念只得依靠原型链,新标准提供新的关键字class使得代码更简洁也思路更清晰。加上解构赋值、缺省值、Promise、Generator等等语法的出现使得JavaScript编程变得更加有趣,这比TypeScript之流似乎更显得有智慧。
这里花了很大篇幅来介绍JavaScript的发展,它或许于编程本身带来不了什么,但在学一门语言的时候顺便去了解一下它的历史或许会得到比知识更为有趣的东西。记得我之前学ES6,看的是阮一峰老师的《ECMAScript 6入门》。刚进门阮老师就说那是中级难度问我是不是新手进不进新手村,我想自己算不上菜鸟去巩固一下基础也还行,于是走进了新手村——《JavaScript语言入门教程》。里面详细讲述了JavaScript的诞生历程,更为重要的是提到了JavaScript的周边应用发展,就如醍醐灌顶一般。我最大的感触就是我还在编程路上玩泥巴的时候单页应用已经诞生了——2012年大前端的技术雏形已经诞生了。这还不算完,很多语言都在做一些相互转换的工作,企图通过一套语言程序来达到多平台部署。很明显,这种思想已经转换成了生产力。
感谢阮一峰老师!他的书真心觉得不错,他在讲解ES6的时候会讲ES5怎么做,这样对比着来我觉得很有收获。刚入门的朋友可以去看下,这也是我不写教程的原因,有这些大神在我就是个玩泥巴的!