近年來,JavaScript 的發展可謂風起雲湧。每年都有新的 ECMAScript 規範發布,這使得 JavaScript 的版本管理、各個版本的功能支持以及如何編寫面向未來的代碼變得容易混淆。
為了更好地理解這看似持續不斷的更新浪潮背後的原因,讓我們簡要回顧一下 JavaScript 及其版本的歷史,並了解標準化過程為何如此重要。
關鍵要點
- ES6(也稱為 ES2015)標誌著 JavaScript 版本管理的重大轉變,引入了類、Promise、箭頭函數、ES 模塊、生成器和迭代器等特性。這是一個重要的基礎更新,為未來的年度小型 JavaScript 版本更新奠定了基礎。
- ES2015 建立了基於提案的 TC39 過程,用於討論和採納新的語言特性。此過程包含五個階段:Strawman(雛形)、Proposal(提案)、Draft(草案)、Candidate(候選)、Finished(完成),每個階段都逐步規範化和實現所提出的特性。
- ES2015 之後,後續版本每年六月發布,ES2016(ES7)和 ES2017(ES8)引入了增量特性和改進。 ES2018 引入了一些強大的新增功能,例如異步迭代器以及對象展開和剩餘屬性。
- 將 ES6 重命名為 ES2015 是為了反映其發布年份,並擺脫版本號。此舉是為了避免混淆,並表明 JavaScript 是一種不斷更新和改進的動態語言。新的命名約定也有助於表明語言更新和改進的規律性。
JavaScript 版本管理的早期歷史
JavaScript 的原型於 1995 年 5 月由 Brendan Eich 在短短十天內編寫完成。他最初被招募來為 Netscape Navigator 實現 Scheme 運行時,但管理團隊推動使用一種 C 風格的語言來補充當時新發布的 Java。
JavaScript 於 1995 年 12 月在 Netscape Navigator 版本 2 中首次亮相。次年,微軟對 JavaScript 進行了逆向工程,創建了自己的版本,稱為 JScript。 JScript 與 Internet Explorer 瀏覽器版本 3 一起發布,幾乎與 JavaScript 完全相同——甚至包括所有相同的錯誤和怪癖——但它確實有一些額外的 Internet Explorer 獨有特性。
ECMAScript 的誕生
確保 JScript(以及任何其他變體)與 JavaScript 保持兼容的必要性促使 Netscape 和 Sun Microsystems 對該語言進行標準化。他們在歐洲計算機製造商協會(ECMA)的幫助下完成了這項工作,ECMA 將負責託管該標準。標準化後的語言被稱為 ECMAScript,以避免侵犯 Sun 的 Java 商標——此舉造成了相當多的混淆。最終,ECMAScript 用於指代規範,而 JavaScript(現在仍然如此)用於指代語言本身。
負責 JavaScript 版本管理和維護 ECMAScript 的工作組被稱為技術委員會 39,或 TC39。它由來自 Apple、Google、Microsoft 和 Mozilla 等所有主要瀏覽器廠商的代表組成,以及其他對 Web 發展感興趣的公司受邀的專家和代表。他們定期舉行會議,以決定該語言的發展方向。
當 JavaScript 於 1997 年由 TC39 標準化時,該規範被稱為 ECMAScript 版本 1。最初,ECMAScript 的後續版本每年發布一次,但由於缺乏共識以及 ECMAScript 4 周圍難以管理的大型功能集,最終變得零星。因此,該版本被終止並縮小到 3.1,但並未以該名稱最終確定,而是最終演變為 ECMAScript 5。它於 2009 年 12 月發布,距 ECMAScript 3 發布 10 年後,並引入了 JSON 序列化 API、Function.prototype.bind 和嚴格模式等功能。兩年後,發布了一個維護版本來澄清最新迭代 5.1 中的一些歧義。
ECMAScript 2015 和年度發布的複興
隨著 TC39 解決因 ECMAScript 4 導致的分歧,Brendan Eich 強調需要更短期、更小規模的發布。這些新的規範中的第一個是 ES2015(最初命名為 ECMAScript 6 或 ES6)。這個版本是一個龐大但必要的基石,為未來的年度 JavaScript 版本管理提供了支持。它包含許多當今許多開發人員都非常喜歡的特性,例如:
- 類
- Promise
- 箭頭函數
- ES 模塊
- 生成器和迭代器
ES2015 是第一個遵循 TC39 過程 的版本,這是一個基於提案的模型,用於討論和採納語言特性。
TC39 過程
在提案被接受到即將發布的 ECMAScript 版本之前,它必須經過五個階段。
階段 0:Strawman(雛形)
這是一個方便的步驟,允許向規範提交想法。任何人都可以提出特性建議——即註冊為貢獻者的 TC39 成員和非成員。
階段 1:Proposal(提案)
提案正式化的第一個階段。必須:
- 描述該解決方案糾正的任何現有問題
- 提供 API 概要,以及高級實現細節,以及 polyfill 和/或演示
- 預先討論潛在的障礙
必須選擇一位 負責人 來採納和推進該提案。此人必須是 TC39 成員。
階段 2:Draft(草案)
這是該特性可能包含在 ECMAScript 未來版本中的里程碑。在此,使用規範描述的正式語言詳細說明提案的語法和語義。此時應該提供實驗性實現。
階段 3:Candidate(候選)
在此,提案的大部分內容和支持技術已經開發完成,但需要來自用戶和實現者(例如瀏覽器廠商)的進一步反饋。一旦獲得併採取行動,概要和規範細節將由指定的審閱者和指定的編輯最終確定和簽字。由於此階段需要符合的實現,因此此後只接受關鍵更改。
階段 4:Finished(完成)
該提案已被接受,可以添加到 ECMAScript 中。因此,它固有地:
- 使用 JavaScript 編寫的 Test262 套件的一部分的驗收測試已被編寫,以證明該特性的符合性和行為
- 至少有兩個符合的實現可用並已發布,所有這些都證明了其健壯性和開發人員可用性
- 已向官方 ECMA-262 代碼庫提交拉取請求,並已獲得規範編輯的簽字。
上述代碼庫的貢獻文檔進一步詳細說明了使用 GitHub 問題和拉取請求來管理對語言的添加。
展望未來
在完成 ES2015 和建立 TC39 的 JavaScript 版本管理和更新過程之後,後續版本每年六月發布,提案的包含時間限制為一年。在撰寫本文時,已經有三個新的規範。
ES2016
也稱為 ES7,這是 ECMAScript 的第一個較小、增量版本。除了錯誤修復之外,它只添加了兩個特性。
Array.prototype.includes
此實例方法簡化了在數組中搜索值的操作:
// ES2016 之前: const hasBob = names.indexOf('bob') > -1; // ES2016: const hasBob = names.includes('bob');
指數運算符
在 ES2016 之前,可以使用 Math.pow(base, exponent) 執行冪運算。此版本引入了一個運算符(**),它具有自己的優先級:
// ES2016 之前 Math.pow(5, 3); // => 125 // ES2016 5 ** 3; // => 125
ES2017
ES2017(又名 ES8)是一個稍大的版本,包含一些有用的方法和語法結構。
異步函數
Promise 已將我們從回調地獄中解救出來,但它們的 API 仍然表現出冗長。異步函數使用與同步代碼非常相似的語法對它們進行了抽象:
// Promise const getProfile = name => { return fetch(`https://some-api/people/${name}`) .then(res => res.json()) .then(({ profile }) => profile); // 从解析的对象中解构 `profile` }; // async/await const getProfile = async name => { const res = await fetch(`https://some-api/people/${name}`); const { profile } = await res.json(); return profile; };
字符串填充方法
String.prototype.padStart(length, padder) 和padEnd(length, padder) 將分別在字符串的開頭和結尾重複添加padder(這是可選的,默認為空格),直到達到length 個字符:
'foo'.padStart(6); // => ' foo'; 'foo'.padEnd(6); // => 'foo '; 'foo'.padStart(10, 'bar'); // => 'barbarbfoo'; 'foo'.padEnd(10, 'bar'); // => 'foobarbarb';
其他特性包括尾隨逗號、共享內存和原子操作以及靜態對象方法(Object.entries()、Object.values() 和 Object.getOwnPropertyDescriptors())。
ES2018
在撰寫本文時,這個最新版本引入了一小部分強大的新增功能。
異步迭代器
雖然 Promise.all() 允許您等待多個 Promise 的解析,但在某些情況下,您可能需要順序迭代異步檢索的值。現在可以與 Promise 數組一起等待異步迭代器:
// ES2016 之前: const hasBob = names.indexOf('bob') > -1; // ES2016: const hasBob = names.includes('bob');
對象展開和剩餘屬性
表面上看,由於 Babel 等編譯器的可用性,這兩個語法改進在 JavaScript 開發人員中已經很流行。對象展開和剩餘屬性類似於數組展開和剩餘屬性,並允許淺複製和對象屬性的分組解構:
// ES2016 之前 Math.pow(5, 3); // => 125 // ES2016 5 ** 3; // => 125
其他已接受的提案包括 Promise.prototype.finally(),以及對正則表達式和模板字面量的增強。
結語
JavaScript 在很短的時間內得到了極大的發展。雖然這歸功於 ECMAScript 標準和 TC39 的出色工作,但由於之前 JavaScript 版本管理和開發缺乏穩定性和凝聚力,這最初是一段艱辛的旅程。
由於提案過程相對成熟,該語言只能以務實和可控的方式改進。對於 Web 開發人員來說,這是一個偉大的時代!
關於 JavaScript 版本管理的常見問題解答:ES6 和 ES2015
ES6 和 ES2015 的主要區別是什麼?
ES6 和 ES2015 本質上是相同的。 ES6 是由 ECMA 國際標準化的 ECMAScript 編程語言的第六版。 ES2015 只是 ES6 的新名稱,反映了它發布的年份。重命名是為了反映發布年份並擺脫版本號,這可能會造成混淆。
為什麼將 ES6 重命名為 ES2015?
將 ES6 重命名為 ES2015 是為了反映其發布年份並擺脫版本號。此舉是為了避免混淆,並表明 JavaScript 是一種不斷更新和改進的動態語言。新的命名約定也有助於表明語言更新和改進的規律性。
ES6/ES2015 中引入了哪些關鍵特性?
ES6/ES2015 為JavaScript 引入了許多新特性,包括用於變量聲明的let
和const
、用於更短函數語法的箭頭函數、用於字符串插值的模板字面量、用於面向對象編程的類、用於異步編程的Promise 以及用於代碼組織的模塊等等。
ES6/ES2015 如何改進 JavaScript 編碼?
ES6/ES2015 通過多種方式改進 JavaScript 編碼。它引入了使該語言更強大且更易於使用的新語法和特性。例如,箭頭函數提供了更簡潔的函數編寫語法,而 Promise 使處理異步操作更容易。模塊的引入也有助於更好地組織代碼,使其更易於管理和維護。
如何在我的 JavaScript 代碼中開始使用 ES6/ES2015 特性?
要在 JavaScript 代碼中開始使用 ES6/ES2015 特性,您可以使用像 Babel 這樣的轉譯器,它將 ES6 代碼轉換為可在當前瀏覽器中運行的 ES5 代碼。您還可以使用像 Webpack 這樣的模塊打包器來管理和捆綁您的 JavaScript 模塊。
ES6/ES2015 是否存在任何兼容性問題?
雖然大多數現代瀏覽器都支持 ES6/ES2015 的大部分特性,但與舊版瀏覽器可能存在一些兼容性問題。為了確保兼容性,您可以使用 polyfill,它提供了您期望瀏覽器原生支持的功能。
JavaScript 和 ECMAScript 之間有什麼區別?
JavaScript 是一種最初由 Netscape 開發的編程語言。 ECMAScript 是由 ECMA 國際標準化的 JavaScript 標準版本。 JavaScript 實現 ECMAScript,這意味著它遵循 ECMAScript 標準中定義的規則和結構。
ES6/ES2015 之後 JavaScript 的未來如何?
ES6/ES2015 之後,JavaScript 將繼續發展,每年都會發布新版本,每個版本都會引入新的特性和改進。 JavaScript 的未來可能會看到更強大的特性、更好的性能以及跨不同平台和設備的更高兼容性。
TypeScript 與 ES6/ES2015 的關係如何?
TypeScript 是 JavaScript 的超集,它為該語言添加了靜態類型。它支持 ES6/ES2015 的所有特性,甚至包括 JavaScript 中找不到的一些附加特性。 TypeScript 代碼被轉譯為 JavaScript,因此它可以在任何 JavaScript 環境中運行。
使用 ES6/ES2015 比使用早期版本的 JavaScript 有什麼好處?
與早期版本的 JavaScript 相比,使用 ES6/ES2015 提供了許多好處。它引入了使該語言更強大且更易於使用的新語法和特性。它還改進了代碼組織和可維護性,並為複雜的應用程序和大型代碼庫提供了更好的支持。
以上是ES6(ES2015)及以後:了解JavaScript版本的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript核心數據類型在瀏覽器和Node.js中一致,但處理方式和額外類型有所不同。 1)全局對像在瀏覽器中為window,在Node.js中為global。 2)Node.js獨有Buffer對象,用於處理二進制數據。 3)性能和時間處理在兩者間也有差異,需根據環境調整代碼。

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

記事本++7.3.1
好用且免費的程式碼編輯器

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具