JavaScript - 維基百科,自由的百科全書
文章推薦指數: 80 %
JavaScript是一門基於原型、頭等函式的語言,是一門多範式的語言,它支援物件導向程式設計,指令式編程,以及函式語言程式設計。
它提供語法來操控文字、陣列、日期以及正規 ...
JavaScript
編程語言
語言
監視
編輯
提示:此條目的主題不是Java或JScript。
JavaScript(通常縮寫為JS)是一種進階的、直譯的程式語言[8]。
JavaScript是一門基於原型、頭等函式的語言[9],是一門多範式的語言,它支援物件導向程式設計,指令式編程,以及函式語言程式設計。
它提供語法來操控文字、陣列、日期以及正規表示式等,不支援I/O,比如網路、儲存和圖形等,但這些都可以由它的宿主環境提供支援。
它已經由ECMA(歐洲電腦製造商協會)透過ECMAScript實作語言的標準化[8]。
它被世界上的絕大多數網站所使用,也被世界主流瀏覽器(Chrome、IE、Firefox、Safari、Opera)支援。
JavaScript編程範型事件驅動、函數式、指令式設計者創造者布蘭登·艾克及ECMAScript規範的其他關鍵貢獻者面市時間1995年12月4日,26年前(1995-12-04)[1]穩定版本ECMAScript2019[2]
(2019年6月,3年前(2019-06)
)預覽版本ECMAScript2020
型態系統動態型別、鴨子型別副檔名
.js
.mjs[3]主要實作產品V8、JavaScriptCore、SpiderMonkey、Chakra啟發語言AWK[4]、C、HyperTalk(英語:HyperTalk)、Java[5]、Lua、Perl、Python、Scheme、Self影響語言ActionScript、AtScript(英語:AtScript)、CoffeeScript、Dart、JScript.NET、LiveScript(英語:LiveScript)、Objective-J(英語:Objective-J)、Opa(英語:Opa_(programming_language))、QML、Raku、TypeScript
維基教科書中有關JavaScript的文字JavaScript副檔名.js網路媒體型式application/javascripttext/javascript(obsolete)[6]統一類型標識com.netscape.javascript-source[7]格式類型程式語言JavaScript與Java在名字或語法上都有很多相似性,但這兩門程式語言從設計之初就有很大的不同,JavaScript的語言設計主要受到了Self(一種原型程式設計語言)和Scheme(一門函式語言程式設計語言)的影響[9]。
在語法結構上它又與C語言有很多相似(例如if條件語句、switch語句、while迴圈、do-while迴圈等)[10]。
在客戶端,JavaScript在傳統意義上被實作為一種解釋語言,但在最近[何時?],它已經可以被即時編譯(JIT)執行。
隨著最新的HTML5和CSS3語言標準的推行它還可用於遊戲、桌面和行動應用程式的開發和在伺服器端網路環境執行
如Node.js。
目次
1歷史
1.1肇始於網景
1.2微軟採納
1.3標準化
2概論
3特性
3.1指令式與結構化
3.2弱型別
3.3動態化
3.3.1類型
3.3.2執行時估值
3.4基於原型的物件導向
3.4.1原型
3.4.2函式作為物件構造器
3.4.3函式作為方法
3.4.4傳統的類別定義與使用格式
3.5函數式
3.6其它
3.6.1執行時環境
3.6.2非同步
3.6.3變長參數
4編程
5範例
6版本
7參見
8參考文獻
9外部連結
歷史編輯
肇始於網景編輯
1993年,國家超級電腦應用中心(NCSA)發表了NCSAMosaic,這是最早流行的圖形介面網頁瀏覽器,它在全球資訊網的普及上發揮了重要作用[11]。
1994年,Mosaic的主要開發人員隨即創立了Netscape公司,並雇用了許多原來的NCSAMosaic開發者用來開發NetscapeNavigator,該公司的目標是取代NCSAMosaic成為世界第一的網頁瀏覽器。
在四個月內,已經佔據了四分之三的瀏覽器市場,並成為1990年代網際網路的主要瀏覽器[12]。
網景預見到網路需要變得更動態。
公司的創始人馬克·安德森認為HTML需要一種膠水語言,讓網頁設計師和兼職程式設計師可以很容易地使用它來組裝圖片和外掛程式之類的元件,且程式碼可以直接編寫在網頁標記中。
1995年,網景招募了布蘭登·艾克,目標是把Scheme語言嵌入到NetscapeNavigator瀏覽器當中[13]。
但更早之前,網景已經跟昇陽合作在NetscapeNavigator中支援Java,這時網景內部產生激烈的爭論[14]。
後來網景決定發明一種與Java搭配使用的輔助手稿語言並且語法上有些類似[15],這個決策導致排除了採用現有的語言,例如Perl、Python、Tcl或Scheme。
為了在其他競爭提案中捍衛JavaScript這個想法,公司需要有一個可以運作的原型。
艾克在1995年5月僅花了十天時間就把原型設計出來了。
最初命名為Mocha,1995年9月在NetscapeNavigator2.0的Beta版中改名為LiveScript,同年12月,NetscapeNavigator2.0Beta3中部署時被重新命名為JavaScript[1][16],當時網景公司與昇陽電腦公司組成的開發聯盟為了讓這門語言搭上Java這個程式語言「熱詞」,因此將其臨時改名為JavaScript,日後這成為大眾對這門語言有諸多誤解的原因之一[17]。
微軟採納編輯
微軟公司於1995年首次推出InternetExplorer,從而引發了與Netscape的瀏覽器大戰。
微軟對NetscapeNavigator直譯器進行了逆向工程,建立了JScript,以與處於市場領導地位的網景產品同台競爭。
JScript也是一種JavaScript實作,這兩個JavaScript語言版本在瀏覽器端共存意味著語言標準化的缺失,發展初期,JavaScript的標準並未確定,同期有網景的JavaScript,微軟的JScript雙峰並峙。
除此之外,微軟也在網頁技術上加入了不少專屬物件,使不少網頁使用非微軟平台及瀏覽器無法正常顯示[18][19],導致在瀏覽器大戰期間網頁設計者通常會把「用Netscape可達到最佳效果」或「用IE可達到最佳效果」的標誌放在首頁[18][20]。
標準化編輯
1996年11月,網景正式向ECMA(歐洲電腦製造商協會)提交語言標準。
1997年6月,ECMA以JavaScript語言為基礎制定了ECMAScript標準規範ECMA-262。
JavaScript成為了ECMAScript最著名的實現之一[21]。
除此之外,ActionScript和JScript也都是ECMAScript規範的實作語言。
儘管JavaScript作為給非程式人員的手稿語言,而非作為給程式人員的程式語言來推廣和宣傳,但是JavaScript具有非常豐富的特性。
概論編輯
一般來說,完整的JavaScript包括以下幾個部分:
ECMAScript,描述了該語言的語法和基本物件
文件物件模型(DOM),描述處理網頁內容的方法和介面
瀏覽器物件模型(BOM),描述與瀏覽器進行互動的方法和介面JavaScript的基本特點如下:
是一種解釋性程式語言(代碼不進行預編譯)。
主要用來向HTML頁面添加互動行為。
可以直接嵌入HTML頁面,但寫成單獨的js檔案有利於結構和行為的分離。
JavaScript常用來完成以下任務:
嵌入動態文字於HTML頁面
對瀏覽器事件作出回應
讀寫HTML元素
在資料被提交到伺服器之前驗證資料
檢測訪客的瀏覽器資訊
控制cookie,包括建立和修改等特性編輯
不同於伺服器端手稿語言,例如PHP與ASP,JavaScript主要被作為客戶端手稿語言在使用者的瀏覽器上運行,不需要伺服器的支援。
所以在早期程式設計師比較青睞於JavaScript以減少對伺服器的負擔,而與此同時也帶來另一個問題:安全性。
而隨著伺服器變得強大,現在的程式員更喜歡運行於伺服器端的指令碼以保證安全,但JavaScript仍然以其跨平台、容易上手等優勢大行其道。
同時,有些特殊功能(如AJAX)必須依賴JavaScript在客戶端進行支援。
隨著引擎如V8和框架如Node.js的發展,及其事件驅動及異步IO等特性,JavaScript逐漸被用來編寫伺服器端程式。
且在近幾年[何時?]中,Node.js的出世,讓JavaScript也具有了一定的伺服器功能。
以下是ECMAScript通常實作所共有的特性。
指令式與結構化編輯
JavaScript從支援許多C語言的結構化編程語法(例如if條件語句、while迴圈、switch語句、do-while迴圈等)。
但作用域是一個例外:JavaScript在過去只支援使用var關鍵字來定義變數的函式作用域。
ECMAScript2015加入了let關鍵字來支援塊級作用域[22]。
意味著JavaScript現在既支援函式作用域又支援塊級作用域。
和C語言一樣,JavaScript中的表達式和語句是不同的。
有一點格式上的不同,JavaScript支援自動在語句末添加分號,因此允許忽略語句末尾的分號。
[23]
弱型別編輯
Javascript是弱型別的,這意味著變數可以被隱式地轉換為另一個類型。
[24]
二元運算子+會把兩個運算元轉換為字串,除非兩個運算元都為數字類型。
[25]這是因為+也表示字串連接操作。
二元運算子-會把兩個運算元轉換為數字類型。
[26]
一元運算子,包括+和-,都會把運算元轉換為數字。
下列為變數轉換為字串的例子:
字串類型不變。
數字會轉換為其字串表示。
陣列的元素會轉換為字串,然後連接成透過逗號,分隔的長字串。
其它物件會轉換為[objectObject],其中Object中該物件的建構函式名。
[27]類型的隱藏轉換,是JavaScript受到批評的原因之一,因為其增加了規則的複雜度與發生錯誤的可能性。
[28]
JavaScript中詭異的隱式轉換[29][30]:
左運算元
運算子
右運算元
結果
[](空陣列)
+
[](空陣列)
""(空字串)
[](空陣列)
+
{}(空物件)
"[objectObject]"(字串)
false(布林值)
+
[](空字串)
"false"(字串)
"123"(字串)
+
1(數字)
"1231"(字串)
"123"(字串)
-
1(數字)
122(數字)
動態化編輯
類型編輯
JavaScript是動態型別的,正如大部分程式語言,其類型與值而不是與變數關聯。
例如變數可以為數值,隨後又可被賦值為字串。
JavaScript提供了包括鴨子型別在內的方法來檢測變數類型。
執行時估值編輯
Javascript提供eval()函式,可以在執行時直接執行Javascript語句。
[31]
基於原型的物件導向編輯
在JavaScript中,物件是關聯陣列,透過原型(prototype,見下)進行擴充。
每一個字串鍵值提供物件的一個屬性的名稱。
可以透過兩種效果相同的方式進行存取:使用點號(obj.x)或使用方括號(obj['x'])。
屬性可以在執行時添加、重定義或刪除。
一個物件大多數屬性(包括來自原型繼承鏈的屬性)都可以透過for...in迴圈存取。
[32]
原型編輯
JavaScript使用原型,而許多其它物件導向語言使用類用於實作繼承。
有了原型,使得在JavaScript中類比類別為基的物件導向特徵變成可能。
[33]
函式作為物件構造器編輯
函式在JavaScript中兼作為物件建構函式。
在函式呼叫前加上new會建立一個原型的實例,並繼承來自建構函式的屬性和方法(包括來自Object原型)。
[34]ECMAScript5提供Object.create方法,可以顯式地建立實例還不是自動從Object繼承。
[35]建構函式的prototype屬性決定了用於新物件的內部原型。
可以透過修改建構函式的原型的方法來為物件添加新的方法。
也可以修改JavaScript的內部物件的原型,如Array或Object。
儘管可以這麼做,但對Object原型進行修改並不是一個好的做法。
因為大多數JavaScript物件都會從Object繼承,且不會希望其原型做了修改。
[36]
函式作為方法編輯
與大多數而向物件的語言不同,在JavaScript中函式定義與方法定義沒有明顯的區別。
唯一的區別在於呼叫時:當函式被作為方法呼叫時,函式的this會指向呼叫此函式的物件。
[37]
傳統的類別定義與使用格式編輯
ECMAScriptES6加入了對class、extends關鍵字的支援,使得類的定義與繼承行為更加類似於其它物件導向語言,同時也更加容易使用。
[38][39]
函數式編輯
在JavaScript中,函式是一等的,函式也被認為是物件。
因此,函式也可以有屬性與方法,例如call()和bind等。
[40]巢狀函式指定義於其它函式內部的函式,在外部函式被呼叫時,巢狀函式會被建立。
另外,巢狀函式是一個閉包,在外部函式的作用域(包括常數,局部變數和參數)都成為內部函式狀態的一部分,甚至在外部函式執行完畢後,內部函式的狀態依然保留。
[41]JavaScript同時也支援匿名函式。
[42]
其它編輯
執行時環境編輯
JavaScript通常依賴於執行時環境(例如瀏覽器)來提供物件和方法,指令碼可以透過這些物件和方法與環境(例如網頁DOM)進行互動。
它還依賴於執行時環境來提供包含/匯入指令碼(例如HTML的
或是在瀏覽器的網址列中使用javascript:,以互動方式表示:
javascript:alert("Helloworld!");
版本編輯
參見:ECMAScript§ 版本
JavaScript最初開發於1996年,被使用於NetscapeNavigator網頁瀏覽器。
同年微軟在InternetExplorer發布了一個實作。
由於商標問題,這項實作被命名為JScript。
1997年,JavaScript已經被網景公司提交給ECMA制定為標準,稱之為ECMAScript,標準編號ECMA-262。
使用顯式版本號聲明對語言的參照,作爲一項Mozilla的特性,已在較新版本中被移除(至少為Firefox59)。
Firefox4是最後一個需要顯式地在參照時聲明明確版本號的版本(1.8.5)。
下列表格的資訊基於多個參考來源[47][48][49][50]:
版本
發布日期
基於
NetscapeNavigator
MozillaFirefox
InternetExplorer
Opera
Safari
GoogleChrome
舊版本,不再支援: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-2621st+2ndedition
4.06-4.7x
4.0
5[51]
舊版本,不再支援:1.4
NetscapeServer
6
舊版本,不再支援:1.5
2000年11月
ECMA-2623rdedition
6.0
1.0
5.5(JScript5.5)6(JScript5.6)7(JScript5.7)8(JScript5.8)
7.0
3.0-5
1.0-10.0.666
舊版本,不再支援:1.6
2005年11月
1.5+Arrayextras+Arrayandstringgenerics+E4X
1.5
舊版本,不再支援:1.7
2006年10月
1.6+Pythonicgenerators(頁面存檔備份,存於網際網路檔案館)+Iterators+Let
2.0
28.0.1500.95
舊版本,不再支援:1.8
2008年6月
1.7+Generatorexpressions+Expressionclosures
3.0
11.50
舊版本,不再支援:1.8.1
1.8+nativeJSONsupport+Minorupdates
3.5
舊版本,不再支援:1.8.2
2009年6月22日
1.8.1+Minorupdates
3.6
舊版本,不再支援:1.8.5
2010年7月27日
1.8.2+NewfeaturesforECMA-2625theditioncompliance
4.0
參見編輯
電腦程式設計主題
手稿語言
DMDScript
ECMAScript
JavaScript引擎
JScript
AJAX
JavaScript函式庫參考文獻編輯
^1.01.1PressreleaseannouncingJavaScript,"NetscapeandSunannounceJavaScript",PRNewswire,December4,1995
^StandardECMA-262.EcmaInternational.2017-07-03[2020-02-16].(原始內容存檔於2008-09-18).
^nodejs/node-eps.GitHub.[2020-02-16].(原始內容存檔於2020-08-29).
^BrendanEich:AnIntroductiontoJavaScript,JSConf2010:22m.[November25,2019].(原始內容存檔於2020-08-29).
^"CodersatWork:ReflectionsontheCraftofProgramming".[December25,2018].(原始內容存檔於2020-09-23).
^RFC4329.[2012-03-02].(原始內容存檔於2014-03-16).
^System-DeclaredUniformTypeIdentifiers.MacOSXReferenceLibrary.AppleInc.[2010-03-05].(原始內容存檔於2018-12-25).
^8.08.1David,Flanagan.JavaScript:TheDefinitiveGuide6th.O'Reilly&Associates.ISBN 978-0-596-80552-4.
^9.09.1ECMAScriptLanguageOverview(PDF):4.2007-10-23[2009-05-03].(原始內容(PDF)存檔於2009-03-26).
^JavaScript:TheWorld'sMostMisunderstoodProgrammingLanguage.www.crockford.com.[2016-08-17].(原始內容存檔於2020-12-07).
^BloombergGameChangers:MarcAndreessen.Bloomberg.March17,2011[December7,2011].(原始內容存檔於2012-05-16).
^Enzer,Larry.TheEvolutionoftheWebBrowsers.MonmouthWebDevelopers.August31,2018[August31,2018].(原始內容存檔於2018-08-31).
^Chapter4.HowJavaScriptWasCreated.[2018-07-14].(原始內容存檔於2020-02-27).
^Severance,Charles.JavaScript:DesigningaLanguagein10Days.Computer(IEEEComputerSociety).February2012,45(2):7–8[23March2013].doi:10.1109/MC.2012.57.(原始內容存檔於2015-04-17).
^TechVision:InnovatorsoftheNet:BrendanEichandJavaScript.2009-03-19[2009-03-19].(原始內容(HTML)存檔於2008-02-08).
^TechVision:InnovatorsoftheNet:BrendanEichandJavaScript.web.archive.org.[2009-03-19].(原始內容存檔於2008-02-08).
^FinJS,BrendanEich-CEOofBrave,2016-06-17[2018-02-07],(原始內容存檔於2020-08-29)
^18.018.1Champeon,Steve.JavaScript,HowDidWeGetHere?.oreilly.com.6April2001[16July2016].(原始內容存檔於2016-07-19).
^MicrosoftInternetExplorer3.0BetaNowAvailable.microsoft.com.Microsoft.29May1996[16July2016].(原始內容存檔於2020-11-24).
^McCracken,Harry.TheUnwelcomeReturnof"BestViewedwithInternetExplorer".technologizer.com.September16,2010[July16,2016].(原始內容存檔於2018-06-23).
^Nicholas,Zakas.ProfessionalJavaScriptforWebDevelopers3rd.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).
^NewinJavaScript.developer.mozilla.org.2014[2016-07-16].(原始內容存檔於2019-03-22).
^JavaScript–JScript–ECMAScriptversionhistory.Webmasterworld.com.[2009-12-17].(原始內容存檔於2012-11-10).
^JohnResig.VersionsofJavaScript.Ejohn.org.[2009-05-19].(原始內容存檔於2017-01-21).
^VersionInformation(JScript).Msdn.microsoft.com.[2009-12-17].(原始內容存檔於2001-12-07).
^WhatVersionofJavaScript.[2016-08-27].(原始內容存檔於2017-01-09).
外部連結編輯
維基教科書中的相關電子教學:JavaScript關於JavaScript介紹(頁面存檔備份,存於網際網路檔案館)MozillaDeveloperNetwork上的資源
取自「https://zh.wikipedia.org/w/index.php?title=JavaScript&oldid=71626280」
延伸文章資訊
- 1JavaScript 是什麼? - 學習該如何開發Web | MDN
JavaScript 是一種腳本,也能稱它為程式語言,可以讓你在網頁中實現出複雜的功能。當網頁不只呈現靜態的內容,另外提供了像是:內容即時更新、地圖交動、 ...
- 2啟用瀏覽器的JavaScript
啟用瀏覽器的JavaScript. 在Windows 中的Internet Explorer 上啟用JavaScript. 在瀏覽器上,按下「工具」,然後按下「網際網路選項」。
- 3JavaScript - MDN Web Docs
JavaScript (簡稱JS) 是具有一級函數(First-class functions) 的輕量級、直譯式或即時編譯(JIT-compiled)的程式語言。它因為用作網頁的腳本語言而大 ...
- 4JavaScript - 維基百科,自由的百科全書
JavaScript是一門基於原型、頭等函式的語言,是一門多範式的語言,它支援物件導向程式設計,指令式編程,以及函式語言程式設計。它提供語法來操控文字、陣列、日期以及正規 ...
- 5Javascript教學課程(入門篇) - 12個章節- 由淺入深學習Javascript
第1章Javascript 基本概念. 當大家學習了HTML及CSS的語言後,現在終於來到Frontend最後一個要學習的語言,就是Javascript ...