最近著名的Javascript框架Vue.js推出了3.0版本。很多人都感叹Javascript的框架纷繁众多,纷纷调侃“学不动学不动”。
抛开框架,回到Javascript语言本身。javascript语言是当今为数不多经历过PC、移动互联网革命,不仅依然屹立不倒的语言,像美酒一般愈久弥新。
那Javascript是如何从创造出来,又如何发展到如今十八般武艺样样精通,红火到上可写前端,下可写后台的呢?今天我就来818 JavaScirpt的历史。
网景公司与PC互联网
Javascript的出现是随着网景公司Netscapte Navigator产品一起推出,提起Javascript不得不说网景公司。
20世纪90年代的初期,PC互联网并未兴起时。已经出现了web端技术的雏形,也提出了如今大家熟知的HTML格式,但当时的技术仅仅能传输文字信息。
1993年,伊利诺伊大学厄巴纳香槟分校美国超级计算应用中心(National Center of Supercomputing Applications)推出了互联网历史第一个能显示图片的浏览器NCSA Mosaic (马赛克),并由此人气爆发大受欢迎。
近水楼台先得月,同样来自伊利诺伊的马克·安德森(Marc Andreessen)接触到了Mosaic,并敏锐的觉察到,这种客户端/浏览器模式且能显示图形信息的软件这将会是区别于传统操作系统的全新的分布式操作系统。
网景浏览器一经推出,很快就风靡全球,马克·安德森认为此时的体验尚未达到他的预想,浏览器虽然能比显示图形了,所展示的图形均是静态的,不能灵活的“运动”,给用户更加贴近现实的体验。如何操作界面的元素“动”起来?
此时急需一种运行在客户端,能操作DOM的灵活的“胶水语言”,服务器只需一次传输,客户端浏览器执行的脚本语言。
当时网景期望这种“胶水语言”简单,易于上手,设计师,计算机爱好者等不需要过多计算机知识的人也能容易学习。不能像Java、C、C++这种硬核的语言一样,需要较多的计算机背景才能掌握。
1995年Sun公司推出的HotJava浏览器
1995年的5月,网景公司让才入职一个月,时年35岁的布兰登·艾克(Brendan Eich)负责这项工作。
“没有硬性的技术路线,但需要语法和Java相似,只要快”。这便是当时公司下达的命令。
于是在短短的十天里面布兰登·艾克废寝忘食办工作,创造出了Javascript,最初的名字还叫Mocha。其实2.0版本开发的初期,并未想全新设计一门语言,公司原本是让艾克在浏览器中引入Scheme脚本,但随着Sun公司加入,由于商业目的,Sun公司希望将这门脚本能有类Java的语法,借此推广Java,也完善整个生态链。
艾克在纽约时代杂志的采访后来中也出了创建JavaScirpt的缘由“用python,scheme或者其他语言,再或者创建一门新的脚本语言,其实都不是我所能决定的,老板说,必须得长得像‘Java’就好了。”
虽然语法类似Java,但作为熟悉Scheme的程序员,艾克借鉴了Scheme函数式的特点,将函数作为这门语言的第一公民(first-class)。除此外,还借鉴了Self,推出了基于模板的链式对象模型,用于实现对象与对象的继承关系。
Netscape Navigator 市场占有率
第一款搭载Javascirpt引擎的Netscape Navigator 2.0
NetscapeNavigator 2.0 推出后不久,微软意识到在这一领域已经落后很远,于是全力开发IE,并也在此基础上推出自己的Javascript语言版本,并取名JScript。JScript与Javascript语法没有太大的区别,但是经常会在很多细节上与Javascrpt有偏差。当时程序员,经常需要为两者的区别做很多额外的兼容方案。
出现这种情况的很大原因是,当时还处于互联网的原始时期,社区的概念并未深入人心,厂商之间的竞争也非常的激烈,社区彼此之间的自我约束太弱,经常出现的情况是,我是行业老大,标准便是我来定,你们跟进吧。造成的结果是,整个行业的发展并一致,对于整个生态的发展是弊大于利的。
1.0版本内容基本是基于Netscape Navigator 4中的Javascript版本。
ECMAScript 2.0
1998年的6月,发布了ECMAScript 2.0。与1.0差别不大,仅仅是修复了与原来Javascript版本一些不一致性的问题。
ECMAScript 3.0 首次的大改动
这个版本主要的大致的特性有
正则表达式
do-while循环
try-catch异常捕获
添加更多的内置函数
数值的格式化输出
ECMAScript 4.0 大跃进与不欢而散
社区提出了很多改动非常大的特性,有些为了推动语言的进步,有些是纯粹的理想主义,讨论提出,前前后后耗费几年,标准的修订依然未能确定下来,讨论过程的顶峰,4.0提出的特性有很多与3.0语法有较大差异的特性,比如下
类
接口
命名空间
包管理
类型定义
这其中很多的特性,在当时被认为过于的激进,从语法层面上与现有3.0差别过大,比如包管理,命名空间。引入这些特性时显然需要对JavaScript 语法层面上进行一个重新调整。
这里可以从ES4的追随者ActionScript可以看到与JavaScript 语法层面的差别
//ActionScript 例子package { import flash.display.Sprite; public class MySprite extends Sprite { private var _name:String; public function MySprite(name:Number) { _name = name; } public function sayhello():void{ } } }//Javascirpt 在 ES2015 类特性之前的继承方案。function Sprite() }function MySprite() { this.name = ""; this.sayHello(){ }}MySprite.prototype = new Sprite();所以当微软,adobe,mozila,opera,雅虎,等厂商真正坐下来讨论时,事情马上变得不一样了。微软反对4.0每一项特性,他认为这完全背离了Javascript语言的真正的初衷,所有的这些特性不仅让Javascript臃肿无比,更会让这门语言推向失控的深渊。
最终谈判桌上不欢而散,4.0的所有的特性全盘被否定,大部分厂商都放弃了支持这些特性。唯独adobe公司,接受4.0提出的特性,并由此为蓝本,并创建了ActionScript。并将这种语言运用到自己的Flash产品中来。
为让社区能重新融洽的继续运行下去,4.0提出的大部分争议性特性宣告难产,仅保留一小部分特性作为3.1版本。
同时正是由于这长达近10年的标准修订工作缓慢的进展,这一空窗期使得Javascript语言的发展方向由于厂商不同的利益变得不同,有的差异性越来越大,走向不兼容(Adobe ActionScript),更多是各自有了自己的小方向,这也苦了这一时代的web程序员,要为各个不同浏览器的兼容性做更多的繁杂而无用的工作。
ECMAScript 5 重生
getter/setter
JSON支持
strict mode 严格模式
·数组的 map,reduce方法等
ECMAScript 6 (2015) 和 ECMAScript 7 (2016)
2008年v8这一性能强大的Javascript引擎出现后的一年,Nodejs横空出世,极大的刺激了Javascript在除开web领域的使用场景,也凸显了Javascript在大工程中的短板,更加现代,更加易用的Javascript越来越高。
除了命名规则的变化,提案也有很多进步的特性,甚至一些ES4当年被称为过于激进的特性,也重新被提上日程。
箭头函数
let const 关键字
类 (当年ES4被否定,直到现在使用prototype的语法糖实现了)
Promise
迭代器 for ..of 等
为何JScript,ActionScript没能战胜Javascript,屹立不倒20余年
回到Javascript的发展进程中时会发现Web世界,历史的惯性作用是很大,当初JScript的推出也是紧跟Javascirpt的步伐,尽管推出IE后的,微软在市场占有率上占有很大的话语权,但单从语言的角度而言,JScript 从选择决定与Javascirpt兼容的那一刻便决定了,两者的的关系在以后的日子里早已是你中有我,我中有你。
至于ActionScript就更不用说了。当大家都吵翻,表示不愿意遵循ES4标准时,Adobe特立独行的选择ES4,走了一条大家都相反的路,对于开发者而言,变化过于激烈,其他厂商不跟进,成本太大,使用的人自然少了。最终Adobe只能乖乖用于自家的软件了。
当然从纯粹语言的角度,JavaScirpt足够的简单但不粗糙,在那个刀耕火种的年代,一款简单易上手的语言如同电气革命时代的电灯,使用上便永远放弃不了,这也算某种历史的洪流了吧。这也是我认为为何JavaScirpt能叱咤江湖20余年屹立不倒的原因。
拒绝无趣!更多新鲜有趣的编程知识欢迎关注 乐Code乐Code