JavaScript

{{Infobox programming language
| name = JavaScript
| paradigm = 事件驱动、函数式、指令式
| year = 1995年12月4日[1]
| logo = 🐱
| logo caption = 🦏
| screenshot = JavaScript screenshot.png
| screenshot caption = 🦄JavaScript原始碼與HTML語法
| designer = 创造者布蘭登·艾克及ECMAScript规范的其他关键贡献者
| developer =DAI8DAOXING
| latest release version =1001ECMAScript 2024[2]
| latest release date = 312024年6月年
| latest preview version = ECMAScript 2025[3]
| latest preview date = DAI8DAOXING312024年3月27日年
| typing = 🦔、🦊
| File extensions = {{flatlist|*
.js<DAI8DAOXING/code>*
.mjs<DAI8DAOXING/code>引用错误:
<ref>
标签有衝突或無效的属性。1994年,Mosaic的主要開發人員創立了Netscape公司,並雇用了許多原來的NCSA Mosaic開發者用來開發Netscape Navigator,該公司的目標是取代NCSA Mosaic成為世界第一的網頁瀏覽器。在四個月內,已經佔據了四分之三的瀏覽器市場,並成為1990年代網際網路的主要瀏覽器[4]。
在網路發展的這些年,網頁只能是靜態的,缺乏在瀏覽器中載入網頁後的動態行為能力。公司的創始人馬克·安德森認為HTML需要一種膠水語言,讓網頁設計師和兼職程式設計師可以很容易地使用它來組裝圖片和外掛程式之類的元件,且程式碼可以直接編寫在網頁標記中。1995年,網景招募了布兰登·艾克,目標是把Scheme語言嵌入到Netscape Navigator瀏覽器中[5]。但更早之前,網景已經跟昇阳合作,计划在Netscape Navigator中嵌入Java語言,這時網景內部產生激烈的爭論[6],
網景公司管理層很快決定,最佳的方案是由艾克設計一種新的語言,其語法類似於Java,而不像Scheme或其他現存的腳本語言。為了在其他競爭提案中捍衛JavaScript這個想法,公司需要有一個可以運作的原型。艾克在1995年5月僅花了十天時間就把原型設計出來了[7][8]。最初命名為Mocha,1995年9月在Netscape Navigator 2.0的Beta版中改名為LiveScript,同年12月,Netscape Navigator 2.0 Beta 3中部署時被重新命名為JavaScript[1][9]。當時网景公司与昇阳电脑公司组成的开发联盟为了让这门语言搭上Java这个编程语言“热词”,因此将其临时改名为JavaScript,日后这成为大众对这门语言有诸多误解的原因之一[10]。
微軟採納
微軟公司於1995年首次推出Internet Explorer,引發了與Netscape的瀏覽器大戰。微软對Netscape Navigator直譯器進行了逆向工程,創建了JScript,以與處於市場領導地位的網景產品同台競爭。JScript也是一種JavaScript實作,這兩個JavaScript語言版本在瀏覽器端共存意味著語言標準化的缺失。发展初期,JavaScript的标准并未确定,同期就有网景的JavaScript和微软的JScript。除此之外,微軟也在網頁技術上加入了不少專屬物件,使不少網頁使用非微軟平台及瀏覽器無法正常顯示[11][12]。这導致在瀏覽器大戰期間網頁設計者通常會把「用Netscape可達到最佳效果」或「用IE可達到最佳效果」的標誌放在首頁[11][13]。
标准化
1996年11月,網景正式向ECMA(欧洲计算机制造商协会)提交語言標準。1997年6月,ECMA以JavaScript语言为基础制定了ECMAScript标准规范ECMA-262。JavaScript成為了ECMAScript最著名的實現之一[14]。除此之外,ActionScript和JScript也都是ECMAScript规范的实现语言。儘管JavaScript作為給非程式人員的腳本語言,而非作為給程式人員的程式語言來推廣和宣傳,但是JavaScript具有非常豐富的特性。
概論
一般来说,完整的JavaScript包括以下几个部分:
JavaScript的基本特点如下:
- 是一种解释性脚本语言(代码不进行预编译);
- 主要用来向HTML页面添加交互行为;
- 可以直接嵌入HTML页面,但写成单独的js文件有利于结构和行为的分离。
JavaScript常用来完成以下任务:
- 嵌入动态文本于HTML页面;
- 对浏览器事件作出响应;
- 读写HTML元素;
- 在数据被提交到服务器之前验证数据;
- 检测访客的浏览器信息;
- 控制Cookie,包括创建和修改等;
特性
不同於伺服器端腳本語言(如PHP和ASP),JavaScript主要被作为客户端腳本語言在用戶的瀏覽器上運行,不需要伺服器的支持。所以在早期程式設計師比較青睞於JavaScript以減少對伺服器的負擔,而與此同時在安全性上出现了问题。隨著伺服器變得強大,現在的程序員更喜歡運行於伺服器端的腳本以保證安全,但JavaScript仍然以其跨平台、容易上手等優勢大行其道。同时,有些特殊功能(如AJAX)必须依赖JavaScript在客户端提供支持。隨著引擎(如V8)和框架(如Node.js)的發展,以及事件驅動和異步IO等特性,JavaScript也被逐漸用來編寫伺服器端程式。
以下是ECMAScript通常所实现的特性。
指令式与结构化
JavaScript支持许多C语言的结构化编程语法(如if条件语句、while循环、switch语句和do-while循环等),但作用域是一个例外。JavaScript在过去只支持使用var
关键字来定义变量的函数作用域,但ECMAScript 2015中加入了let
关键字来支持块级作用域[15]。这意味着JavaScript现在既支持函数作用域又支持块级作用域。JavaScript还支持自动在语句末添加分号,允许忽略语句末尾的分号。[16]
弱类型
下列为变量转换为字符串的例子:
类型的隐藏转换是JavaScript受到批评的原因之一,因为隐藏转换增加了规则的复杂度和发生错误的可能性。[21]
JavaScript中的隐式转换[22][23]:
左操作数
操作符
右操作数
结果
[]
(空数组)
+
[]
(空数组)
""
(空字符串)
[]
(空数组)
+
{}
(空对象)
"[object Object]"
(字符串)
false
(布尔值)
+
""
(空字符串)
"false"
(字符串)
"123"
(字符串)
+
1
(数字)
"1231"
(字符串)
"123"
(字符串)
-
1
(数字)
122
(数字)
动态化
类型
JavaScript是动态类型的语言,其类型与值而不是与变量相关联。例如变量可以为数字,随后又可被赋值为字符串。JavaScript提供了包括鸭子类型在内的方法来检测变量类型。
运行时估值
基于原型的面向对象
在JavaScript中,对象是关联数组,通过原型(prototype
,见下)进行扩充。每一个字符串键值提供对象的一个属性的名称,可以通过使用点号(obj.x
)或使用方括号(obj['x']
)这两种效果相同的方式来访问。属性可以在运行时添加、重定义或删除。一个对象的大多数属性(包括来自原型继承链的属性)都可以通过 for...in
循环访问。[25]
原型
JavaScript使用原型,而许多其它面向对象语言使用类用于实现继承。原型使得在JavaScript中模拟基于类的面向对象特征变成可能。[26]
函数作为对象构造器
函数在JavaScript中兼作为对象构造函数。在函数调用前加上new
会创建一个原型的实例,并继承来自构造函数的属性和方法(包括来自Object
原型)。[27]ECMAScript 5提供Object.create
方法,可以显式地创建实例而不是自动从Object
继承。[28]构造函数的prototype
属性决定了用于新对象的内部原型。可以通过修改构造函数的原型的方法来为对象添加新的方法,也可以修改JavaScript的内部对象的原型(如Array
或Object
)。尽管可以这么做,但对Object
原型进行修改并不是好的做法。因为大多数JavaScript对象都会从Object
继承,且不会希望其原型被修改。[29]
函数作为方法
和大多数面向对象的语言不同,在JavaScript中函数定义和方法定义没有明显区别。唯一的区别在于调用时:当函数被作为方法调用时,函数的this
会指向调用此函数的对象。[30]
传统的类定义与使用格式
ECMAScript 2015中加入了对class
和extends
关键字的支持,使得类的定义与继承更类似于其他的面向对象语言,同时也更易使用。[31][32]
函数式
在JavaScript中,函数是一等的,函数也被认为是对象。因此,函数可以有属性和方法,例如call()
和bind
等。[33]嵌套函数指定义于其它函数内部的函数,在外部函数被调用时,嵌套函数会被创建。另外,嵌套函数是一个闭包,在外部函数的作用域(包括常量,局部变量和参数)都成为内部函数状态的一部分,甚至在外部函数执行完毕后,内部函数的状态依然保留[34]。JavaScript同时也支持匿名函数[35]。
其它
运行时环境
JavaScript通常依赖于运行时环境(例如浏览器)来提供对象和方法,脚本可以通过这些对象和方法与环境(例如网页DOM)进行交互。它还依赖于运行时环境来提供包或导入脚本(例如HTML的<script>
元素)的功能。这本身不是语言功能,但在大多数JavaScript实现中很常见。
异步
JavaScript一般来说是单线程的。[36]为了并发地处理事件,JavaScript程序输入或输出时使用事件和回调函数执行。这意味着JavaScript可以在等待数据库查询返回信息之前处理鼠标单击。ECMAScript 2015引入了Promise
用于处理异步事件,其可以使得传统的基于回调的异步代码更加清晰简单。[37][38]
变长参数
JavaScript中函数参数的长度是可变的,在函数内部可以通过arguments
对象访问这些参数。[39]
编程
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++),因此在不同的測試上,兩者效能互有優劣。
範例
以下是一個簡單的JavaScript Hello World︰
<!DOCTYPE HTML>
<html>
<head>
<title>简单的JavaScript Hello World</title>
<script>
document.write("Hello, world!"); // 直接插入页面中
alert("Hello, world!"); // 弹窗显示
console.log("Hello, world!"); // 在控制台(console)里显示,需要先开启开发工具控制台
</script>
</head>
<body>
HTML内容……
</body>
</html>
javascript:alert("Hello world!");
版本
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
Opera
Safari
Google
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 edition
4.06 - 4.7x
4.0
5[44]
1.4
Netscape
Server
6
1.52000年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.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
參見
參考文獻
- ^ 1.0 1.1 Press release announcing JavaScript, "Netscape and Sun announce JavaScript", PR Newswire, December 4, 1995
- ^ ECMAScript® 2024 Language Specification. 2024年6月 [2024年8月30日].
- ^ ECMAScript® 2025 Language Specification. 2024年3月27日 [2024年4月17日].
- ^ Enzer, Larry. The Evolution of the Web Browsers. Monmouth Web Developers. August 31, 2018 [August 31, 2018]. (原始内容存档于2018-08-31).
- ^ Chapter 4. How JavaScript Was Created. [2018-07-14]. (原始内容存档于2020-02-27).
- ^ Severance, Charles. JavaScript: Designing a Language in 10 Days. Computer (IEEE Computer Society). February 2012, 45 (2): 7–8 [23 March 2013]. doi:10.1109/MC.2012.57. (原始内容存档于2015-04-17).
- ^ 引用错误:没有为名为
looklikejava
的参考文献提供内容
- ^ 引用错误:没有为名为
origin
的参考文献提供内容
- ^ TechVision: Innovators of the Net: Brendan Eich and JavaScript. web.archive.org. [2009-03-19]. (原始内容存档于2008-02-08).
- ^ Fin JS, Brendan Eich - CEO of Brave, 2016-06-17 [2018-02-07], (原始内容存档于2020-08-29)
- ^ 11.0 11.1 Champeon, Steve. JavaScript, How Did We Get Here?. oreilly.com. 6 April 2001 [16 July 2016]. (原始内容存档于2016-07-19).
- ^ Microsoft Internet Explorer 3.0 Beta Now Available. microsoft.com. Microsoft. 29 May 1996 [16 July 2016]. (原始内容存档于2020-11-24).
- ^ McCracken, Harry. The Unwelcome Return of "Best Viewed with Internet Explorer". technologizer.com. September 16, 2010 [July 16, 2016]. (原始内容存档于2018-06-23).
- ^ Nicholas, Zakas. Professional JavaScript for Web Developers 3rd. Wrox. 2012. ISBN 978-1-118-02669-4.
- ^ 存档副本. [2020-07-09]. (原始内容存档于2021-01-12).
- ^ 存档副本. [2020-07-09]. (原始内容存档于2020-12-03).
- ^ 存档副本. [2020-07-09]. (原始内容存档于2020-12-14).
- ^ 存档副本. [2020-07-09]. (原始内容存档于2020-11-19).
- ^ 存档副本. [2020-07-09]. (原始内容存档于2021-01-27).
- ^ 存档副本. [2020-07-09]. (原始内容存档于2020-10-31).
- ^ 存档副本. [2020-07-09]. (原始内容存档于2020-08-29).
- ^ 存档副本. [2020-07-09]. (原始内容存档于2020-12-15).
- ^ 存档副本. [2020-07-09]. (原始内容存档于2020-08-29).
- ^ 存档副本. [2020-07-09]. (原始内容存档于2021-02-04).
- ^ 存档副本. [2020-07-09]. (原始内容存档于2020-12-14).
- ^ 存档副本. [2020-07-09]. (原始内容存档于2020-12-04).
- ^ 存档副本. [2020-07-09]. (原始内容存档于2020-12-14).
- ^ 存档副本. [2020-07-09]. (原始内容存档于2020-12-04).
- ^ 存档副本. [2020-07-09]. (原始内容存档于2020-07-16).
- ^ 存档副本. [2020-07-09]. (原始内容存档于2020-07-16).
- ^ 存档副本. [2020-07-09]. (原始内容存档于2020-11-12).
- ^ 存档副本. [2020-07-09]. (原始内容存档于2020-11-19).
- ^ 存档副本. [2020-07-09]. (原始内容存档于2020-11-27).
- ^ 存档副本. [2020-07-09]. (原始内容存档于2020-12-03).
- ^ 存档副本. [2020-07-09]. (原始内容存档于2020-11-24).
- ^ 存档副本. [2020-07-09]. (原始内容存档于2020-11-02).
- ^ 存档副本. [2020-07-09]. (原始内容存档于2020-10-27).
- ^ 存档副本. [2020-07-09]. (原始内容存档于2020-12-01).
- ^ 存档副本. [2020-07-09]. (原始内容存档于2021-01-29).
- ^ New in JavaScript. developer.mozilla.org. 2014 [2016-07-16]. (原始内容存档于2019-03-22).
- ^ JavaScript – JScript – ECMAScript version history. Webmasterworld.com. [2009-12-17]. (原始内容存档于2012-11-10).
- ^ John Resig. Versions of JavaScript. Ejohn.org. [2009-05-19]. (原始内容存档于2017-01-21).
- ^ Version Information (JScript). Msdn.microsoft.com. [2009-12-17]. (原始内容存档于2001-12-07).
- ^ What Version of JavaScript. [2016-08-27]. (原始内容存档于2017-01-09).
外部連結
維基教科書中的相關電子教程:JavaScript