什么是JavaScript?

什么是JavaScript?

前言

工业革命是钢铁铸就的,互联网革命则是 JavaScript 造就的。 ------ Matt Frisbie

在当今的Web世界里,JavaScript是最不可或缺的一部分,其占据着统计级别的地位。在2021年的调查结果显示,JavaScript位列“最常编程语言”榜首,这是有充分理由的:大多数网络浏览器都使用它,而且它是最容易学习的语言之一。

排行榜

JavaScript是一门松散的面向对象语言,第一版基本上是一个大杂烩。

  • 基本语法:借鉴C语言和Java语言。
  • 数据结构:借鉴Java语言,包括将值分成原始值和对象两大类。
  • 函数的用法:借鉴Scheme语言和Awk语言,将函数当作第一等公民,并引入闭包。
  • 原型继承模型:借鉴Self语言(Smalltalk的一种变种)。
  • 正则表达式:借鉴Perl语言。
  • 字符串和数组处理:借鉴Python语言。

尤其是基本语法和对象体系,是模仿Java而设计的。正是因为和Java有很大的相似性,才将名字从LiveScript更改为JavaScript(事实上网景改名,是为了搭上媒体当时热烈炒作 Java 的顺风车),基本上,JavaScript这个名字的原意是“很像Java的脚本语言”。

但是,在其诞生之初是被曲解为玩具,是弱不禁风的。他能做的事情太少,在形式上并不是一门真正有内聚力的编程语言。更重要的是,这门语言与其宿主关系密切。

ECMA-262 规范定义了 JavaScript,但 JavaScript 没有唯一正确的实现。更重要的是,这门语言与其宿主关系密切。各种浏览器及其 JavaScript 引擎都按照自己的理解实现了这些规范。

但 Web 上随处可见迎合各种浏览器偏好的页面,因此,对 JavaScript 更准确的定位应该是一组浏览器实现。在早期,事实上就是如此;当然,也仅限于早期

问世

1995 年,Netscape旗下的JavaScript 问世。当时,它的主要用途是代替 Perl 等服务器端语言处理输入验证。在互联网的远古时代,让客户端处理某些基本的验证是让人兴奋的新功能,同时缓慢的网速让页面每次刷新都考验着人们的耐心。

从那时起,JavaScript逐渐成为市面上主流浏览器的标配,各种浏览器及其 JavaScript 引擎都按照自己的理解实现了ECMA-262 规范。就连拥有自家客户端脚本语言 VBScript 的微软公司,也在其 Internet Explorer(以下简称 IE)浏览器最初的版本中包含了自己的 JavaScript 实现。

从简单的输入验证脚本到强大的编程语言,JavaScript 的崛起没有任何人预测到。

在Netscape Navigator 3发布后不久,微软发布了 IE3,其中包含自己名为 JScript(叫这个名字是为了 避免与网景发生许可纠纷)的 JavaScript 实现。1996 年 8 月,微软重磅进入 Web 浏览器领域,这是网景 永远的痛,但它代表 JavaScript 作为一门语言向前迈进了一大步。

这也意味着,这门编程语言的规范其语法或特性没有一个稳定的标准。这让当时的开发者来说无疑是灭顶之灾。随着业界担忧日甚,JavaScript 终于踏上了标准化的征程。

1997 年,JavaScript 1.1 作为提案被提交给欧洲计算机制造商协会(Ecma)。第 39 技术委员会(TC39) 承担了“标准化一门通用、跨平台、厂商中立的脚本语言的语法和语义”的任务(参见 TC39-ECMAScript)。

TC39 委员会由来自网景、Sun、微软、Borland、Nombas 和其他对这门脚本语言有兴趣的公司的工程师 组成。他们花了数月时间打造出 ECMA-262,也就是 ECMAScript(发音为“ek-ma-script”)这个新的脚本语言标准。

1998 年,国际标准化组织(ISO)和国际电工委员会(IEC)也将 ECMAScript 采纳为标准(ISO/ IEC-16262)。自此以后,各家浏览器均以 ECMAScript 作为自己 JavaScript 实现的依据,虽然具体实现各有不同。

虽然 JavaScript和 ECMAScript 基本上是同义词,但 JavaScript远远不限于 ECMA-262 所定义的那样。 没错,完整的 JavaScript 实现包含以下几个部分。

  • 核心(ECMAScript)
  • 文档对象模型(DOM)
  • 浏览器对象模型(BOM)

ECMAScript

ECMAScript(发音为“ek-ma-script”),即 ECMA-262 定义的语言,并不局限于 Web 浏览器。事实上,这门语言没有输入和 输出之类的方法。ECMA-262 将这门语言作为一个基准来定义,以便在它之上再构建更稳健的脚本语言。 Web 浏览器只是 ECMAScript 实现可能存在的一种宿主环境(host environment)。

宿主环境提供 ECMAScript 的基准实现和与环境自身交互必需的扩展。

扩展(比如 DOM)使用 ECMAScript 核心类型 和语法,提供特定于环境的额外功能。

其他宿主环境还有服务器端 JavaScript 平台 Node.js 和即将被淘汰 的 Adobe Flash。

如果不涉及浏览器的话,ECMA-262 到底定义了什么?在基本的层面,它描述这门语言的如下部分

  • 语法
  • 类型
  • 语句
  • 关键字
  • 保留字
  • 操作符
  • 全局对象

ECMAScript 只是对实现这个规范描述的所有方面的一门语言的称呼。

JavaScript 实现了 ECMAScript,而 Adobe ActionScript 同样也实现了 ECMAScript。

ECMAScript

ECMA-262 的第 1 版本质上跟网景的 JavaScript 1.1 相同, 只不过删除了所有浏览器特定的代码,外加少量细微的修改。

ECMA-262 要求支持 Unicode 标准(以支 持多语言),而且对象要与平台无关(Netscape JavaScript 1.1 的对象不是这样,比如它的 Date 对象就依赖平台)。

这也是 JavaScript 1.1 和 JavaScript 1.2 不符合 ECMA-262 第 1 版要求的原因。

ECMA-262 第 2 版只是做了一些编校工作,主要是为了更新之后严格符合 ISO/IEC-16262 的要求, 并没有增减或改变任何特性。ECMAScript 实现通常不使用第 2 版来衡量符合性(conformance)。

ECMA-262 第 3 版第一次真正对这个标准进行更新,更新了字符串处理、错误定义和数值输出。此外还增加了对正则表达式、新的控制语句、try/catch 异常处理的支持,以及为了更好地让标准国际化 所做的少量修改。

对很多人来说,这标志着 ECMAScript 作为一门真正的编程语言的时代终于到来了

ECMA-262 第 4 版是对这门语言的一次彻底修订。作为对 JavaScript 在 Web 上日益成功的回应,开 发者开始修订 ECMAScript 以满足全球 Web 开发日益增长的需求。为此,Ecma T39 再次被召集起来, 以决定这门语言的未来。

结果,他们制定的规范几乎在第 3 版基础上完全定义了一门新语言。第4版包括强类型变量、新语句和数据结构、真正的类和经典的继承,以及操作数据的新手段。

与此同时,TC39 委员会的一个子委员会也提出了另外一份提案,叫作“ECMAScript 3.1”,只对这 门语言进行了较少的改进。

这个子委员会的人认为第 4 版对这门语言来说跳跃太大了。

因此,他们提出 了一个改动较小的提案,只要在现有 JavaScript 引擎基础上做一些增改就可以实现。

最终,ES3.1 子委员 会赢得了 TC39 委员会的支持,ECMA-262 第 4 版在正式发布之前被放弃。

ECMAScript 3.1 变成了 ECMA-262 的第 5 版,于 2009 年 12 月 3 日正式发布。

第 5 版致力于厘清第 3 版存在的歧义,也增加了新功能。

新功能包括原生的解析和序列化 JSON数据的 JSON 对象、方便继承和高级属性定义的方法,以及新的增强 ECMAScript 引擎解释和执行代码能力的严格模式。

第 5 版在 2011 年 6 月发布了一个维护性修订版,这个修订版只更正了规范中的错误,并未增加任何新的语言或库特性。

ECMA-262 的第 5 版也就是现在es6版本的前身es5。

ECMA-262 第 6 版,俗称 ES6、ES2015 或 ES Harmony(和谐版),于 2015 年 6 月发布。这一版包 含了大概这个规范有史以来最重要的一批增强特性。ES6 正式支持了类、模块、迭代器、生成器、箭头函数、期约、反射、代理和众多新的数据类型。

随后的es6 - es10,分别在2015年-2019年发布。

由此可见,当时初版的情况并不仅仅是作为一门单独的编程语言规范存在,极有可能包含两大公司的妥协。

囚徒

从JavaScript的版本,我们很难看出它在诞生之初被质疑。

不仅仅是修修补补的OOP(面向对象)功能、类型安全性差、笨拙的DOM模型、==和===分不清。根本原因在于局限性 -- 一个让你的代码固定下来的严格控制的环境。代码把JavaScript和桌面系统隔离开了。比如,JavaScript无法直接访问文件系统、显示器或者任何硬件。

毕竟,在设计之初,就与其宿主严格绑定在一起 => Web浏览器。除了在本地无所事事,和远程服务器也没有交流,除了翻转一下网页、点击下按钮,他和远程服务器也无法交流。他被限死在网页、在浏览器里。

第一次“工业革命”

毫无疑问,JavaScript是在正确的时间出现在了正确的位置上 --- 生逢其时。

今天的微软拥护在所有操作系统上进行开源开发。

但在当年,微软是恰恰相反的,是赤裸裸的反开源斗士,总是用“拥抱,扩展再扑灭”的理念消耗竞争对手。

第一个催化剂 - AJAX

微软的一个团队正在研究一种使Outlook的Web前端响应速度更快的方法。他们正在开发一个名为Outlook Web Access的产品,

这个团队想做一个在浏览器上跑的高效电子邮件阅读器,更重要的是他们不想每隔几秒钟就刷新一次整个页面。取而代之的是,他们用一种可让网页在后台悄悄检查新邮件的技术。是不是很熟悉?

他们成功了,微软团队用了一个叫做XMLHttpRequest 的ActiveX组件来创建了一条小管道。

XMLHttpRequest 的基本思想很简单——它为JavaScript代码提供了一种发送Web请求的方法。就像web浏览器可以联系web服务器并发出请求(例如,“嘿,请给我这个网页!”)一样,JavaScript代码也可以用XMLHttpRequest 对象发出自己的请求(例如,“嘿,请给我多几条邮件消息。”)。

这样,早期是网络请求就这样诞生了。但是当年的微软并不开源,XMLHttpRequest 是用ActiveX开发的,这意味着它只能在Windows计算机上运行,并且只能在Internet Explorer中运行。

不管当年发生了什么,结果就是其他主流浏览器也都纷纷提供了自己的XMLHttpRequest 实现。

一夜之间,网页就可以利用远程服务器的所有资源了。

需要数据库里面的一些数据?发送请求,服务器给你。

需要服务器来执行计算、安全测试,或者对一个超级秘密进行验证检查?也向远程服务器发起请求吧。

最重要的是,在后台发起呼叫时,页面不会受到干扰。

第二个催化剂 - JQuery

XMLHttpRequest 是改变JavaScript进程的关键要素,但这并不妨碍其他因素。

2006年,当年雄霸天下的一个JavaScript函数库诞生,它就是大名鼎鼎的JQuery,优越的兼容性是开发者不可或缺的工具。

2008年,V8引擎诞生,强大的性能,同时V8是一个单独的开源组件,意味着其他项目也可以使用它。

2008年下半年,HTML5发布,单独来说可能没那么重要。但是谁也不会料到,它与新版的JavaScript API是天作之合。

2009 年 12 月 3 日,es5发布。

一个强烈的、利好的化学反应陡然在Web领域迸发。没过多久,开发人员有了用于存储本地数据,管理浏览器历史记录,利用音频以及运行后台任务的工具。

web功能和桌面能力之间的差距再次缩小;利用JQuery强大的兼容、V8的强大性能、与HTML5亲密配合,JavaScript彻底奠定了自己的地位。

越来越多酷炫的网页被开发出来,甚至能够开发移动端的项目,这些项目开始只能被手机浏览器以网页的形式被访问。但是没过多久,一个个手机应用被开发出来,原生AndroidIos的地位开始迎来挑战。

第二次“工业”革命

短短时间内,大量使用新技术的网页被开发出来。但是,距离真正的桌面能力仍然有一定的差距,在新概念到来之前,JavaScript最大的作用,依然只能是写一些酷炫的网页。

尤其是大型复杂系统,这个时候的JavaScript越来越吃力,JQuery让大量的代码难以维护。

这时候,很多人注意到桌面程序的开发模式 - MVC,这是一种使用了低耦合,高内聚“软件工程理念的开发模式。MVC将界面显示代码跟业务逻辑代码有效隔离,将原先糅杂一起的代码分开,各部分趋于专门化,功能职责单一。这样让程序更易阅读、维护、扩展了。

在 2009 年诞生了 NodeJS ,将前端带入全新方向,为 AngularJS(2009 年诞生),React(2011 年诞生)和 Vuejs (2014 年诞生)三大框架的**「诞生奠定基础」**。

三大框架助前端开发进入崭新的时代

这些新技术,不仅让JavaScript彻底登上王位,而且向移动端、桌面应用发起了总攻,一时间,大量的移动端程序和桌面应用程序使用JavaScript开发。

同时在诞生之初的类型问题,也随着2012年的TypeScript发布,烟消云散。

TypeScript是JavaScript的超集,你可以使用任何JavaScript在里面开发,通过各类工具转化为JavaScript代码。

这让JavaScript开发超大型系统提供了更大的可能。

现代JavaScript

在2020年9月18日,Vue3发布。

这意味着三大框架中的最后一个没有使用TypeScript的框架,也全面拥抱了TypeScript(Vue2有过渡版本,但不完善)。

我们需要注意到,现在很多展示页面,都在大量使用JavaScript开发出来的Web页面,移动端和桌面应用的战争还在惨烈的进行当中,但是偶然发现,车载系统也内置了Node.js,也在用三大框架去开发展示页面。WebAssembly则可能会完全摆脱语言限制,依靠JavaScript引擎去采用任意的高级编程语言。

很难想象,JavaScript的未来发展究竟如何,是一骑绝尘还是泯然众人。

这中间,JavaScript无论是作为挑战者还是被挑战者,它都走到了现在,而且短时间来看,它也绝对不会有相当能量的对手。

是时候承认它的的地位了。尽管要缝缝补补,尽管有着这样那样的不一致,但JavaScript无疑是伟大的编程语言之一。

Brendan Eich 把JavaScript放进来Netscape Navigator里面。我们则把整个世界都塞进了浏览器。其结果就是现代的web。

永远要相信JavaScript会赢!

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×