一.JavaScript 的誕生
1995 年 5 月,一個叫 Brendan Eich 的人花 10 天創造了 JavaScripthtml
二.JavaScript 語言的標準化
最初 JavaScript 語言有 2 份標準:前端
- ECMA-262:主標準,由 ECMA 國際組織(Ecma International)負責管理
- ISO/IEC 16262:第二標準,由國際標準化組織(ISO,International Organization for Standardization)和國際電子技術委員會(IEC,International Electrotechnical Commission)負責管理
出於商標版權的緣由,規範標準中將這門語言稱爲 ECMAScript,因此原則上 JavaScript 與 ECMAScript 指的是同一個東西,但有時也會加以區分:git
- JavaScript:指語言及其實現
- ECMAScript:指語言標準及語言版本,好比 ES6 表示語言(標準)的第 6 版
P.S.ECMAScript 中的 ECMA 取自負責管理主標準的 ECMA 國際組織,這個組織最初叫歐洲計算機制造商協會(European Computer Manufacturers Association),後來影響範圍不限於歐洲,遂改名爲 ECMA 國際組織(Ecma International)es6
三.ES 規範版本歷史
- ECMAScript 1(1997 年 6 月):規範初版
- ECMAScript 2(1998 年 6 月):爲了同步 ISO 標準,引入了一些小更新
- ECMAScript 3(1999 年 12 月):增長了正則表達式、字符串處理、控制語句(
do-while
、switch
)、異常處理(try-catch
)等衆多核心特性
- ECMAScript 4(2008 年 7 月廢除):原本是一次大規模升級(靜態類型、模塊、命名空間等),但跨度過大,出現了分歧,最終沒能推廣使用
- ECMAScript 5(2009 年 12 月):變化不大,加了一些標準庫特性和嚴格模式
- ECMAScript 5.1(2011 年 6 月):又一次小更新,爲了同步 ISO 標準
- ECMAScript 6(2015 年 6 月):一大波更新,實現了當年 ES4 的許多設想,並正式改成按年份命名規範版本
- ECMAScript 2016(2016 年 6 月):第一個年度版本,與 ES6 相比,發佈週期較短,新特性也相對少些
- ECMAScript 2017(2017 年 6 月):第二個年度版本
- 之後的 ECMAScript 版本(ES2018、ES2019、ES2020 等)都在 6 月正式獲准生效
四.TC39 標準制定流程
從 ES6 來看,發版週期過長存在 2 個問題:github
- 版本之間的時間跨度太長,提前定稿的特性要等待很是長的時間,一直等到規範正式發佈(才能被實現和使用),而靠後的特性每每趕在最後發版期限以前才定稿,存在風險
- 語言特性的設計與實現和使用相隔過久,在實現和使用階段才發現設計缺陷爲時已晚
爲此,TC39(ECMA 國際組織第 39 號技術委員會)啓動了新的流程:正則表達式

P.S.ECMA 國際組織設有衆多技術委員會,除 TC39 ECMAScript 外,還有 TC43 Universal 3D (U3D)、TC45 Office Open XML Formats 等等,具體見Ecma template for minutes - Ecma International微信
主要變化在於:函數
- ECMAScript 各項特性獨立設計,歷經 5 個階段,從 Stage 0(Strawman,初稿)開始,經 Stage 1(提案)、Stage 2(草案)、Stage 3(候選提案),最後到 Stage 4(Finished,過審提案)結束
- 要求在後幾個階段進行原型實現和實際測試(由Test 262負責),以便在設計和實現之間造成反饋循環
- ECMAScript 每一年發佈一版,囊括截止最後發版日期以前全部已經進入第 4 階段的特性
因此,從 ES2016 開始(新 TC39 流程施行以來),ES 版本的概念被大大弱化了,須要關心的是特性提案處於第幾階段,只要進入第 4 階段就已經算是標準特性了,會在下一個 6 月正式歸入標準工具
P.S.按照TC39 流程文檔,應該是每一年 7 月發版:測試
July: Approval of new standard by the ECMA General Assembly
但實際發版時間是每一年 6 月,多是爲了記念歷史上那些 6 月發佈的元老版本
五.向後兼容原則
咱們發現 ES 規範每一版始終徹底兼容先前的全部特性,好比 ES6 提出了let
、const
但並無幹掉var
,這是由於若是推出了不兼容的新版本,會形成一些問題:
- JavaScript 引擎、IDE、構建工具都會變得臃腫,由於要支持新舊兩版規範
- 開發者須要知道版本之間的差別
- 要麼把現有的代碼全都遷移到新版本,要麼(不一樣項目)混用多個版本,重構會變得很麻煩
- 甚至要標註每段代碼的所屬版本,就像 ES5 手動開啓嚴格模式同樣,當時沒有流行起來的一個緣由是在文件或函數開頭添加指令也很麻煩
爲了不這些問題,ES6 採用了一種策略叫One JavaScript:
- 新版本始終徹底向後兼容(但偶爾可能會有輕微、不明顯的清理)
- 舊特性不刪除也不修復,而是引入更好的版本,好比
let
就是var
的改進版
- 若是語言的某些方面有變化,只在新的語法結構內生效,即隱式選用,例如,
yield
只在generator
中才是關鍵字、模塊和類中的全部代碼都默認開啓嚴格模式
參考資料
有所得、有所惑,真好
關注「前端向後」微信公衆號,你將收穫一系列「用心原創」的高質量技術文章,主題包括但不限於前端、Node.js以及服務端技術
本文首發於 ayqy.net ,原文連接:http://www.ayqy.net/blog/tc39...