JS紅寶書筆記——第一章 JavaScript簡介

s發表於2020-09-14

1.JavaScript簡史

  • Netscape公司決定開發一種客戶端語言用來處理瀏覽器端簡單的表單驗證。
  • Netscape公司派布蘭登·艾奇(BrendanEich)為計劃於1995年2月釋出的Netscape Navigator 2開發一種叫LiveScript的指令碼語言,該語言將同時在瀏覽器和伺服器中使用(在伺服器上的名字叫LiveWire)。
  • Netscape Navigator 2正式釋出前夕,Netscape為了搭上媒體熱炒Java的順風車,臨時把LiveScript改名為JavaScript。
  • JavaScript 1.0獲得了巨大成功,Netscape隨即在Netscape Navigator 3中又釋出了JavaScript 1.1。
  • Netscape Navigator 3釋出後不久,微軟就在其Internet Explorer 3中加入了名為JScript的JavaScript實現(命名為JScript是為了避開與Netscape有關的授權問題)。
  • JavaScript有了兩個不同的實現,JavaScript的標準化問題被提上了議事日程。
  • 1997年,以JavaScript 1.1為藍本的建議被提交給了歐洲計算機制造商協會(ECMA,European Computer Manufacturers Association)。該協會指定39號技術委員會(TC39, Technical Committee #39)負責“標準化一種通用、跨平臺、供應商中立的指令碼語言的語法和語義”。
  • 數月後,TC39完成了ECMA-262(定義一種名為ECMAScript的新指令碼語言的標準)。
  • 第二年,ISO/IEC(International Organization for Standardization andInternationalElectrotechnical Commission,國標標準化組織和國際電工委員會)也採用了ECMAScript作為標準(即ISO/IEC-16262)。

2.JavaScript實現

JavaScript和ECMAScript通常都被人們用來表達相同的含義,但JavaScript的含義卻比ECMA-262中規定的要多得多。一個完整的JavaScript實現應該由核心(ECMAScript)、文件物件模型(DOM)、瀏覽器物件模型(BOM)三個不同的部分組成。

2.1 ECMAScript

ECMA-262定義的ECMAScript與Web瀏覽器沒有依賴關係。ECMA-262定義的只是這門語言的基礎,而在此基礎之上可以構建更完善的指令碼語言。Web瀏覽器只是ECMAScript實現可能的宿主環境之一。宿主環境不僅提供基本的ECMAScript實現,同時也會提供該語言的擴充套件,以便語言與環境之間對接互動。而這些擴充套件則利用ECMAScript的核心型別和語法提供更多更具體的功能,以便實現針對環境的操作。

ECMA-262標準規定了這門語言的語法、型別、語句、關鍵字、保留字、操作符、物件。

ECMAScript就是對實現該標準規定的各個方面內容的語言的描述。

2.1.1 ECMAScript的版本

ECMA-262的第1版本質上與Netscape的JavaScript 1.1相同,只不過刪除了所有針對瀏覽器的程式碼,並作了一些較小的改動。ECMA-262要求支援Unicode標準,而且物件也變成了平臺無關的。這也是JavaScript 1.1和1.2與ECMA-262第1版不一致的主要原因。

ECMA-262第2版主要是編輯加工的結果。這一版中內容的更新是為了與ISO/IEC-16262保持嚴格一致,沒有作任何新增、修改或刪節處理。一般不使用第2版來衡量ECMAScript實現的相容性。

ECMA-262第3版才是對該標準第一次真正的修改。修改的內容涉及字串處理、錯誤定義和數值輸出,還新增了對正規表示式、新控制語句、try-catch異常處理的支援,並圍繞標準的國際化做出了一些小的修改。第3版標誌著ECMAScript成為了一門真正的程式語言。

ECMA-262第4版對這門語言進行了一次全面的檢核修訂。第4版不僅包含了強型別變數、新語句和新資料結構、真正的類和經典繼承,還定義了與資料互動的新方式。第四版幾乎在第3版基礎上完全定義了一門新語言。

TC39下屬的一個小組認為第4版給這門語言帶來的跨越太大了,因此該小組提出了一個名為ECMAScript 3.1的替代性建議,該建議只對這門語言進行了較少的改進,能夠在現有JavaScript引擎基礎上實現。最終,ES3.1附屬委員會獲得的支援超過了TC39, ECMA-262第4版在正式釋出前被放棄(這就是為什麼沒有ES4的原因)。

ECMAScript 3.1成為ECMA-262第5版,於2009年12月3日正式釋出。第5版澄清了第3版中已知的歧義並增添了新的功能包括原生JSON物件、繼承的方法和高階屬性定義,另外還包含一種嚴格模式,對ECMAScript引擎解釋和執行程式碼進行了補充說明。

2.1.2 什麼是ECMAScript相容

ECMA-262給出了ECMAScript相容的定義。要成為ECMAScript的實現,則該實現必須做到:

  • 支援ECMA-262描述的所有“型別、值、物件、屬性、函式以及程式句法和語義”。
  • 支援Unicode字元標準。

此外,相容的實現還可以進行下列擴充套件。

  • 新增ECMA-262沒有描述的“更多型別、值、物件、屬性和函式”(ECMA-262所說的這些新增特性主要是指該標準中沒有規定的新物件和物件的新屬性)。
  • 支援ECMA-262沒有定義的“程式和正規表示式語法”(也就是說,可以修改和擴充套件內建的正規表示式語法)。

2.1.3 Web瀏覽器對ECMAScript的支援

  • 1996年,Netscape Navigator 3捆綁釋出了JavaScript 1.1。而相同的JavaScript1.1設計規範隨後作為對新標準(ECMA-262)的建議被提交給Ecma。Ecma這時還沒有接受Netscape的建議。
  • Netscape Navigator 3釋出後不久,微軟也推出了Internet Explorer 3。微軟在IE的這一版中捆綁了JScript 1.0。
  • 1997年,內建JavaScript 1.2的Netscape Navigator 4釋出。而這年年底,ECMA-262第1版也被接受並實現了標準化。所以,JavaScript 1.2與ECMAScript的第1版並不相容。
  • JScript的升級版是Internet Explorer 4中內建的JScript 3.0。微軟通過媒體大肆宣傳JScript 3.0是世界上第一個ECMA相容的指令碼語言,但當時的ECMA-262尚未定稿(虛假宣傳,狗頭)。
  • Netscape在Navigator 4.06中釋出JavaScript 1.3,做到了與ECMA-262的第一個版本完全相容。在JavaScript1.3中,Netscape增加了對Unicode標準的支援,並在保留JavaScript 1.2新增特性的同時實現了所有物件的平臺中立化。
  • 在Netscape以Mozilla專案的名義開放其原始碼時,預期JavaScript 1.4將隨同Netscape Navigator 5一道釋出,然而原計劃被打亂。最終,JavaScript 1.4只發布了伺服器版,而沒有內建於Web瀏覽器中。
  • 到了2008年,五大主流Web瀏覽器(IE、Firefox、Safari、Chrome和Opera)全部做到了與ECMA-262相容。

2.2 文件物件模型(DOM)

文件物件模型(DOM, Document Object Model)是針對XML但經過擴充套件用於HTML的應用程式程式設計介面。DOM把整個頁面對映為一個多層節點結構。HTML或XML頁面中的每個組成部分都是某種型別的節點,這些節點又包含著不同型別的資料。通過DOM,開發人員可以控制頁面內容和結構,輕鬆自如地刪除、新增、替換或修改任何節點。

2.2.1 為什麼要使用DOM

在Internet Explorer 4和Netscape Navigator 4分別支援不同形式的DHTML(Dynamic HTML)基礎上,開發人員首次無需重新載入網頁,就可以修改其外觀和內容了。但由於Netscape和微軟在開發DHTML方面各持己見,過去那個只編寫一個HTML頁面就能夠在任何瀏覽器中執行的時代結束了,要繼續保持Web跨平臺的特性,就必須額外多做一些工作。為防止出現瀏覽器互不相容的局面,負責制定Web通訊標準的W3C(World WideWebConsortium,全球資訊網聯盟)開始著手規劃DOM。

2.2.2 DOM級別

DOM1級(DOM Level 1)於1998年10月成為W3C的推薦標準。DOM1級由兩個模組組成:DOM核心(DOM Core)和DOM HTML。

  • DOM核心規定的是如何對映基於XML的文件結構,以便簡化對文件中任意部分的訪問和操作。
  • DOM HTML模組則在DOM核心的基礎上加以擴充套件,新增了針對HTML的物件和方法。

DOM並不只是針對JavaScript的,很多別的語言也都實現了DOM。

DOM2級在原來DOM的基礎上又擴充了以下模組:

  • DOM檢視(DOM Views):定義了跟蹤不同文件(例如,應用CSS之前和之後的文件)檢視的介面。
  • DOM事件(DOM Events):定義了事件和事件處理的介面。
  • DOM樣式(DOM Style):定義了基於CSS為元素應用樣式的介面。
  • DOM遍歷和範圍(DOM Traversal and Range):定義了遍歷和操作文件樹的介面。

DOM1級中的DOM核心模組也經過擴充套件開始支援XML名稱空間。

DOM3級進一步擴充套件了DOM,引入了以統一方式載入和儲存文件的方法(在DOM載入和儲存模組中定義),新增了驗證文件的方法(在DOM驗證模組中定義)。DOM3級也對DOM核心進行了擴充套件,開始支援XML 1.0規範,涉及XML Infoset、XPath和XMLBase。

DOM0級標準是不存在的。所謂DOM0級只是DOM歷史座標中的一個參照點而已。具體點說,DOM0級指的是Internet Explorer 4.0和Netscape Navigator4.0最初支援的DHTML。

2.2.3 其它DOM標準

除了DOM核心和DOM HTML介面之外,另外幾種語言還發布了只針對自己的DOM標準。例如,SVG、MathML、SMIL,它們都是基於XML的,每種語言的DOM標準都新增了與特定語言相關的新方法和新介面。

2.2.4 Web瀏覽器對DOM的支援

在DOM標準出現了一段時間之後,Web瀏覽器才開始實現它。

微軟在IE5中首次嘗試實現DOM,但直到IE5.5才算是真正支援DOM1級。Netscape直到Netscape 6(Mozilla 0.6.0)才開始支援DOM。在Netscape 7之後,Mozilla把開發重心轉向了Firefox瀏覽器。Mozilla開發團隊的目標是構建與標準100%相容的瀏覽器。

目前,支援DOM已經成為瀏覽器開發商的首要目標,主流瀏覽器每次釋出新版本都會改進對DOM的支援。

2.3 瀏覽器物件模型(BOM)

開發人員使用BOM可以控制瀏覽器顯示的頁面以外的部分,但它作為JavaScript實現的一部分卻沒有相關的標準。這個問題在HTML5中得到了解決,HTML5致力於把很多BOM功能寫入正式規範。HTML5釋出後,很多關於BOM的困惑煙消雲散。

從根本上講,BOM只處理瀏覽器視窗和框架,但人們習慣上也把所有針對瀏覽器的JavaScript擴充套件算作BOM的一部分,比如,navigator物件、location物件、screen物件、XMLHttpRequest和IE的ActiveXObject這樣的自定義物件。

3.JavaScript版本

Mozilla公司是目前唯一還在沿用最初的JavaScript版本編號序列(像1.1、1.2、1.5、1.8.1這樣子的命名方式)的瀏覽器開發商。

大多數瀏覽器在提及對JavaScript的支援情況時,一般都以ECMAScript相容性和對DOM的支援情況為準。

小結

JavaScript是一種專為與網頁互動而設計的指令碼語言,由以下三個部分組成:

  • ECMAScript,由ECMA-262定義,提供核心語言功能。
  • 文件物件模型(DOM),提供訪問和操作網頁內容的方法和介面。
  • 瀏覽器物件模型(BOM),提供與瀏覽器互動的方法和介面。

JavaScript的這三個組成部分,在當前五個主要瀏覽器(IE、Firefox、Chrome、Safari和Opera)中都得到了不同程度的支援。其中,所有瀏覽器對ECMAScript第3版的支援大體上都還不錯,而對ECMAScript 5的支援程度越來越高(現在應該差不多都支援了吧),但對DOM的支援則彼此相差比較多(IE出來捱打)。對已經正式納入HTML5標準的BOM來說,儘管各瀏覽器都實現了某些眾所周知的共同特性,但其他特性還是會因瀏覽器而異。

相關文章