前言:
學習一門編程語言的基本步驟
(01)瞭解背景知識javascript
1.瞭解背景知識
1)什麼是 JavaScript 語言?
JavaScript 是一種輕量級的腳本語言。所謂「腳本語言」(script language),指的是它不具有開發操做系統的能力,而是隻用來編寫控制其餘大型應用程序(好比瀏覽器)的「腳本」。
JavaScript 也是一種嵌入式(embedded)語言。它自己提供的核心語法不算不少,只能用來作一些數學和邏輯運算。JavaScript 自己不提供任何與 I/O(輸入/輸出)相關的 API,都要靠宿主環境(host)提供,因此 JavaScript 只合適嵌入更大型的應用程序環境,去調用宿主環境提供的底層 API。
目前,已經嵌入 JavaScript 的宿主環境有多種,最多見的環境就是瀏覽器,另外還有服務器環境,也就是 Node 項目。
從語法角度看,JavaScript 語言是一種「對象模型」語言。各類宿主環境經過這個模型,描述本身的功能和操做接口,從而經過 JavaScript 控制這些功能。可是,JavaScript 並非純粹的「面嚮對象語言」,還支持其餘編程範式(好比函數式編程)。這致使幾乎任何一個問題,JavaScript 都有多種解決方法。閱讀本書的過程當中,你會詫異於 JavaScript 語法的靈活性。
JavaScript 的核心語法部分至關精簡,只包括兩個部分:基本的語法構造(好比操做符、控制結構、語句)和標準庫(就是一系列具備各類功能的對象好比Array、Date、Math等)。除此以外,各類宿主環境提供額外的 API(即只能在該環境使用的接口),以便 JavaScript 調用。以瀏覽器爲例,它提供的額外 API 能夠分紅三大類。
瀏覽器控制類:操做瀏覽器
DOM 類:操做網頁的各類元素
Web 類:實現互聯網的各類功能
若是宿主環境是服務器,則會提供各類操做系統的 API,好比文件操做 API、網絡通訊 API等等。這些你均可以在 Node 環境中找到。html
2)爲何學習 JavaScript?
JavaScript 語言有一些顯著特色,使得它很是值得學習。它既適合做爲學習編程的入門語言,也適合看成平常開發的工做語言。它是目前最有但願、前途最光明的計算機語言之一。
2.1)操控瀏覽器的能力
JavaScript 的發明目的,就是做爲瀏覽器的內置腳本語言,爲網頁開發者提供操控瀏覽器的能力。它是目前惟一一種通用的瀏覽器腳本語言,全部瀏覽器都支持。它可讓網頁呈現各類特殊效果,爲用戶提供良好的互動體驗。
目前,全世界幾乎全部網頁都使用 JavaScript。若是不用,網站的易用性和使用效率將大打折扣,沒法成爲操做便利、對用戶友好的網站。
對於一個互聯網開發者來講,若是你想提供漂亮的網頁、令用戶滿意的上網體驗、各類基於瀏覽器的便捷功能、先後端之間緊密高效的聯繫,JavaScript 是必不可少的工具。
2.2)普遍的使用領域
近年來,JavaScript 的使用範圍,慢慢超越了瀏覽器,正在向通用的系統語言發展。
(1)瀏覽器的平臺化
隨着 HTML5 的出現,瀏覽器自己的功能愈來愈強,再也不僅僅能瀏覽網頁,而是愈來愈像一個平臺,JavaScript 所以得以調用許多系統功能,好比操做本地文件、操做圖片、調用攝像頭和麥克風等等。這使得 JavaScript 能夠完成許多之前沒法想象的事情。
(2)Node
Node 項目使得 JavaScript 能夠用於開發服務器端的大型項目,網站的先後端都用 JavaScript 開發已經成爲了現實。有些嵌入式平臺(Raspberry Pi)可以安裝 Node,因而 JavaScript 就能爲這些平臺開發應用程序。
(3)數據庫操做
JavaScript 甚至也能夠用來操做數據庫。NoSQL 數據庫這個概念,自己就是在 JSON(JavaScript Object Notation)格式的基礎上誕生的,大部分 NoSQL 數據庫容許 JavaScript 直接操做。基於 SQL 語言的開源數據庫 PostgreSQL 支持 JavaScript 做爲操做語言,能夠部分取代 SQL 查詢語言。
(4)移動平臺開發
JavaScript 也正在成爲手機應用的開發語言。通常來講,安卓平臺使用 Java 語言開發,iOS 平臺使用 Objective-C 或 Swift 語言開發。許多人正在努力,讓 JavaScript 成爲各個平臺的通用開發語言。
PhoneGap 項目就是將 JavaScript 和 HTML5 打包在一個容器之中,使得它能同時在 iOS 和安卓上運行。Facebook 公司的 React Native 項目則是將 JavaScript 寫的組件,編譯成原生組件,從而使它們具有優秀的性能。
Mozilla 基金會的手機操做系統 Firefox OS,更是直接將 JavaScript 做爲操做系統的平臺語言,可是很惋惜這個項目沒有成功。
(5)內嵌腳本語言
愈來愈多的應用程序,將 JavaScript 做爲內嵌的腳本語言,好比 Adobe 公司的著名 PDF 閱讀器 Acrobat、Linux 桌面環境 GNOME 3。
(6)跨平臺的桌面應用程序
Chromium OS、Windows 8 等操做系統直接支持 JavaScript 編寫應用程序。Mozilla 的 Open Web Apps 項目、Google 的 Chrome App 項目、GitHub 的 Electron 項目、以及 TideSDK 項目,均可以用來編寫運行於 Windows、Mac OS 和 Android 等多個桌面平臺的程序,不依賴瀏覽器。
(7)小結
能夠預期,JavaScript 最終將能讓你只用一種語言,就開發出適應不一樣平臺(包括桌面端、服務器端、手機端)的程序。早在2013年9月的統計之中,JavaScript 就是當年 GitHub 上使用量排名第一的語言。
著名程序員 Jeff Atwood 甚至提出了一條 「Atwood 定律」:
「全部能夠用 JavaScript 編寫的程序,最終都會出現 JavaScript 的版本。」(Any application that can be written in JavaScript will eventually be written in JavaScript.)
2.3)易學性
相比學習其餘語言,學習 JavaScript 有一些有利條件。
(1)學習環境無處不在
只要有瀏覽器,就能運行 JavaScript 程序;只要有文本編輯器,就能編寫 JavaScript 程序。這意味着,幾乎全部電腦都原生提供 JavaScript 學習環境,不用另行安裝複雜的 IDE(集成開發環境)和編譯器。
(2)簡單性
相比其餘腳本語言(好比 Python 或 Ruby),JavaScript 的語法相對簡單一些,自己的語法特性並非特別多。並且,那些語法中的複雜部分,也不是必須要學會。你徹底能夠只用簡單命令,完成大部分的操做。
(3)與主流語言的類似性
JavaScript 的語法很相似 C/C++ 和 Java,若是學過這些語言(事實上大多數學校都教),JavaScript 的入門會很是容易。
必須說明的是,雖然核心語法不難,可是 JavaScript 的複雜性體如今另外兩個方面。
首先,它涉及大量的外部 API。JavaScript 要發揮做用,必須與其餘組件配合,這些外部組件五花八門,數量極其龐大,幾乎涉及網絡應用的各個方面,掌握它們絕非易事。
其次,JavaScript 語言有一些設計缺陷。某些地方至關不合理,另外一些地方則會出現怪異的運行結果。學習 JavaScript,很大一部分時間是用來搞清楚哪些地方有陷阱。Douglas Crockford 寫過一本有名的書,名字就叫《JavaScript: The Good Parts》,言下之意就是這門語言很差的地方不少,必須寫一本書才能講清楚。另一些程序員則感到,爲了更合理地編寫 JavaScript 程序,就不能用 JavaScript 來寫,而必須發明新的語言,好比 CoffeeScript、TypeScript、Dart 這些新語言的發明目的,多多少少都有這個因素。
儘管如此,目前看來,JavaScript 的地位仍是沒法動搖。加之,語言標準的快速進化,使得 JavaScript 功能日益加強,而語法缺陷和怪異之處獲得了彌補。因此,JavaScript 仍是值得學習,何況它的入門真的不難。
2.4)強大的性能
JavaScript 的性能優點體如今如下方面。
(1)靈活的語法,表達力強。
JavaScript 既支持相似 C 語言清晰的過程式編程,也支持靈活的函數式編程,能夠用來寫併發處理(concurrent)。這些語法特性已經被證實很是強大,能夠用於許多場合,尤爲適用異步編程。
JavaScript 的全部值都是對象,這爲程序員提供了靈活性和便利性。由於你能夠很方便地、按照須要隨時創造數據結構,不用進行麻煩的預約義。
JavaScript 的標準還在快速進化中,並不斷合理化,添加更適用的語法特性。
(2)支持編譯運行。
JavaScript 語言自己,雖然是一種解釋型語言,可是在現代瀏覽器中,JavaScript 都是編譯後運行。程序會被高度優化,運行效率接近二進制程序。並且,JavaScript 引擎正在快速發展,性能將愈來愈好。
此外,還有一種 WebAssembly 格式,它是 JavaScript 引擎的中間碼格式,所有都是二進制代碼。因爲跳過了編譯步驟,能夠達到接近原生二進制代碼的運行速度。各類語言(主要是 C 和 C++)經過編譯成 WebAssembly,就能夠在瀏覽器裏面運行。
(3)事件驅動和非阻塞式設計。
JavaScript 程序能夠採用事件驅動(event-driven)和非阻塞式(non-blocking)設計,在服務器端適合高併發環境,普通的硬件就能夠承受很大的訪問量
2.5)開放性
JavaScript 是一種開放的語言。它的標準 ECMA-262 是 ISO 國際標準,寫得很是詳盡明確;該標準的主要實現(好比 V8 和 SpiderMonkey 引擎)都是開放的,並且質量很高。這保證了這門語言不屬於任何公司或我的,不存在版權和專利的問題。
語言標準由 TC39 委員會負責制定,該委員會的運做是透明的,全部討論都是開放的,會議記錄都會對外公佈。
不一樣公司的 JavaScript 運行環境,兼容性很好,程序不作調整或只作很小的調整,就能在全部瀏覽器上運行。java
3)JavaScript語言的誕生
JavaScript 由於互聯網而生,緊跟着瀏覽器的出現而問世。回顧它的歷史,就要從瀏覽器的歷史講起。
1990年末,歐洲核能研究組織(CERN)科學家 Tim Berners-Lee,在全世界最大的電腦網絡——互聯網的基礎上,發明了萬維網(World Wide Web),今後能夠在網上瀏覽網頁文件。最先的網頁只能在操做系統的終端裏瀏覽,也就是說只能使用命令行操做,網頁都是在字符窗口中顯示,這固然很是不方便。
1992年末,美國國家超級電腦應用中心(NCSA)開始開發一個獨立的瀏覽器,叫作 Mosaic。這是人類歷史上第一個瀏覽器,今後網頁能夠在圖形界面的窗口瀏覽。
1994年10月,NCSA 的一個主要程序員 Marc Andreessen 聯合風險投資家 Jim Clark,成立了 Mosaic 通訊公司(Mosaic Communications),不久後更名爲 Netscape。這家公司的方向,就是在 Mosaic 的基礎上,開發面向普通用戶的新一代的瀏覽器 Netscape Navigator。
1994年12月,Navigator 發佈了1.0版,市場份額一舉超過90%。
Netscape 公司很快發現,Navigator 瀏覽器須要一種能夠嵌入網頁的腳本語言,用來控制瀏覽器行爲。當時,網速很慢並且上網費很貴,有些操做不宜在服務器端完成。好比,若是用戶忘記填寫「用戶名」,就點了「發送」按鈕,到服務器再發現這一點就有點太晚了,最好能在用戶發出數據以前,就告訴用戶「請填寫用戶名」。這就須要在網頁中嵌入小程序,讓瀏覽器檢查每一欄是否都填寫了。
管理層對這種瀏覽器腳本語言的設想是:功能不須要太強,語法較爲簡單,容易學習和部署。那一年,正逢 Sun 公司的 Java 語言問世,市場推廣活動很是成功。Netscape 公司決定與 Sun 公司合做,瀏覽器支持嵌入 Java 小程序(後來稱爲 Java applet)。可是,瀏覽器腳本語言是否就選用 Java,則存在爭論。後來,仍是決定不使用 Java,由於網頁小程序不須要 Java 這麼「重」的語法。可是,同時也決定腳本語言的語法要接近 Java,而且能夠支持 Java 程序。這些設想直接排除了使用現存語言,好比 Perl、Python 和 TCL。
1995年,Netscape 公司僱傭了程序員 Brendan Eich 開發這種網頁腳本語言。Brendan Eich 有很強的函數式編程背景,但願以 Scheme 語言(函數式語言鼻祖 LISP 語言的一種方言)爲藍本,實現這種新語言。
1995年5月,Brendan Eich 只用了10天,就設計完成了這種語言的初版。它是一個大雜燴,語法有多個來源。
基本語法:借鑑 C 語言和 Java 語言。
數據結構:借鑑 Java 語言,包括將值分紅原始值和對象兩大類。
函數的用法:借鑑 Scheme 語言和 Awk 語言,將函數看成第一等公民,並引入閉包。
原型繼承模型:借鑑 Self 語言(Smalltalk 的一種變種)。
正則表達式:借鑑 Perl 語言。
字符串和數組處理:借鑑 Python 語言。
爲了保持簡單,這種腳本語言缺乏一些關鍵的功能,好比塊級做用域、模塊、子類型(subtyping)等等,可是能夠利用現有功能找出解決辦法。這種功能的不足,直接致使了後來 JavaScript 的一個顯著特色:對於其餘語言,你須要學習語言的各類功能,而對於 JavaScript,你經常須要學習各類解決問題的模式。並且因爲來源多樣,從一開始就註定,JavaScript 的編程風格是函數式編程和麪向對象編程的一種混合體。
Netscape 公司的這種瀏覽器腳本語言,最初名字叫作 Mocha,1995年9月改成 LiveScript。12月,Netscape 公司與 Sun 公司(Java 語言的發明者和全部者)達成協議,後者容許將這種語言叫作 JavaScript。這樣一來,Netscape 公司能夠藉助 Java 語言的聲勢,而 Sun 公司則將本身的影響力擴展到了瀏覽器。
之因此起這個名字,並非由於 JavaScript 自己與 Java 語言有多麼深的關係(事實上,二者關係並不深,詳見下節),而是由於 Netscape 公司已經決定,使用 Java 語言開發網絡應用程序,JavaScript 能夠像膠水同樣,將各個部分鏈接起來。固然,後來的歷史是 Java 語言的瀏覽器插件失敗了,JavaScript 反而發揚光大。
1995年12月4日,Netscape 公司與 Sun 公司聯合發佈了 JavaScript 語言,對外宣傳 JavaScript 是 Java 的補充,屬於輕量級的 Java,專門用來操做網頁。
1996年3月,Navigator 2.0 瀏覽器正式內置了 JavaScript 腳本語言。程序員
3.1)JavaScript 與 Java 的關係
這裏專門說一下 JavaScript 和 Java 的關係。它們是兩種不同的語言,可是彼此存在聯繫。
JavaScript 的基本語法和對象體系,是模仿 Java 而設計的。可是,JavaScript 沒有采用 Java 的靜態類型。正是由於 JavaScript 與 Java 有很大的類似性,因此這門語言才從一開始的 LiveScript 更名爲 JavaScript。基本上,JavaScript 這個名字的原意是「很像Java的腳本語言」。
JavaScript 語言的函數是一種獨立的數據類型,以及採用基於原型對象(prototype)的繼承鏈。這是它與 Java 語法最大的兩點區別。JavaScript 語法要比 Java 自由得多。
另外,Java 語言須要編譯,而 JavaScript 語言則是運行時由解釋器直接執行。
總之,JavaScript 的原始設計目標是一種小型的、簡單的動態語言,與 Java 有足夠的類似性,使得使用者(尤爲是 Java 程序員)能夠快速上手。正則表達式
3.2)JavaScript 與 ECMAScript 的關係
1996年8月,微軟模仿 JavaScript 開發了一種相近的語言,取名爲JScript(JavaScript 是 Netscape 的註冊商標,微軟不能用),首先內置於IE 3.0。Netscape 公司面臨喪失瀏覽器腳本語言的主導權的局面。
1996年11月,Netscape 公司決定將 JavaScript 提交給國際標準化組織 ECMA(European Computer Manufacturers Association),但願 JavaScript 可以成爲國際標準,以此抵抗微軟。ECMA 的39號技術委員會(Technical Committee 39)負責制定和審覈這個標準,成員由業內的大公司派出的工程師組成,目前共25我的。該委員會按期開會,全部的郵件討論和會議記錄,都是公開的。
1997年7月,ECMA 組織發佈262號標準文件(ECMA-262)的初版,規定了瀏覽器腳本語言的標準,並將這種語言稱爲 ECMAScript。這個版本就是 ECMAScript 1.0 版。之因此不叫 JavaScript,一方面是因爲商標的關係,Java 是 Sun 公司的商標,根據一份受權協議,只有 Netscape 公司能夠合法地使用 JavaScript 這個名字,且 JavaScript 已經被 Netscape 公司註冊爲商標,另外一方面也是想體現這門語言的制定者是 ECMA,不是 Netscape,這樣有利於保證這門語言的開放性和中立性。所以, ECMAScript 和 JavaScript 的關係是,前者是後者的規格,後者是前者的一種實現。在平常場合,這兩個詞是能夠互換的。
ECMAScript 只用來標準化 JavaScript 這種語言的基本語法結構,與部署環境相關的標準都由其餘標準規定,好比 DOM 的標準就是由 W3C組織(World Wide Web Consortium)制定的。
ECMA-262 標準後來也被另外一個國際標準化組織 ISO(International Organization for Standardization)批准,標準號是 ISO-16262。數據庫
3.3)JavaScript 的版本
1997年7月,ECMAScript 1.0發佈。
1998年6月,ECMAScript 2.0版發佈。
1999年12月,ECMAScript 3.0版發佈,成爲 JavaScript 的通行標準,獲得了普遍支持。
2007年10月,ECMAScript 4.0版草案發布,對3.0版作了大幅升級,預計次年8月發佈正式版本。草案發布後,因爲4.0版的目標過於激進,各方對因而否經過這個標準,發生了嚴重分歧。以 Yahoo、Microsoft、Google 爲首的大公司,反對 JavaScript 的大幅升級,主張小幅改動;以 JavaScript 創造者 Brendan Eich 爲首的 Mozilla 公司,則堅持當前的草案。
2008年7月,因爲對於下一個版本應該包括哪些功能,各方分歧太大,爭論過於激進,ECMA 開會決定,停止 ECMAScript 4.0 的開發(即廢除了這個版本),將其中涉及現有功能改善的一小部分,發佈爲 ECMAScript 3.1,而將其餘激進的設想擴大範圍,放入之後的版本,因爲會議的氣氛,該版本的項目代號起名爲 Harmony(和諧)。會後不久,ECMAScript 3.1 就更名爲 ECMAScript 5。
2009年12月,ECMAScript 5.0版 正式發佈。Harmony 項目則一分爲二,一些較爲可行的設想定名爲 JavaScript.next 繼續開發,後來演變成 ECMAScript 6;一些不是很成熟的設想,則被視爲 JavaScript.next.next,在更遠的未來再考慮推出。TC39 的整體考慮是,ECMAScript 5 與 ECMAScript 3 基本保持兼容,較大的語法修正和新功能加入,將由 JavaScript.next 完成。當時,JavaScript.next 指的是ECMAScript 6。第六版發佈之後,將指 ECMAScript 7。TC39 預計,ECMAScript 5 會在2013年的年中成爲 JavaScript 開發的主流標準,並在此後五年中一直保持這個位置。
2011年6月,ECMAScript 5.1版發佈,而且成爲 ISO 國際標準(ISO/IEC 16262:2011)。到了2012年末,全部主要瀏覽器都支持 ECMAScript 5.1版的所有功能。
2013年3月,ECMAScript 6 草案凍結,再也不添加新功能。新的功能設想將被放到 ECMAScript 7。
2013年12月,ECMAScript 6 草案發布。而後是12個月的討論期,聽取各方反饋。
2015年6月,ECMAScript 6 正式發佈,而且改名爲「ECMAScript 2015」。這是由於 TC39 委員會計劃,之後每一年發佈一個 ECMAScript 的版本,下一個版本在2016年發佈,稱爲「ECMAScript 2016」,2017年發佈「ECMAScript 2017」,以此類推。編程