很多人都曾經有過疑問,JavaScript和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 規範
JavaScript
一種通用目的的腳本語言,遵循 ECMAScript 規格。
它是 ECMAScript 語言的一個分支版本。
當人們把 JavaScript 稱為「 ECMAScript 語言的方言」的時候,他們的意思就像談論英語、法語或中國方言時一樣。一種方言從其母語中衍生出大部分的詞彙和語法,但偏離得值得保留這些差異。
JavaScript 實作了多數 ECMA-262 中所述的 ECMAScript 規範,但存在少數差異。 Mozilla 在此概述了 JavaScript 的非 ECMAScript 語言功能:
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 的。
好吧,我知道這聽起來就像是一個人穿越變成了自己的父母一樣——有點矛盾,不過想起來還是挺搞笑的。
結束語
我知道閱讀這篇文章帶給你不少歡樂,但資訊量還是很豐富的了。我也要再此說再見了。
如果你有什麼問題、評論、建議或考慮的話,請一吐為快。
非常感謝閱讀這篇文章!
相關推薦:
#以上是JavaScript和ECMAScript 之間的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!