脚本编程语言-JavaScript
2024-02-14 11:20:15 阿炯

JavaScript(通常缩写为JS)是一门基于原型和头等函数的多范式高级解释型编程语言,它支持面向对象程序设计、指令式编程和函数式编程。它提供方法来操控文本、数组、日期以及正则表达式等。不支持I/O,比如网络、存储和图形等,但这些都可以由它的宿主环境提供支持。它由Ecma通过ECMAScript实现语言的标准化。目前它被世界上的绝大多数网站所使用,也被世界主流浏览器(Chrome、IE、Firefox、Safari和Opera)所支持。


JavaScript与Java在名字和语法上都很相似,但这两门编程语言从设计之初就有很大不同。JavaScript在语言设计上主要受到了Self(一种基于原型的编程语言)和Scheme(一门函数式编程语言)的影响,在语法结构上它和C语言很相似(如if条件语句、switch语句、while循环和do-while循环等)。对于客户端来说,JavaScript通常被实现为一门解释语言,但如今它已经可以被即时编译(JIT)。随着HTML5和CSS3语言标准的推行,它还可以用于游戏、桌面和移动应用程序的开发,以及在服务器端网络环境运行(如Node.js)。


JavaScript是一门脚本语言,其源代码在客户端执行前不需经过编译,而是将文本格式的字符代码发送给浏览器,由浏览器解释执行。解释型语言的弱点是安全性较差,而且在其中如果一条语句执行不了,通常它下面的语言也就无法执行。它被归类为解释型语言是因为主流的引擎都是每次执行时加载代码并解译。V8是将所有代码解译后再开始执行,其他引擎则是逐行解译(SpiderMonkey会将解译过的指令暂存,以提高性能,称为即时编译)。但由于V8的核心部分多数用JavaScript编写(而SpiderMonkey是用C++),因此在不同的测试上,两者性能互有优劣。


发展轶事

1993年,国家超级计算机应用中心(NCSA)发表了NCSA Mosaic,这是最早流行的图形接口网页浏览器,它在万维网的普及上发挥了重要作用。1994年,Mosaic的主要开发人员创立了Netscape公司,并雇用了许多原来的NCSA Mosaic开发者用来开发Netscape Navigator,该公司的目标是取代NCSA Mosaic成为世界第一的网页浏览器。在四个月内,已经占据了四分之三的浏览器市场,并成为1990年代互联网的主要浏览器。

当时网页只能是静态的,缺乏在浏览器中加载网页后的动态行为能力。公司的创始人马克·安德森认为HTML需要一种胶水语言,让网页设计师和兼职程序员可以很容易地使用它来组装图片和插件之类的组件,且代码可以直接编写在网页标记中。1995年,网景招募了布兰登·艾克(Brendan Eich),目标是把Scheme语言嵌入到Netscape Navigator浏览器中。但更早之前,网景已经跟升阳合作,计划在Netscape Navigator中嵌入Java语言,这时网景内部产生激烈的争论,网景公司管理层很快决定,最佳的方案是由艾克设计一种新的语言,其语法类似于Java,而不像Scheme或其他现存的脚本语言。为了在其他竞争提案中捍卫JavaScript这个想法,公司需要有一个可以运作的原型。艾克在1995年5月仅花了十天时间就把原型设计出来了。最初命名为Mocha,1995年9月在Netscape Navigator 2.0的Beta版中改名为LiveScript,同年12月,Netscape Navigator 2.0 Beta 3中部署时被重命名为JavaScript,正式诞生。当时网景公司与昇阳电脑公司组成的开发联盟为了让这门语言搭上Java这个编程语言“热词”,因此将其临时改名为JavaScript,日后这成为大众对这门语言有诸多误解的原因之一。

微软公司于1995年首次推出Internet Explorer(IE),引发了与Netscape的浏览器大战。微软对Netscape Navigator解释器进行了逆向工程,创建了JScript,以与处于市场领导地位的网景产品同台竞争。JScript也是一种JavaScript实现,这两个JavaScript语言版本在浏览器端共存意味着语言标准化的缺失。发展初期,JavaScript的标准并未确定,同期就有网景的JavaScript和微软的JScript。除此之外,微软也在网页技术上加入了不少专属对象,使不少网页使用非微软平台及浏览器无法正常显示。这导致在浏览器大战期间网页设计者通常会把“用Netscape可达到最佳效果”或“用IE可达到最佳效果”的标志放在主页。

1996年11月,网景正式向ECMA(欧洲计算机制造商协会)提交语言标准。1997年6月,ECMA以JavaScript语言为基础制定了ECMAScript标准规范ECMA-262。JavaScript成为了ECMAScript最著名的实现之一。除此之外,ActionScript和JScript也都是ECMAScript规范的实现语言。尽管JavaScript作为给非程序人员的脚本语言,而非作为给程序人员的编程语言来推广和宣传,但是JavaScript具有非常丰富的特性。

在21世纪初IE占主导地位期间,客户端脚本停滞不前。这在2004年开始改变,当时Netscape的继任者Mozilla发布了Firefox浏览器。其一经推出就受到众人的好评,并从IE获得了巨大的市场份额。2005年,Mozilla加入了ECMA International,并开始研究ECMAScript for XML(E4X)标准。这导致Mozilla与Macromedia(后来被Adobe Systems收购)合作,他们正在用基于ECMAScript 4草案的ActionScript 3语言实现E4X。目标是将ActionScript 3标准化为新的ECMAScript 4。为此Adobe Systems将Tamarin实现作为开源项目发布。然而Tamarin和ActionScript 3与既定的客户端脚本太不同,如果没有微软的合作,ECMAScript 4从未获取成果。

与此同时,与ECMA工作无关的开源社区正在发生非常重要的发展。2005年,Jesse James Garrett发布了一份白皮书,其中他创造了Ajax一词,并描述了一套技术,其中JavaScript是骨干,用于创建可以在后台加载数据的Web应用程序,避免了重新加载整页的需要。这引发了JavaScript的复兴时期,由开源库和围绕它们形成的社区带头。创建了许多新库,包括jQuery、Prototype、Dojo Toolkit和MooTools。

谷歌于2008年首次推出Chrome浏览器,其V8 JavaScript引擎比竞争对手更快。关键的创新是及时编译(JIT),因此其他浏览器供应商需要为JIT彻底改革他们的引擎。2008年7月,这些不同的团体聚集在一起,在奥斯陆举行会议。这导致在2009年初达成了最终协议,将所有相关工作结合起来,推动语言向前发展。结果是2009年12月发布的ECMAScript 5标准。 关于该语言的雄心勃勃的工作持续了数年,最终随着 2015 年ECMAScript 6的发布而正式形成了广泛的补充和改进。

Ryan Dahl在 2009 年创建的Node.js引发了 Web 浏览器之外 JavaScript 使用的显着增加。Node 结合了V8引擎、事件循环和I/O API,从而提供了独立的 JavaScript 运行时系统。截至 2018 年,Node 已被数百万开发人员使用,并且npm拥有世界上所有包管理器中最多的模块。

ECMAScript 草案规范目前在GitHub上公开维护,并通过定期的年度快照生成版本。对语言的潜在修订通过全面的提案流程进行审查。现在开发人员不再单独检查即将推出的功能的状态,而不是版本号。当前的 JavaScript 生态系统拥有许多库和框架、已建立的编程实践以及在 Web 浏览器之外大量使用 JavaScript。另外随着单页应用程序和其他大量使用 JavaScript 的网站的兴起,已经创建了多个转译器来帮助开发过程。

特性

不同于服务器端脚本语言(如PHP和Perl),JavaScript主要被作为客户端脚本语言在用户的浏览器上运行,不需要服务器的支持。所以在早期程序员比较青睐于JavaScript以减少对服务器的负担,而与此同时在安全性上出现了问题。随着服务器变得强大,现在的程序员更喜欢运行于服务端的脚本以保证安全,但JavaScript仍然以其跨平台、容易上手等优势大行其道。同时,有些特殊功能(如AJAX)必须依赖JavaScript在客户端提供支持。随着引擎(如V8)和框架(如Node.js)的发展,以及事件驱动和异步IO等特性,其也被逐渐用来编写服务器端程序。以下是ECMAScript通常所实现的特性。

指令式与结构化

JavaScript支持许多C语言的结构化编程语法(如if条件语句、while循环、switch语句和do-while循环等),但作用域是一个例外。JavaScript在过去只支持使用var关键字来定义变量的函数作用域,但ECMAScript 2015中加入了let关键字来支持块级作用域。这意味着JavaScript现在既支持函数作用域又支持块级作用域,其还支持自动在语句末添加分号,允许忽略语句末尾的分号。

弱类型
JavaScript是弱类型的,这意味着变量可以被隐式转换为另一个类型。
二元运算符+会把两个操作数转换为字符串,除非两个操作数都为数字类型。[31]这是因为+也表示字符串连接操作;
二元操作符-会把两个操作数转换为数字类型;
一元操作符,包括+和-,都会把操作数转换为数字。

下列为变量转换为字符串的例子:
字符串类型不变;
数字会转换为其字符串表示;
数组的元素会转换为字符串,然后连接成通过逗号,分隔的长字符串;
其它对象会转换为[object Object],其中Object中该对象的构造函数名。

类型的隐藏转换是JavaScript受到批评的原因之一,因为隐藏转换增加了规则的复杂度和发生错误的可能性。

相关特性

JavaScript是动态类型的语言,其类型与值而不是与变量相关联。例如变量可以为数字,随后又可被赋值为字符串。其提供了包括鸭子类型在内的方法来检测变量类型。

运行时:提供eval()函数,可以在运行时直接执行JavaScript语句。

还有基于原型的面向对象、函数作为对象构造器、函数作为方法、函数式:
在JavaScript中,函数是一等的,函数也被认为是对象。因此,函数可以有属性和方法,例如call()和bind等。嵌套函数指定义于其它函数内部的函数,在外部函数被调用时,嵌套函数会被创建。另外,嵌套函数是一个闭包,在外部函数的作用域(包括常量,局部变量和参数)都成为内部函数状态的一部分,甚至在外部函数执行完毕后,内部函数的状态依然保留。同时也支持匿名函数。

JavaScript通常依赖于运行时环境(例如浏览器)来提供对象和方法,脚本可以通过这些对象和方法与环境(例如网页DOM)进行交互。它还依赖于运行时环境来提供包或导入脚本(例如HTML的<script>元素)的功能。这本身不是语言功能,但在大多数JavaScript实现中很常见。其中函数参数的长度是可变的,在函数内部可以通过arguments对象访问这些参数。

异步:JavaScript一般来说是单线程的。为了并发地处理事件,其输入或输出时使用事件和回调函数执行;这意味着JavaScript可以在等待数据库查询返回信息之前处理鼠标单击。ECMAScript 2015引入了Promise用于处理异步事件,其可以使得传统的基于回调的异步代码更加清晰简单。


版本

JavaScript最初开发于1996年,被使用于Netscape Navigator网页浏览器。同年微软在Internet Explorer发布了一个实现。由于商标问题,这项实现被命名为JScript。1997年,JavaScript已经被网景公司提交给ECMA制定为标准,称之为ECMAScript,标准编号ECMA-262。使用显式版本号声明对语言的引用,作为一项Mozilla的特性,已在较新版本中被移除(至少为Firefox 59)。Firefox 4是最后一个需要显式地在引用时声明明确版本号的版本(1.8.5)。

版本发布日期基于Netscape
Navigator
Mozilla
Firefox
Internet
Explorer
OperaSafariGoogle
Chrome
旧版本,不再支持: 1.01996年3月 2.0 3.0   
旧版本,不再支持: 1.11996年8月 3.0     
旧版本,不再支持: 1.21997年6月 4.0 - 4.05  3  
旧版本,不再支持: 1.31998年10月ECMA-262 1st + 2nd edition4.06 - 4.7x 4.05  
旧版本,不再支持: 1.4  Netscape
Server
  6  
旧版本,不再支持: 1.52000年11月ECMA-262 3rd edition6.01.05.5(JScript 5.5)
6(JScript 5.6)
7(JScript 5.7)
8(JScript 5.8)
7.03.0-51.0 - 10.0.666
旧版本,不再支持: 1.62005年11月1.5 + Array extras + Array and string generics + E4X 1.5    
旧版本,不再支持: 1.72006年10月1.6 + Pythonic generators + Iterators + Let 2.0   28.0.1500.95
旧版本,不再支持: 1.82008年6月1.7 + Generator expressions +Expression closures 3.0 11.50  
旧版本,不再支持: 1.8.1 1.8 +native JSON support + Minor updates 3.5    
旧版本,不再支持: 1.8.22009年6月22日1.8.1 + Minor updates 3.6    
旧版本,不再支持: 1.8.52010年7月27日1.8.2 + New features for ECMA-262 5th edition compliance 4.0    


JavaScript引擎

是一个专门处理JavaScript脚本的虚拟机,一般会附带在网页浏览器之中。在2008年到2009年的第二次浏览器大战之前,JavaScript引擎仅简单地被当作能阅读执行JavaScript源代码的解释器。
SpiderMonkey:第一个JavaScript引擎,由布兰登·艾克在网景公司开发,用于Netscape Navigator网页浏览器中,由C++实现。自JavaScript 1.5升级以符合ECMA-262版本3。
Rhino:由网景公司的诺里斯·博伊德(Norris Boyd)开发,由Java实现。像SpiderMonkey一样,Rhino符合ECMA-262版本3。
Nitro:Apple Safari 4开始支持
V8:Google Chrome制作
TraceMonkey:Mozilla Firefox 3.5开始支持

最通用的JavaScript宿主环境是网页浏览器。网页浏览器一般使用公共的API创建“宿主对象”以便于在JavaScript中支持DOM。JavaScript是一种ECMAScript方言,在许多程序中得以实现,特别是在网页浏览器。这些方言通常扩展了语言,或者标准库和相关API,例如W3C定义的DOM。这意味着以一种方言实现的程序不兼容于另一种方言的实现,除非程序使用了方言中的公共子集所具有的特性和API。在实现和方言中存在着一些差别,一种语言的方言有一些与语言不同的地方,实现能够执行该语言或方言编写的程序。


应用程序(实现)     方言和最后版本     ECMAScript版本
Google Chrome,V8引擎     JavaScript     ECMA-262,版本6
Mozilla Firefox,Gecko排版引擎,SpiderMonkey和Rhino     JavaScript 1.8.5     ECMA-262,版本6
Safari,Nitro引擎     JavaScript     ECMA-262,版本6
Microsoft Edge,Chakra引擎     JavaScript     EMCA-262,版本6
Opera,Carakan引擎(改用V8之前)     一些JavaScript 1.5特性及一些JScript扩展     ECMA-262,版本5.1
KHTML排版引擎,KDE项目的Konqueror     JavaScript 1.5     ECMA-262,版本3
Adobe Acrobat     JavaScript 1.5     ECMA-262,版本3
OpenLaszlo     JavaScript 1.4     ECMA-262,版本3
Max/MSP     JavaScript 1.5     ECMA-262,版本3
ANT Galio 3     JavaScript 1.5附带RMAI扩展     ECMA-262,版本3


JavaScript函数库

是指用于Javascript语言开发的函式库,多应用在网页DOM、AJAX、CSS的领域,可以帮助网页开发者用更快速地撰写网页,例如有些JavaScript函式库提供精简化的DOM操作函数或解决跨浏览器问题等。此领域有比较多的实现,最有名的是jQuery


布兰登·艾克

英语:Brendan Eich,1961年7月4日—,美国程序技术专家与企业家,JavaScript主要创造者与架构师,曾任Mozilla公司的首席技术官,并曾短暂担任首席执行官。


艾克生于美国加州的森尼维尔市,在圣塔克拉拉大学(Santa Clara University)就读时,最初主修物理学,大三时因兴趣转变转投计算机科学领域,后获取数学与计算机科学学士学位。1986年获取伊利诺伊大学香槟分校计算机科学硕士学位。毕业后进入SGI工作,在此工作七年,主要负责操作系统与网络功能。之后他在MicroUnity工作了三年。1995年4月,任职于网景期间,为网景浏览器开发出JavaScript,之后成为网页浏览器领域应用最广泛的脚本语言之一。1998年,艾克协助成立Mozilla.org,2003年在美国在线决定结束网景部门营运后,艾克协助成立了Mozilla基金会。

2014年3月24日,艾克晋升为Mozilla公司首席执行官引发同性恋族群抗议,归咎于艾克2008年曾捐助1000美元支持加利福尼亚州8号提案。此事引发在线交友网站OkCupid抵制使用Firefox浏览器,一些Mozilla员工亦要求辞职。Mozilla董事会成员希望他留在公司中扮演不同的角色。

2014年4月3日,艾克宣布从Mozilla离职。艾克在他的个人博客中写道:“Mozilla的使命远超过我们任何一人,无法胜任Mozilla的领导职位”。美国作家安德鲁·沙利文在谈到艾克的离职时说“没有一丝证据表明他曾经在Mozilla中歧视过一个同性恋者”,而艾克被迫离职一事“应该让那些对包容和多元化社会感兴趣的人感到厌恶”。

2015年5月28日,艾克成立Brave软件公司,这是一家互联网安全公司,已经从天使投资者募集了250万美元的早期资金。该公司的联合创始人Brian Bondy曾在Mozilla和可汗学院工作。2016年1月20日,该公司发布了Brave网页浏览器。2017年5月,Brave用30秒完成了约3千5百万美元的ICO发售。


最新版本:ECMAScript 2022
2021年7月22日对外试发行。

官方主页:https://ecma-international.org/