一文讀懂 JavaScript 和 ECMAScript 的區別

發表於2017-11-11

我曾試著在谷歌上檢索 “ 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

一個為科學技術制定標準的組織。

一文讀懂 JavaScript 和 ECMAScript 的區別

為了要舉一個“標準”的例子(儘管並非由 Ecma 所發明),可以用我們曾用過的鍵盤來說明。是不是大多數的字母以同樣的順序排列,有一個空格鍵、一個輸入鍵、箭頭鍵,並將數字顯示在最上面的一行?這是由於大多數鍵盤製造商的鍵盤設計是基於 QWERTY 佈局標準的。

ECMA-262

這是由 Ecma 國際釋出的標準。它包含通用目的的指令碼語言的規範。

一文讀懂 JavaScript 和 ECMAScript 的區別

ECMA-262 是一個類似 QWERTY 的標準,但不同於呈現一個鍵盤層的規範,它呈現了被稱為 ECMAScript 的指令碼語言規範。

可以把 ECMA-262 當做 ECMAScript 的參考數字。

一文讀懂 JavaScript 和 ECMAScript 的區別

指令碼語言

一種專門為在一種存在的實體或系統上操作而設計的程式語言。

關於如何使程式語言成為指令碼語言的常規想法,請考慮命令“walk”、“run” 和 “jump”。這些操作需要一些東西來驅動,可能是一個人、一條狗或一個視訊遊戲角色。如果沒有操作員來執行這些命令,“walk”、“run” 和 “jump” 是沒有意義的。這組操作類似於專注於操縱外部實體的指令碼語言。

ECMAScript

The specification defined in ECMA-262 中定義的標準,是用於建立通用目的指令碼語言的。

同義詞: ECMAScript 規範

一文讀懂 JavaScript 和 ECMAScript 的區別

然而ECMA-262是標準的名稱,它代表了指令碼語言規範ECMAScript。
ECMAScript提供指令碼語言必須遵守的規則、細節和準則,這些才是其被視為相容ECMAScript的判斷標準。

一文讀懂 JavaScript 和 ECMAScript 的區別

JavaScript

一種通用目的的指令碼語言,遵循 ECMAScript 規範。

它是 ECMAScript 語言的一個分支版本。

一文讀懂 JavaScript 和 ECMAScript 的區別

JavaScript 是我喜歡程式設計的咖啡味語言(指代 Java 族,譯者注)。ECMAScript 是它所基於的規範。通過閱讀 ECMAScript 規範,你將學會如何建立指令碼語言。通過閱讀 JavaScript 文件,你將學習如何使用指令碼語言。

當人們把 JavaScript 稱為“ ECMAScript 語言的方言”的時候,他們的意思就像談論英語、法語或者中國方言時一樣。一種方言從其母語中衍生出大部分的詞彙和語法,但偏離得值得保留這些差異。

JavaScript 實現了多數 ECMA-262 中描述的 ECMAScript 規範,但存在少數差異。 Mozilla 在概述了 JavaScript 的非 ECMAScript 語言功能:

一文讀懂 JavaScript 和 ECMAScript 的區別

JavaScript 引擎

能夠理解和執行 JavaScript 程式碼的程式或直譯器。

同義詞:JavaScript 直譯器,JavaScript 的實現

一文讀懂 JavaScript 和 ECMAScript 的區別

JavaScript 引擎通常可以在 web 瀏覽器中被發現,包括 Chrome 中的 V8 ,火狐中的 SpiderMonkey ,以及 Edge 中的 Chakra 。每款引擎就像是一個用於其應用程式的語言模組,可以讓其支援某種 JavaScript 語言的分支。

JavaScript 引擎對於瀏覽器來說就像是人類對語言的理解一樣。如果我們重新拿我們日常行為中的“走”、“跑”、“跳”來舉例的話,一個 JavaScript 引擎是真正能夠理解這些動作是何意義的根本機制。

這個比喻可以幫我們解釋一些關於瀏覽器的事情:

一文讀懂 JavaScript 和 ECMAScript 的區別

瀏覽器效能的差異

兩個人也許會識別“跳”的命令,但是一個人由於理解和對命令的處理比另一個人更快些,也許會比另一個人對命令的反應更快些。類似的是,兩個瀏覽器都可以理解 JavaScript 程式碼,但是一個由於其 JavaScript 引擎實現起來效率更高而執行得更快。

一文讀懂 JavaScript 和 ECMAScript 的區別

瀏覽器支援的差異

再以即使說同樣語言的人們之間也會有差異為例。即使許多人講英語,但是一些人也許懂得他人不懂的某些詞、表示式和與語法規則,反之亦然。瀏覽器也是同樣的道理。儘管瀏覽器的 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 和 ECMAScript 的區別

JavaScript 執行時

JavaScript 程式碼執行所在的環境,併為 JavaScript 引擎所解釋。執行時提供了 JavaScript 可以執行和操作的宿主物件。

同義詞:宿主環境

一文讀懂 JavaScript 和 ECMAScript 的區別

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

一文讀懂 JavaScript 和 ECMAScript 的區別

這一版的 ECMAScript 將其名字由 ES6 改為了 ES2015 ,這是由於 Ecma 國際決定每年都對 ECMAScript 釋出一次。相應地,Ecma 國際也開始基於每年所釋出的來命名新版本的 ECMAScript 規範。簡而言之, ES6 和 ES2015 是對同一件事情的兩個不同的名字。

Babel

一款可以將 ES6 程式碼轉換為 ES5 程式碼的轉譯器。

一文讀懂 JavaScript 和 ECMAScript 的區別

開發者可以使用 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 的。

好吧,我知道這聽起來就像是一個人穿越變成了自己的父母一樣——有點矛盾,不過想起來還是挺搞笑的。

結束語

我知道閱讀本文給你帶來了不少歡樂,但是資訊量還是很豐富的。我也要再此說再見了。

如果你有什麼問題、評論、建議或考慮的話,請一吐為快。

非常感謝閱讀本文!

相關文章