我曾試著在谷歌上檢索 “ JAVAScript 和 ECMAScript 之間的區別。”
最后我在得到的海量的混淆不清又相互矛盾的結果中徹底絕望了:
“ECMAScript 是標準。”
“JavaScript 是標準。”
“ECMAScript 是規范。”
“JavaScript 是 ECMAScript 標準的實現。”
“ECMAScript 是標準化的 JavaScript。”
“ECMAScript 是一門語言。”
“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 引擎了,例如 V8、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 規范有著顯著的變化和改進。
同義詞:ES6、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 的。
好吧,我知道這聽起來就像是一個人穿越變成了自己的父母一樣——有點矛盾,不過想起來還是挺搞笑的。
結束語
我知道閱讀本文給你帶來了不少歡樂,但是信息量還是很豐富的。我也要再此說再見了。
如果你有什么問題、評論、建議或考慮的話,請一吐為快。
非常感謝閱讀本文!