這篇文章表明瞭我目前對 JavaScript 和 ECMAScript 之間差別的理解。文章適合那些熟悉 JavaScript 但又想更加清楚地瞭解其與 ECMAScript、web 瀏覽器、Babel 等是何種關係的人。你還會額外瞭解到腳本語言、JavaScript 引擎以及 JavaScript 運行時。前端
做者:OSC - 協做翻譯來源:開源中國|2017-11-13 11:31程序員
我曾試着在谷歌上檢索 「 JavaScript 和 ECMAScript 之間的區別。」web
最後我在獲得的海量的混淆不清又相互矛盾的結果中完全絕望了:正則表達式
「ECMAScript 是標準。」編程
「JavaScript 是標準。」瀏覽器
「ECMAScript 是規範。」服務器
「JavaScript 是 ECMAScript 標準的實現。」前端優化
「ECMAScript 是標準化的 JavaScript。」編程語言
「ECMAScript 是一門語言。」ide
「JavaScript 是 ECMAScript 的一個分支。」
「ECMAScript 是 JavaScript。」
忍住,別哭。我強打精神決定作一些痛苦但卻有成果的研究。
這篇文章表明瞭我目前對 JavaScript 和 ECMAScript 之間差別的理解。文章適合那些熟悉 JavaScript 但又想更加清楚地瞭解其與 ECMAScript、web 瀏覽器、Babel 等是何種關係的人。你還會額外瞭解到腳本語言、JavaScript 引擎以及 JavaScript 運行時。
那麼,打起精神來吧。
JavaScript/ECMAScript 詞彙表
下面是一系列的定義,設計的側重點在於一致性和清晰性。定義並不是百分比完整。它們被設計從宏觀的的層面對 JavaScript 和 ECMAScript 之間的聯繫和關係給出了說明。
閒話少敘,讓咱們開始吧。
Ecma International
一個爲科學技術制定標準的組織。
爲了要舉一個「標準」的例子(儘管並不是由 Ecma 所發明),能夠用咱們曾用過的鍵盤來講明。是否是大多數的字母以一樣的順序排列,有一個空格鍵、一個輸入鍵、箭頭鍵,並將數字顯示在最上面的一行?這是因爲大多數鍵盤製造商的鍵盤設計是基於 QWERTY 佈局標準的。
ECMA-262
這是由 Ecma 國際發佈的標準。它包含通用目的的腳本語言的規範。
ECMA-262 是一個相似 QWERTY 的標準,但不一樣於呈現一個鍵盤層的規範,它呈現了被稱爲 ECMAScript 的腳本語言規範。
能夠把 ECMA-262 當作 ECMAScript 的參考數字。
腳本語言
一種專門爲在一種存在的實體或系統上操做而設計的編程語言。
關於如何使編程語言成爲腳本語言的常規想法,請考慮命令「walk」、「run」 和 「jump」。這些操做須要一些東西來驅動,多是一我的、一條狗或一個視頻遊戲角色。若是沒有操做員來執行這些命令,「walk」、「run」 和 「jump」 是沒有意義的。這組操做相似於專一於操縱外部實體的腳本語言。
ECMAScript
The specification defined in ECMA-262 中定義的標準,是用於建立通用目的腳本語言的。
同義詞: ECMAScript 規範
然而ECMA-262是標準的名稱,它表明了腳本語言規範ECMAScript。
ECMAScript提供腳本語言必須遵照的規則、細節和準則,這些纔是其被視爲兼容ECMAScript的判斷標準。
JavaScript
一種通用目的的腳本語言,遵循 ECMAScript 規範。
它是 ECMAScript 語言的一個分支版本。
JavaScript 是我喜歡編程的咖啡味語言(指代 Java 族,譯者注)。ECMAScript 是它所基於的規範。經過閱讀 ECMAScript 規範,你將學會如何建立腳本語言。經過閱讀 JavaScript 文檔,你將學習如何使用腳本語言。
當人們把 JavaScript 稱爲「 ECMAScript 語言的方言」的時候,他們的意思就像談論英語、法語或者中國方言時同樣。一種方言從其母語中衍生出大部分的詞彙和語法,但偏離得值得保留這些差別。
JavaScript 實現了多數 ECMA-262 中描述的 ECMAScript 規範,但存在少數差別。 Mozilla 在此概述了 JavaScript 的非 ECMAScript 語言功能:
JavaScript 引擎
可以理解和執行 JavaScript 代碼的程序或解釋器。
同義詞:JavaScript 解釋器,JavaScript 的實現
JavaScript 引擎一般能夠在 web 瀏覽器中被發現,包括 Chrome 中的 V8 ,火狐中的 SpiderMonkey ,以及 Edge 中的 Chakra 。每款引擎就像是一個用於其應用程序的語言模塊,可讓其支持某種 JavaScript 語言的分支。
JavaScript 引擎對於瀏覽器來講就像是人類對語言的理解同樣。若是咱們從新拿咱們平常行爲中的「走」、「跑」、「跳」來舉例的話,一個 JavaScript 引擎是真正可以理解這些動做是何意義的根本機制。
這個比喻能夠幫咱們解釋一些關於瀏覽器的事情:
瀏覽器性能的差別
兩我的也許會識別「跳」的命令,可是一我的因爲理解和對命令的處理比另外一我的更快些,也許會比另外一我的對命令的反應更快些。相似的是,兩個瀏覽器均可以理解 JavaScript 代碼,可是一個因爲其 JavaScript 引擎實現起來效率更高而運行得更快。
瀏覽器支持的差別
再以即便說一樣語言的人們之間也會有差別爲例。即便許多人講英語,可是一些人也許懂得他人不懂的某些詞、表達式和與語法規則,反之亦然。瀏覽器也是一樣的道理。儘管瀏覽器的 JavaScript 引擎都理解 JavaScript ,可是某些瀏覽器會比其餘的瀏覽器對 JavaScript 理解得更好些。在瀏覽器對 JavaScript 的支持中就存在着這一的差異。
至於說到瀏覽器支持,人們一般會談到 「ECMAScript 兼容性」 而非「 JavaScript 兼容性」,儘管 JavaScript 引擎解析和執行的是 JavaScript 。這個問題提及來有點繞,下面的表格能夠對其做出解釋。
若是你還記得的話,ECMAScript 是一份規定了腳本語言能夠看起來像什麼的規範。發佈一個新的 ECMAScript 版本並不意味着全部現存的 JavaScript 引擎忽然就擁有了這些新功能。這取決於負責那款 JavaScript 引擎的團體或組織是否要更新到最新的 ECMAScript 規範並採用其所帶來的變化。
所以,開發者傾向於問這樣的問題,「這款瀏覽器支持哪一個版本的 ECMAScript ?」或者「這款瀏覽器支持哪些 ECMAScript 功能?」他們想知道是否 Google、Mozilla 和微軟已經開始更新他們瀏覽器的 JavaScript 引擎了,例如 V八、SpiderMonkey 和 Chakra 是否都已經具備最新的 ECMAScript 中的功能了。
ECMASCript 兼容性列表是回答這類問題的絕佳答案參考。
若是新版的 ECMAScript 發佈了,JavaScript 引擎不會一會兒整合全部的更新。他們會逐漸地加入 ECMAScript 功能,這一點從火狐的 JavaScript 變動記錄中可見一斑:
JavaScript 運行時
JavaScript 代碼運行所在的環境,併爲 JavaScript 引擎所解釋。運行時提供了 JavaScript 能夠運行和操做的宿主對象。
同義詞:宿主環境
JavaScript 運行時是在腳本化語言定義中所提到的「已存在的實體或系統」。代碼經過 JavaScript 引擎傳遞,一旦被解析和被理解以後,實體或系統將會執行解釋行爲。一條狗走路,一我的跑步,一個視頻遊戲中的任務跳躍(或如上圖例子中的那樣搞破壞)。
應用程序經過在運行時提供「宿主對象」令其自己可用於 JavaScript 腳本。對於客戶方來講,JavaScript 運行時能夠是 web 瀏覽器,這時如視窗或 HTML 文檔這樣的宿主對象就能夠用於操做了。
你是否曾經使用過視窗或文檔宿主對象呢?視窗和文檔對象並不是真正的核心 JavaScript 語言的一部分。它們是 Web APIs ,即扮演着 JavaScript 宿主環境的瀏覽器所提供的對象。對於服務器端來講,JavaScript 運行時是 Node.js 。服務器相關的宿主對象,如文件系統、處理和請求都在 Node.js 中被提供。
有趣的一點是:不一樣的 JavaScript 運行時能夠分享一樣的 JavaScript 引擎。例如 V8 ,是既爲 Google Chrome 也爲 Node.js 所用的 JavaScript 引擎—兩個大相徑庭的環境。
ECMAScript 6
它是 ECMA-262 標準的第六個版本,其特色是對 ECMAScript 規範有着顯著的變化和改進。
同義詞:ES六、ES2015 和 ECMAScript 2015
這一版的 ECMAScript 將其名字由 ES6 改成了 ES2015 ,這是因爲 Ecma 國際決定每一年都對 ECMAScript 發佈一次。相應地,Ecma 國際也開始基於每一年所發佈的來命名新版本的 ECMAScript 規範。簡而言之, ES6 和 ES2015 是對同一件事情的兩個不一樣的名字。
Babel
一款能夠將 ES6 代碼轉換爲 ES5 代碼的轉譯器。
開發者可使用 ES6 中炫目的新功能,但會爲他們的 web 應用擔憂跨瀏覽器的兼容性問題。在編寫這篇文章的時候,Edge 和 Internet Explorer 並無徹底地支持 ES6 規範中的功能。
有顧慮的開發者可使用 Bable 將 ES6 代碼轉換爲功能同樣的版本,只不過使用的是 ES5 功能。全部主流的瀏覽器都徹底支持 ES5 ,因此他們能夠在運行代碼時不要擔憂任何問題。
一段趣聞
我但願這些關於 JavaScript 和 ECMAScript 的信息對你有用。在咱們結束以前,我想要再分享一點可以讓像我這樣的菜鳥 web 開發者茅塞頓開的信息。
先有雞仍是先有蛋
有一段關於 JavaScript 混淆不清的歷史是它是於1996年被開發出來的。而後在1997年被提交給 ECMA 國際用於標準化工做,這致使了 ECMAScript 的誕生。同時,因爲 JavaScript 與 ECMAScript 規範保持一致,因此能夠說 JavaScript 是根據 ECMAScript 所實現的一個例子。
令咱們感到有趣的是:ECMAScript 是基於 JavaScript 的,而同時 JavaScript 又是基於 ECMAScript 的。
好吧,我知道這聽起來就像是一我的穿越變成了本身的父母同樣——有點矛盾,不過想起來仍是挺搞笑的。
結束語
我知道閱讀本文給你帶來了很多歡樂,可是信息量仍是很豐富的。我也要再此說再見了。
若是你有什麼問題、評論、建議或考慮的話,請一吐爲快。
很是感謝閱讀本文!
【編輯推薦】