JavaScript
编程范型 | 脚本语言,面向对象(基于原型),指令式,函数式 |
---|---|
設計者 | 布蘭登·艾克 |
實作者 | 网景通讯公司,Mozilla基金会 |
发行时间 | 1995年 |
当前版本 | |
型態系統 | 动态类型、duck |
網站 | www |
主要實作產品 | |
V8、JavaScriptCore、SpiderMonkey、Chakra | |
啟發語言 | |
C、Java、Perl、Python、Scheme、Self | |
影響語言 | |
ActionScript、CoffeeScript、Dart、JScript .NET、Objective-J、QML、TIScript、TypeScript | |
|
扩展名 |
.js |
---|---|
互联网媒体类型 |
application/javascript text/javascript (obsolete)[4] |
统一类型标识 | com.netscape.javascript-source[5] |
格式类型 | 脚本语言 |
JavaScript,一种高级编程语言,通过解释执行,是一门动态类型,面向对象(基于原型)的直譯語言[6]。它已经由ECMA(欧洲电脑制造商协会)通过ECMAScript实现语言的标准化[6]。它被世界上的绝大多数网站所使用,也被世界主流浏览器(Chrome、IE、Firefox、Safari、Opera)支持。JavaScript是一门基于原型、函数先行的语言[7],是一门多范式的语言,它支持面向对象编程,命令式编程,以及函数式编程。它提供语法来操控文本、数组、日期以及正则表达式等,不支持I/O,比如网络、存储和图形等,但这些都可以由它的宿主环境提供支持。
虽然JavaScript与Java这门语言不管是在名字上,或是在语法上都有很多相似性,但这两门编程语言从设计之初就有很大的不同,JavaScript的语言设计主要受到了Self(一种基于原型的编程语言)和Scheme(一门函数式编程语言)的影响[7]。在语法结构上它又与C语言有很多相似(例如if条件语句、while循环、switch语句、do-while循环等)[8]。
在客户端,JavaScript在传统意义上被实现为一种解释语言,但在最近,它已经可以被即时编译(JIT)执行。随着最新的HTML5和CSS3语言标准的推行它还可用于游戏、桌面和移动应用程序的开发和在服务器端网络环境运行,如Node.js。
历史
在网景公司的开始
1995年,当时在网景公司就职的布兰登·艾克正为Netscape Navigator 2.0浏览器开发的一门名为LiveScript的脚本语言,后来网景公司与昇阳电脑公司组成的开发联盟为了让这门语言搭上java这个编程语言“热词”,将其临时改名为“JavaScript”,日后这成为大众对这门语言有诸多误解的原因之一。
JavaScript推出后在浏览器上大获成功,微软公司在不久后就为Internet Explorer 3.0浏览器推出了JScript,以与处于市场领导地位的网景产品同台竞争。JScript也是一种JavaScript实现,这两个JavaScript语言版本在浏览器端共存意味着语言标准化的缺失,对这门语言进行标准化被提上了日程,在1997年,由網景、昇陽、微软、寶藍等公司组织及个人组成的技术委员会在ECMA(欧洲计算机制造商协会)确定定义了一种名叫ECMAScript的新脚本语言标准[9],规范名为ECMA-262。JavaScript成为了ECMAScript的实现之一[10]。
完整的JavaScript实现应该包含三个部分,即ECMAScript(语言核心)、DOM(文档对象模型)、BOM(浏览器对象模型)[10]。
标准化
网景在最初將其腳本語言命名為LiveScript,後來網景在與昇陽公司合作之後將其改名為JavaScript[11]。JavaScript最初受Java启发而开始设计的,目的之一就是“看上去像Java”[12],因此语法上有类似之处,一些名称和命名规范也借自Java。但JavaScript的主要设计原则源自Self和Scheme[13]。JavaScript与Java名称上的近似,是当时网景为了营销考虑与太陽電腦达成协议的结果。為了取得技術優勢,微軟推出了JScript來迎戰JavaScript的腳本語言。为了互用性,Ecma国际(前身为欧洲计算机制造商协会)建立了ECMA-262标准(ECMAScript)。现在两者都属于ECMAScript的实现。儘管JavaScript作為給非程式人員的腳本語言,而非作為給程式人員的程式語言來推廣和宣傳,但是JavaScript具有非常豐富的特性。
发展初期,JavaScript的标准并未确定,同期有网景的JavaScript,微软的JScript三足鼎立。1997年,在ECMA(欧洲计算机制造商协会)的协调下,由網景、昇陽、微软、寶藍组成的工作组确定统一标准:ECMA-262。
商標
JavaScript目前為甲骨文公司在美國的注册商标[14][15]。
概論
一般来说,完整的JavaScript包括以下几个部分:
- ECMAScript,描述了该语言的语法和基本对象
- 文档对象模型(DOM),描述处理网页内容的方法和接口
- 浏览器对象模型(BOM),描述与浏览器进行交互的方法和接口
它的基本特点如下:
- 是一种解释性脚本语言(代码不进行预编译)。
- 主要用来向HTML页面添加交互行为。
- 可以直接嵌入HTML页面,但写成单独的js文件有利于结构和行为的分离。
JavaScript常用来完成以下任务:
- 嵌入动态文本于HTML页面
- 对浏览器事件作出响应
- 读写HTML元素
- 在数据被提交到服务器之前验证数据
- 检测访客的浏览器信息
- 控制cookies,包括创建和修改等
特性
不同於伺服器端腳本語言,例如PHP与ASP,JavaScript主要被作为客户端腳本語言在用戶的瀏覽器上運行,不需要伺服器的支持。所以在早期程式設計師比較青睞於JavaScript以減少對伺服器的負擔,而與此同時也帶來另一個問題:安全性。而隨著伺服器的強壯,雖然現在的程序員更喜歡運行於伺服端的腳本以保證安全,但JavaScript仍然以其跨平台、容易上手等優勢大行其道。同时,有些特殊功能(如AJAX)必须依赖JavaScript在客户端进行支持。隨著引擎如V8和框架如Node.js的發展,及其事件驅動及異步IO等特性,JavaScript逐漸被用來編寫伺服器端程式。且在近几年中,Node.js的出世,让JavaScript也具有了一定的服务器功能,且在某些方面比PHP的效果更为显著。
指令式与结构化
JavaScript从支持许多C语言的结构化编程语法(例如if条件语句、while循环、switch语句、do-while循环等)。但作用域是一个例外:JavaScript只支持使用var关键字来定义变量的函数作用域。ECMAScript加入了let关键字来支持块级作用域,意味着JavaScript现在既支持函数作用域又支持块级作用域。正如C语言一样,JavaScript中的表达式和语句是不同的。与C不同,JavaScript支持自动在语句末添加分号。
动态化
正如大部分脚本语言,类型与值而不是与变量关联。例如x变量可以为数值,随后又可被赋值为字符串。JavaScript提供了包括鸭子类型在内的方法来检测变量类型。
Eval()
Eval() 函數可以直接執行一個JavaScript函式。例如:
eval("alert(\"Message\")");
编程
JavaScript是一種腳本語言,其原始碼在發往客户端執行之前不需經過編譯,而是將文本格式的字符代碼發送給瀏覽器由瀏覽器解釋執行。直譯語言的弱點是安全性較差,而且在JavaScript中,如果一條執行不了,那麼下面的語言也無法執行。而其解決辦法就是於使用try{}catch(){}
︰
console.log("a"); //這是正確的
console.log("b"); //這是正確的
console.logg("c"); //这是错误的,并且到这里会停下来
console.log("d"); //這是正確的
console.log("e"); //這是正確的
/*解決辦法*/
try{console.log("a");}catch(e){} //這是正確的
try{console.log("b");}catch(e){} //這是正確的
try{console.logg("c");}catch(e){} //这是错误的,但是到这里不会停下来,而是跳过
try{console.log("d");}catch(e){} //這是正確的
try{console.log("e");}catch(e){} //這是正確的
JavaScript被歸類為直譯語言,因為目前主流的引擎都是每次執行時載入程式碼並解譯。V8是將所有程式碼解譯後再開始執行,其他引擎則是逐行解譯(SpiderMonkey會將解譯過的指令暫存,以提高效能,稱為即時編譯),但由於V8的核心部份多數用JavaScript撰寫(而SpiderMonkey是用C++),因此在不同的測試上,兩者效能互有優劣。
與其相對應的是編譯語言,例如C语言,以編譯語言編寫的程式在執行之前,必須經過編譯,將程式碼編譯為機器碼,再加以執行。
Hello World
以下是一個簡單的JavaScript Hello World︰
<!DOCTYPE HTML>
<html>
<head>
<title>简单的JavaScript Hello World</title>
<script type="text/javascript">
document.write("Hello, world!"); // 在浏览器视窗内直接显示
alert("Hello, world!"); // 弹窗显示
console.log("Hello, world!"); // 在控制台(console)里显示,需要先开启开发工具控制台
</script>
</head>
<body>
HTML内容……
</body>
</html>
或是在瀏覽器的地址栏中使用javascript:
,以互動方式表示:
javascript:alert("Hello world!");
版本
JavaScript最初開發於1996年,被使用於Netscape Navigator網頁瀏覽器。同年微軟在Internet Explorer發布了一個實作。由於商標問題,這項實作被命名為JScript。1997年,JavaScript已經被網景公司提交給ECMA制定為標準,稱之為ECMAScript,標準編號ECMA-262。目前最新版為ECMA-262 5th Edition[16]。目前ECMA-262 4th Edition正在開發的過程中,與其對應的JavaScript的版本為JavaScript 2.0,目前也正在開發過程中。
下列表格的資訊基於多個參考來源[17][18][19][20]:
版本 | 發布日期 | 基於 | Netscape Navigator |
Mozilla Firefox |
Internet Explorer |
Opera | Safari | Google Chrome |
---|---|---|---|---|---|---|---|---|
1.0 | 1996年3月 | 2.0 | 3.0 | |||||
1.1 | 1996年8月 | 3.0 | ||||||
1.2 | 1997年6月 | 4.0 - 4.05 | 3 | |||||
1.3 | 1998年10月 | ECMA-262 1st + 2nd edition | 4.06 - 4.7x | 4.0 | 5[21] | |||
1.4 | Netscape Server |
6 | ||||||
1.5 | 2000年11月 | ECMA-262 3rd edition | 6.0 | 1.0 | 5.5(JScript 5.5) 6(JScript 5.6) 7(JScript 5.7) 8(JScript 5.8) |
7.0 | 3.0-5 | 1.0 - 10.0.666 |
1.6 | 2005年11月 | 1.5 + Array extras + Array and string generics + E4X | 1.5 | |||||
1.7 | 2006年10月 | 1.6 + Pythonic generators + Iterators + Let | 2.0 | 28.0.1500.95 | ||||
1.8 | 2008年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.2 | 2009年6月22日 | 1.8.1 + Minor updates | 3.6 | |||||
1.8.5 | 2010年7月27日 | 1.8.2 + New features for ECMA-262 5th edition compliance | 4.0 |
參見
參考文獻
- ^ ECMAScript® 2024 Language Specification. 2024年6月 [2024年8月30日].
- ^ ECMAScript® 2025 Language Specification. 2024年3月27日 [2024年4月17日].
- ^ Standard ECMA-262. Ecma International. 2015-06-17.
- ^ RFC 4329 互联网档案馆的存檔,存档日期2014-03-16.
- ^ System-Declared Uniform Type Identifiers. Mac OS X Reference Library. Apple Inc. [2010-03-05].
- ^ 6.0 6.1 David, Flanagan. JavaScript: The Definitive Guide 6th. O'Reilly & Associates. ISBN 978-0-596-80552-4.
- ^ 7.0 7.1 ECMAScript Language Overview (PDF): 4. 2007-10-23 [2009-05-03]. (原始内容 (PDF)存档于2010-07-13).
- ^ JavaScript: The World's Most Misunderstood Programming Language. www.crockford.com. [2016-08-17].
- ^ http://www.ecma-international.org/publications/index.html
- ^ 10.0 10.1 Nicholas, Zakas. Professional JavaScript for Web Developers 3rd. Wrox. 2012. ISBN 978-1-118-02669-4.
- ^ Press release announcing JavaScript, "Netscape and Sun announce Javascript", PR Newswire, December 4, 1995
- ^ TechVision: Innovators of the Net: Brendan Eich and JavaScript (HTML). 2009-03-19. (原始内容存档于2008-02-08).
- ^ ECMAScript Language Overview (PDF): p.4. 2007-10-23. (原始内容 (PDF)存档于2010-07-13).
- ^ USPTO Copyright entry #75026640. USPTO.
- ^ Sun Trademarks. Sun Microsystems. [2007-11-08]. (原始内容存档于28 May 2010).
- ^ https://developer.mozilla.org/en/JavaScript/Language_Resources
- ^ New in JavaScript. developer.mozilla.org. 2014 [2016-07-16].
- ^ JavaScript – JScript – ECMAScript version history. Webmasterworld.com. [2009-12-17].
- ^ John Resig. Versions of JavaScript. Ejohn.org. [2009-05-19].
- ^ Version Information (JScript). Msdn.microsoft.com. [2009-12-17].
- ^ What Version of JavaScript.