我曾試著在谷歌上檢索 “ 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 。這個問題說起來有點繞,下面的表格可以對其作出解釋。
實現 | 應用程式 | |
---|---|---|
SpiderMonkey | Firefox,Gecko佈局引擎,Adobe Acrobat | 2017 |
V8 | Google Chrome,Node.js,Opera,MarkLogic | 2016 |
JavaScriptCore(Nitro) | WebKit,Safari,Qt 5 | 2017 |
Chakra | Microsoft Edge | 5.1 |
如果你還記得的話,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 的。
好吧,我知道這聽起來就像是一個人穿越變成了自己的父母一樣——有點矛盾,不過想起來還是挺搞笑的。
結束語
我知道閱讀本文給你帶來了不少歡樂,但是資訊量還是很豐富的。我也要再此說再見了。
如果你有什麼問題、評論、建議或考慮的話,請一吐為快。
非常感謝閱讀本文!