JavaScript ,常常被称之为 Web 语言。这么称呼不是没有原因的,因为最早 JavaScript 就是被用来制作网页特效和表单验证的。可以这么说 ,JavaScript 从一开始就是为我们 Web 所服务的。
同时,JavaScript 有着学习简单,上手容易的特点。比起其他像 Java,C# 这种传统的编程语言,JavaScript 可算是相当容易学习的。甚至不需要搭载什么复杂的运行环境,只需要安装一个浏览器,再用一个记事本就可以开始写 JavaScript 代码了。
但是,JavaScript 往往又是一门棘手的语言。要想清楚 JavaScript 为什么是一门棘手的语言,我们不得不先从它的发展史讲起。
JavaScript 发展史
第一阶段:JavaScript 起源
JavaScript 首次出现是在 1995 年。在 1992 年,一个叫做 Nombas 的公司开发了一门叫做 “C减减”(C minus minus,Cmm)的语言,后来改名为 ScriptEase。
ScriptEase 最初的设计是将一种微型脚本语言与一个叫做 Espresso Page 的工具配合,使脚本能够在浏览器中运行,因此 ScriptEase 成为了第一个客户端脚本语言。
在 ScriptEase 出现以后,有一家叫做网景的公司,该公司也是世界上第一个将浏览器商用的公司。他们也想独立开发一种与 ScriptEase 相似的客户端脚本语言。于是,该公司的一个名叫布兰登·艾奇的人接受了这个任务,开始开发这门脚本语言。
该语言的语法借鉴了 Java,Perl,C,Self,Scheme 等编程语言。布兰登·艾奇仅仅花了 10 天的时间,就写出来了这门语言。起初,这个语言的目标是为了非专业的开发人员(如网站设计者),提供一个方便的工具。因为大多数网站的设计中都没有任何的编程背景,所以这个语言就应该尽可能简单,易学,最终一个弱类型的动态解释语言 LiveWire 就此诞生。LiveWire 没过多久就改名了 LiveScript 了,直到现在,在一些古老的 Web 页面中还能看到这个名字。
在 LiveScript 诞生之前,Java applet 曾经被热炒。之前 Sun 公司一直在不遗余力的推广 Java,宣称 Java applet 将会改变人们浏览网页的方式。然而市场并没有像 Sun 公司预期的那样好,这很大程度上是因为 Java applet 速度慢而且操作不便。网景公司的市场部门抓住了这个机遇,与 Sun 公司合作完成了 LiveScript 在浏览器端的实现,并在网景的 Navigator2.0 发布前,将 LiveScript 更名为了 JavaScript。网景公司为了取得 Sun 公司的支持,把 JavaScript 称之为 Java applet 和 HTML 的补充工具。
网景公司没有预料到当前那个市场策略带来的副作用有多大。多年来,到处都有人混淆 Java 和 JavaScript 这两个不相干的语言。两者除了名字相似和历史渊源之外,几乎没有任何关系。布兰登·艾奇为此也一直抱憾不已,他后来在一个名为 “JavaScript at Ten Years”(JavaScript 这 10 年)的演讲稿中写到:“Dont't let marketing name your language”(不要让营销来决定语言的名称)。
最初的 JavaScript 版本为 1.0 版本。JavaScript 1.0 出现之后,让原本只能在服务器端进行的表单验证,在客户端就能够实现,这样大大增强了用户体验,并且还让网页上面存在能够动起来的东西,也给当时的网页添加了一定的活力。所以 JavaScript 在诞生之处就获得了巨大的成功。网景公司的 Netscape 浏览器也因此在整个浏览器市场上占据了超高的份额。
看到了网景公司的成功,当时的 IT 界霸主微软公司就想出了要收购网景公司的策略。但是网景公司当时在整个 Web 领域有着相当高的地位,所以并不接受微软的收购协议。
于是,微软一怒之下对 JavaScript 进行了反编译,实现了类似于 JavaScript 的客户端脚本语言 JScript。并将其投放于自家的浏览器 Internet Explorer 供其使用。考虑到当时全球范围内有大量的 VB 程序员,所以还顺带弄了一个 VBScript 出来。JScript 的诞生成为了 JavaScript 发展的一个重要里程碑,标志着动态网页时代的全面到来。
至此,网景公司和微软公司之间开始了长达数年的浏览器以及客户端脚本语言的市场份额争夺之战。
第二阶段:第一次浏览器大战
就在网景公司和微软公司进行激烈的浏览器市场份额之争的时候,微软的 Internet Explorer 3 随 Windows 95 OSR2 捆绑销售的策略堪称一颗重磅炸弹。这一举动轻松击败了强劲的对手:网景公司的 Navigator。尽管这个做法致使微软后来声名狼藉(以及一系列的反垄断诉讼),但 Internet Explorer 3 的成功却有目共睹,其成功不仅仅在于市场营销策略,也源于产品本身。Internet Explorer 3 是一个划时代的产品。
最终,由于微软将 Internet Explorer 3 浏览器嵌入到自家的操作系统里面的策略,对于普通用户来讲,也就没有必要去重新下载一款浏览器了。所以导致网景公司的浏览器市场份额骤降,使得微软赢得了第一次浏览器大战的胜利。
虽然两家公司为争夺浏览器市场份额而进行的数年之久的浏览器之战,最终以微软的胜利告终,但是这场 “战争” 也给当时的程序员带来不小的痛苦。因为在最初,, JavaScript 并没有一个标准。 网景公司和微软公司各自为了争夺浏览器的市场份额,都在自己的脚本语言里面加入新的东西。
然而这些新的东西大多数都是效果相同,只是实现的方法不同。这就造成了一个很尴尬的事情,那就是苦逼的开发人员往往要为了兼容性书写两份不同的代码。
对于这种语言没有一个标准,两家公司各自为战的情况,来自开发人员的怨言越来越重。于是,针对 JavaScript 的标准化问题就被提上了日程,对 JavaScript 的标准化势在必行。
1997 年,以 JavaScript1.1 为蓝本的建议被提交给了欧洲计算机制造商协会(ECMA)。该协会指定 39 号技术委员会(TC39)负责提供 JavaScript 的标准化,定出来的标准称为 ECMA-262,也就是 ECMAScript。紧接着国际标准化组织也采纳了 ECMAScript 标准,定为 ISO-16262。
不过,尽管有 ECMAScript 作为 JavaScript 的语法和语言特性的标准,但是关于 JavaScript 其他方面的规范还是不明确,加上当时两家公司也并没有重视标准的重要性,各自在自家的浏览器中又加入了各自特有的对象和函数。这也是为什么这么多年来同样的 JavaScript 代码会在不同的浏览器中呈现不同的效果,甚至在一个浏览器中可以执行,而在另一个浏览器中却不可以。这直接导致了当时的 JavaScript 处于一个非常混乱的局面。
并且,微软在获得浏览器大战的胜利以后,认为已经没有什么东西可以影响它霸主的地位了,停止了对 JavaScript 以及 Internet Explorer 的继续开发。 JavaScript 就一直处于一个只是给网页添加特效的时期。甚至一度被民众给厌恶,因为一些开发人员对 JavaScript 的滥用,导致网页 上充斥着大量的弹窗和漂浮不定还很难关闭的广告,这都导致了人们对 JavaScript 的好感度骤降,JavaScript 就这样一直被当做是一门玩具语言。
第三阶段:第二次浏览器大战
网景公司在第一次浏览器大战中战败以后,公司也面临着破产。破产以后,开发 Navigator 浏览器那一拨人成立了一个叫做 Mozilla 的基金会,并且将之前的 Navigator 浏览器的代码给开源了。这一下子,有大批的爱好者自发的为这款浏览器添加补丁和维护。
2002 年,Mozilla 在之前 Navigator 浏览器的基础上,推出了火狐浏览器。这一举动,标志着当年的网景又回来了。火狐浏览器也成为了当时浏览速度最快的浏览器。但是这个时候,并没有引起微软的重视,微软认为,还可以依靠之前的策略来打败这款浏览器,毕竟在当时,Internet Explorer 6 在世界范围内有着超高的市场份额。
接下来,我们回头来说一下 JavaScript。虽说火狐浏览器推出了,但是 JavaScript 依旧没有改变它是用来做动画的命运,仍然被当作是玩具语言。直到 2005 年,这一年,JavaScript 的命运彻底被改变。新兴 IT 公司 Google 推出了 Ajax 技术,并将其应用到了自家的 Gmail 上面。Ajax的出现,大大的改变了用户的上网体验,可以无刷新的改变页面内容。而 Ajax 的主体就JavaScript。此时此刻,人们对这门以前的玩具语言,有了新的认识。
如果说第一次浏览器大战只有微软和网景两家公司打的火热,那么第二次浏览器大战远比第一次要激烈得多。2008 年,Google 推出了 Google 浏览器,苹果也推出了自家的 Safari 浏览器,还有以小巧而著名的 Opera 浏览器,都参与到了第二次浏览器大战里面。
比起第一次浏览器大战各自在自家的浏览器里面添加独特功能的情况,第二次浏览器大战一定程度上来讲可以看作是标准之战。因为这个时候,大家能意识到了遵循标准的重要性,谁的浏览器能够更接近标准,谁就能在市场上得到更高的认可。
第四阶段:JavaScript 蓬勃发展
随着第二次浏览器大战所引发的 Web 标准之战,逐渐的升级到了浏览器的引擎之战。什么意思呢?
JavaScript 代码是需要 JavaScript 引擎来进行解析的,所以,在同样都满足标准的情况下,谁的浏览器能够更快的解析 JavaScript 代码,谁就能够更加获得青睐。
第一款 JavaScript 引擎是由布兰登 ·艾奇在网景的 Navigator 中开发的,它的名字叫做SpiderMonkey。SpiderMonkey 在这之后还作为 Mozilla Firefox1.0 ~ 3.0 版本的引擎,而从 Firefox3.5 开始换为了 TraceMonkey,4.0 版本以后又换为了 JaegerMoney。
微软从 Internet Explorer 9 开始使用的 JavaScript 引擎为 Chakra,而苹果的 Safari 浏览器使用的 JavaScript 引擎为 Nitro 。Google公司的 Google 浏览器的 JavaScript 引擎为 V8 引擎。
在整个引擎之战中,要属 Google 公司的 V8 引擎最为瞩目,该引擎成为了解析 JavaScript 代码最快的引擎。甚至其速度能够接近于 C 语言的速度。 V8 引擎的出现,给 JavaScript 带来了一系列的革命。2009 年,RyanDahI 在 V8 引擎的基础上发布了 Node.js。至此,JavaScript 不再局限于客户端的开发,而是将触角延伸到了服务器端,可以进行服务器端的开发了。
(2009年, Node.js横空出世)
时至今日,各个 JavaScript 引擎的效率已经不相上下,通过不同引擎根据不同测试基准测得的结果各有千秋。但是,更有趣的是,JavaScript 的效率在不知不觉中已经超越了其他所有传统的脚本语言,并带动了解释器的革新运动。JavaScript 已经成为了当今速度最快的脚本语言之一,昔日的 “丑小鸭” 终于成了惊艳世俗的 “白天鹅”。
随着现在 JavaScript 的蓬勃发展,我们可以在很多领域都能见到 JavaScript 的身影。例如前面所说的 Web 开发还有服务器端开发,桌面应用开发,移动端开发,HTML5 游戏开发等。
Jef Atwood 曾经说过:凡是能够用 JavaScript 来写的应用,最终都必将用 JavaScript 来写。也许未来,就会成为 JavaScript 的天下,我们有理由相信 JavaScript 会变得越来越好。
JavaScript 版本介绍
说到 JavaScript 的版本,大致可以分为两种,一种是 JavaScript 版本,另一种是 ECMAScript 版本。
我们知道,ECMAScript 就是 JavaScript 的一个标准,而 JavaScript 是 ECMAScript 的一种实现。还有一点要明白的是,实现了 ECMAScript 的可不仅仅只有 JavaScript,还有诸如 ADOBE 公司旗下的 Flash 所用到 ActionScript,也可以看作是 ECMAScript 的一种实现。
关于 JavaScript 版本,目前只有 Mozilla 公司,还在继续沿用最初的 JavaScript 版本编号序列,对应的版本号如下表:
浏览器 | JavaScript版本 |
Netscape Navigator2 | 1.0 |
Netscape Navigator3 | 1.1 |
Netscape Navigator4 | 1.2 |
Netscape Navigator4.06 | 1.3 |
Netscape6+ | 1.5 |
Firefox1 | 1.5 |
Firefox1.5 | 1.6 |
Firefox2 | 1.7 |
Firefox3 | 1.8 |
Firefox3.5 | 1.8.1 |
Firefox3.6 | 1.8.2 |
另一个是 ECMAScript 版本,从1997年发布的 ECMAScript 1 到现在最让人熟知的 ECMAScript 6,发展路线也是挺曲折的,主要版本记录如下:
- 第 1 版:1997 年 6 月发布,本质上与 JavaScript 1.1 相同。
- 第 2 版:1998 年 6 月发布,主要是编辑加工的结果。
- 第 3 版:1999 年 12 月发布,是对 ECMAScript 标准第一次真正的修改。
- 第 4 版:ES4 由于太过激进,未被采用,与此同时 TC39 下属的一个小组提出了 ES3.1版本。
- 第 5 版:ES3.1 最终称为 ES5,于 2009 年 12 月发布,该版本力求澄清第 3 版中的歧义。
- 第 6 版: 2015 年 6 月 17 日发布。第 6 版标志着 ECMAScript 成为了一门真正的通用编程语言。