JavaScript 簡史JavaScript 簡史

作者 | 泰斗賢若如

來源 | 泰斗賢若如

這次寫一篇對於 JavaScript 的簡介,我們知道的編程語言有很多種,比如 Java、C++、Python 等等,每種編程語言都有其獨具的特色,不論是語法格式還是表達形式,都能讓每個程序員沉澱在知識的海洋裏難以自拔。即每種編程語言都有無限的延展性,但如果我們考慮問題的時候追溯其根源,其實也不難發現每種編程語言都具有共同的初心,最直白的話就是人與計算機進行溝通的語言,在現實生活中,見什麼人說什麼話我們都很清楚,那在與計算機溝通的世界中,做什麼事用什麼編程語言溝通也是同樣的道理,前提就是我們要了解這些編程語言,在你需要選擇的時候做出正確的判斷,這也正是我寫此篇文章的意義。

JavaScript 簡史

JavaScript 的歷史由來

在 1994 年,當時的網景公司(Netscape)憑藉 Navigator 這個瀏覽器成爲了 Web 時代開啓最著名的第一代的互聯網公司。當時所用的第一版本的瀏覽器就是下圖中的瀏覽器,相信有很多年輕朋友都沒有見過這種瀏覽器。如果大家回想十年前或是十五年前,大家用的瀏覽器應該是 IE 瀏覽器,那個時候的瀏覽器跟現在的比如說谷歌瀏覽器、火狐瀏覽器等相比而言,那就是天壤之別了。這個最早版本的瀏覽器,整個瀏覽器都是靜態的,也就是用 HTML 和 CSS 寫的,並沒有像今天的各種瀏覽器一樣具有各種各樣的動態效果了,比如像網頁的圖片輪播、鼠標懸浮切換等效果。網景公司就想在原來的靜態頁面的基礎上添加一些動態的效果,這時候網景公司出來一個很牛的人物叫布蘭登·艾奇,他用不到兩週的時間就設計出了能在網頁上實現動態效果的編程語言。他設計出實現網頁動態效果的編程語言,並將其編程語言命名爲 JavaScript。爲什麼會命名爲 JavaScript 呢?原因是在當時,Java 非常火,網景公司希望借用 Java 在當時的名氣來進行推廣。其實事實上呢,JavaScript 除了語法上有點像 Java 外,別的地方都跟 Java 沒有任何關係。

JavaScript 簡史

JavaScript 和 ECMAScript 的關係

**
**

從上面講的 JavaScript 的由來中,我們就知道 JavaScript 由網景公司的布蘭登·艾奇開發出來的,一年後,微軟又模仿 JavaScript 開發出了一種編程語言叫 JScript, 再後來,陸續又有別的商家推出 JavaScript 的不同實現語言。這就導致 JavaScript 的語法和特性日益混亂,其標準化問題被提上日程。最終由歐洲計算機制造商協會(ECMA)以 JavaScript1.1 爲藍本,制定了【ECMA-262】標準,並由此標準定義了一種新腳本語言 ECMAScript。隨後,ISO 也採用 ECMAScript 作爲標準,各瀏覽器廠商便紛紛開始將 ECMAScript 作爲各自 JavaScript 實現的基礎。 那到底 JavaScript 和 ECMAScript 有什麼關係呢 ?ECMAScript 其實並不等同於 JavaScript,它只是 JavaScript 的核心標準(語法、類型、語句、關鍵字、保留字、操作符、對象),而 JavaScript 還包括文檔對象模型(DOM)和瀏覽器對象模型(BOM)等。其中各主流瀏覽器對 ECMAScript 的支持都還不錯,但對 DOM 的支持相差較大,對於 BOM 一直沒有相關標準。最後再簡單總結一下就是:ECMAScript 是一種語言標準,JavaScript 是對 ECMAScript 的一種實現。
JavaScript 簡史

JavaScript 版本迭代

  • 1997 年 06 月 : 發佈首版。
  • 1997 年 06 月 : 修改規範完全符合 ISO/IEC 16262 國際標準。
  • 1998 年 6 月,ECMAScript 2.0 版發佈。
  • 1999 年 12 月,ECMAScript 3.0 版發佈,成爲 JavaScript 的通行標準,得到了廣泛支持。
  • 1999 年 12 月 : 增加正則、更好的文字處理、新的控制語句、try/catch 異常處理、更加明確的錯誤定義,數字輸出格式等等。放棄發佈。
  • 2007 年 10 月,ECMAScript4.0 版草案發布,對 3.0 版做了大幅升級,預計次年 8 月發佈正式版本。草案發布後,由於 4.0 版的目標過於激進,各方對於是否通過這個標準,發生了嚴重分歧。以 Yahoo、Microsoft、Google 爲首的大公司,反對 JavaScript 的大幅升級,主張小幅改動;以 JavaScript 創造者 Brendan Eich 爲首的 Mozilla 公司,則堅持當前的草案。
  • 2008 年 7 月,由於對於下一個版本應該包括哪些功能,各方分歧太大,爭論過於激進,ECMA 開會決定,中止 ECMAScript 4.0 的開發,將其中涉及現有功能改善的一小部分,發佈爲 ECMAScript3.1,而將其他激進的設想擴大範圍,放入以後的版本,由於會議的氣氛,該版本的項目代號起名爲 Harmony (和諧)。會後不久,ECMAScript 3.1 改名爲 ECMAScript 5。
  • 2009 年 12 月 : 完善了 ECMASript 3 版本、增加 "strict mode," (嚴格模式)、以及新的功能,如 getter 和 setter、 JSON 庫支持和更完整的對象屬性。ECMAScript 5.0 版正式發佈。Harmony 項目則一分爲二,一些較爲可行的設想定名爲 JavaScript.next 繼續開發,後來演變成 ECMAScript 6;一些不是很成熟的設想,則被視爲 JavaScript.next.next,在更遠的將來再考慮推出。
  • 2011 年 06 月 :ECMAscript 5.1 版發佈,並且成爲 ISO 國際標準(ISO/IEC 16262:2011)。
  • 2013 年 3 月,ECMAScript 6 草案凍結,不再添加新功能。新的功能設想將被放到 ECMAScript 7。
  • 2013 年 12 月,ECMAScript 6 草案發布。
  • 2015 年 06 月 : 第六版的名字有很多,可以叫 ECMAScript6 (ES6) ,也可以叫 ECMAScript 2015 (ES2015) 。
  • 2015 年 6 月 17 日,ECMAScript 6 發佈正式版本,即 ECMAScript 2015。
  • 2016 年 06 月 : 也被稱爲 ECMAScript 2016。完善 ES6 規範,還包括兩個新的功能 : 求冪運算符 (*) 和 array.prototype.includes 方法。
  • 2017 年 06 月 : 增加新的功能,如併發、原子操作、Object.values/Object.entries、 字符串填充、promises、 await/asyn 等等。

JavaScript 簡史

JavaScript 的組成部分

JavaScript 簡史
JavaScript 的三個主要組成部分是:ECMAScript(核心),DOM (文檔對象模型),BOM (瀏覽器對象模型)。

ECMAScript(核心)

【ECMA-262】並沒有參照 web 瀏覽器,規定了語言的組成部分,其具體內容包括語法、類型、語言、關鍵字、保留字、操作符、對象等。ECMAScript 的兼容:

  1. 支持【ECMA-262】描述的所有“類型、值、對象、屬性、函數以及程序語法和語義” 。
  2. 支持 Unicode 字符標準。
  3. 添加【ECMA-262】沒有描述的更多“類型、值、對象、屬性和函數”,【ECMA-262】說的這些新增特性,主要是指該標準中沒有規定的新對象和對象的新屬性。
  4. 支持【ECMA-262】中沒有定義的“程序和正則表達式的語法”。也就是說可以修改和擴展內置的正則表達式語法。

DOM (文檔對象模型)

文檔對象模型 (DOM) 是針對 XML 但經過擴展用於 HTML 的應用程序編程接口(API)。DOM 把整個頁面映射爲一個多層次節點結構。HTML 或者 XML 頁面中的每個組成部分都是某種類型的節點,這些節點又包含着不同類型的數據。JavaScript 簡史其實說白了,文檔對象模型 (DOM) 就是操作網頁上的那些標籤,來實現動態的效果。在 DOM 中,頁面一般可以用分層節點圖表示:JavaScript 簡史DOM 級別:

  • DOM1 級於 1998 年 10 月成爲 W3C 的推薦標準。BOM1 由兩個模塊組成分別是 DOM core 和 DOM HTML。
  • DOM core:規定如何映射基於 XML 的文檔結構,以便簡化對文檔中任意部分的訪問和操作。
  • DOM HTML:在 DOM core 的基礎上加以擴展,添加了針對 HTML 的對象和方法。
  • DOM2 級在原來 DOM 的基礎上有擴充了鼠標和用戶界面事件、範圍、遍歷等細分模塊,通過對象接口增加了對 css 的支持。包括以下模塊:
  1. DOM Views (DOM 視圖):定義了跟蹤不同文檔視圖的接口。
  2. DOM Events (DOM 事件):定義了事件與事件處理的接口。
  3. DOM Traversal and Range(DOM 遍歷和範圍):定義了遍歷和操作文檔的接口。
  • DOM3 級則進一步擴展了 DOM,引入了加載和保存模塊以統一方式加載和保存文檔的方法;新增了 DOM 驗證模塊主要還是驗證文檔的方法。

BOM (瀏覽器對象模型)

瀏覽器對象模型 (BOM) 是處理瀏覽器窗口和框架,我們習慣上把所有針對瀏覽器的 JavaScript 擴展算作是 BOM 的一部分。包括以下:

  1. 彈出新瀏覽器窗口的功能。
  2. 移動、縮放和關閉瀏覽器窗口的功能。
  3. 提供瀏覽器所加載頁面的詳細信息的 navigator 對象。
  4. 提供瀏覽器所加載頁面的詳細信息的 location 對象。
  5. 提供用戶分辨率詳細信息的 screen 對象。
  6. 對 cookies 的支持。
  7. 像 XMLHttpRequest 和 IE 的 ActionXobject 這樣的自定義對象。

瀏覽器對象模型 (BOM) 其實很簡單,它包含了當前瀏覽器上的一些操作,比如說像關閉按鈕、刷新按鈕、前進和後退按鈕等等。綜上來說,JavaScript 就包含了以上這三部分內容,第一部分就是核心基礎語法,這是非常非常重要的東西,有了核心基礎的鋪墊,我們才能後續的學習文檔對象模型 (DOM) 和瀏覽器對象模型 (BOM)。文檔對象模型 (DOM) 就是操作一些網頁上的一些標籤元素,來實現網頁上的動態效果。而瀏覽器對象模型 (BOM) 就是像比如說滾動的行爲,點擊回到頂部,還有刷新,前進,後退等操作。這些特性就是我們需要了解的內容,在你後續進行詳細學習的時候,就帶着這些特性疑問去學習,會有事半功倍的效果。

    **更多精彩推薦**
[ ☞](http://mp.weixin.qq.com/s?__biz=MjM5MjAwODM4MA==&mid=2650750309&idx=2&sn=e6772d93425a7a23a9d53c793274b9bd&chksm=bea74cb689d0c5a0a5958c2f20aaa0fdf3616a3089b6e61082e47f6639ed593951c7d39e5698&scene=21#wechat_redirect)[微信 Android 版支持改微信號,淘寶硬核拒絕改名要求;5G 套餐價格鬆動;Kotlin 1.4 第二個預覽版發佈 | 極客頭條](http://mp.weixin.qq.com/s?__biz=MjM5MjAwODM4MA==&mid=2650751455&idx=1&sn=2f78f7937e08f3832b81868302e29cbe&chksm=bea7300c89d0b91a80b3fb0d5b56480519df04883d27cc2931377433136228ea2f18f9a52af7&scene=21#wechat_redirect)

[☞](http://mp.weixin.qq.com/s?__biz=MjM5MjAwODM4MA==&mid=2650746260&idx=1&sn=ec250a1510b9cf57c8ba19578decefb1&chksm=bea75c4789d0d551e79436a31b723defb9f792c09c0d78c83d04b011a5c1758175aad851c534&scene=21#wechat_redirect)[跨行成爲程序員的 15 個實用技巧!](http://mp.weixin.qq.com/s?__biz=MjM5MjAwODM4MA==&mid=2650751455&idx=4&sn=947c7441024934b3cec64b3011428684&chksm=bea7300c89d0b91a1350b5a448dc59d4e58283d038519fb89b3517301a95ce8ac26fb334ba48&scene=21#wechat_redirect)

[☞](http://mp.weixin.qq.com/s?__biz=MjM5MjAwODM4MA==&mid=2650750309&idx=2&sn=e6772d93425a7a23a9d53c793274b9bd&chksm=bea74cb689d0c5a0a5958c2f20aaa0fdf3616a3089b6e61082e47f6639ed593951c7d39e5698&scene=21#wechat_redirect)[程序員擺地攤的正確姿勢!](http://mp.weixin.qq.com/s?__biz=MzA5MzY4NTQwMA==&mid=2651019223&idx=3&sn=3a0c350f227a0c3c2453c30225ea8dd1&chksm=8bade420bcda6d36617dc74ba9d9f5bd91f5e034de01def7d4520b55a0a44494b43e02b7e141&scene=21#wechat_redirect)

☞[全網唯一禿頭數據集:20 萬張人像,網羅各類禿頭](http://mp.weixin.qq.com/s?__biz=MzI0ODcxODk5OA==&mid=2247517347&idx=1&sn=3fa2a10b4128252bc1cd6e2f7d183050&chksm=e99eb75adee93e4c0001439bc70d8d33a40f05cf1c0e7e51c0625640f95cc2ab21aaf91c7012&scene=21#wechat_redirect)

☞[一個神祕 URL 釀大禍,差點讓我背鍋!](http://mp.weixin.qq.com/s?__biz=MzA3MjY1MTQwNQ==&mid=2649837109&idx=1&sn=3473f012e4e1beeffc253821dde1915b&chksm=871ee9d7b06960c14f1d100a53e93bd03a7ae2aa87cbb8c22d4554189717911d2be268ade087&scene=21#wechat_redirect)

☞[Uber 前無人駕駛工程師告訴你,國內無人駕駛之路還要走多久?](http://mp.weixin.qq.com/s?__biz=MzI0ODcxODk5OA==&mid=2247517193&idx=1&sn=076ebccc734132631eeda66f7aa4ce5a&chksm=e99eb7f0dee93ee6e66da60d51dc0c04d45b52729a524f12352f54b4e474f71578de52deb6a2&scene=21#wechat_redirect)

JavaScript 簡史你點的每個“在看”,我都認真當成了喜歡
```


  1. Rust 語言中默認語言項 (Item) 的可見性都是私有的,如需公開語言項給其他模塊使用,需要使用 pub 關鍵字放開。[^2]: 一個繞開的行爲不一致問題的方法是將屬性設置規則抽取爲靜態函數,但仍然無法避免過度封裝的問題。 

來源鏈接:mp.weixin.qq.com