[TOC]
每當我開始閱讀一本很厚的書,總是先問自己,它值得我這樣做嗎?
讀完一本書,就像完成一段旅程。有些旅程會讓你終身回憶,而另一些旅程讓你后悔不迭,不應該將寶貴的生命浪費在它之上。
所以我想,在讀者開始閱讀這本教程之前,我最好也談談為什么要學JavaScript,它有什么用?一方面,我不希望有人因為讀了我的書而后悔;另一方面,這本教程的厚度也許讓人望而生畏,有些部分相對枯燥,還有些部分并不容易掌握,如果你清楚地知道閱讀的目的,將會比較容易堅持下去。當然,我可以保證,雖然這本教程很厚,但是沒有廢話,講的都是有用的東西。
總的來說,JavaScript語言有一些顯著特點,使得它非常值得學習。它既適合當作學習編程的入門語言,也適合當作日常開發的工作語言。它是目前最有希望、前途最光明的計算機語言之一。
## 操控瀏覽器的能力
JavaScript的發明目的,就是作為瀏覽器的內置腳本語言,為網頁開發者提供操控瀏覽器的能力。它是目前唯一一種通用的瀏覽器腳本語言,所有主流瀏覽器全部支持。它可以讓網頁呈現各種特殊效果,為用戶提供良好的互動體驗。
目前,全世界大部分網頁都使用JavaScript。如果不用,網站的易用性和使用效率將大打折扣,無法成為操作便利、對用戶友好的網站。
對于一個互聯網開發者來說,如果你想提供漂亮的網頁、令用戶滿意的上網體驗、各種基于瀏覽器的便捷功能、前后端之間緊密高效的聯系,JavaScript是必不可少的工具。
## 廣泛的使用領域
近年來,JavaScript的使用范圍,慢慢超越了瀏覽器,正在向通用的系統語言發展。
(1)瀏覽器的平臺化
隨著HTML 5的出現,瀏覽器本身的功能越來越強,不再僅僅能瀏覽網頁,而是越來越像一個平臺,JavaScript因此得以調用許多系統功能,比如操作本地文件、操作圖片、調用攝像頭和麥克風等等。這使得JavaScript可以完成許多以前無法想象的事情。
(2)Node.js
Node.js項目使得JavaScript可以用于開發服務器端的大型項目,網站的前后端都用JavaScript開發已經成為了現實。有些嵌入式平臺(Raspberry Pi)能夠安裝Node.js,于是JavaScript就能為這些平臺開發應用程序。
(3)數據庫操作
JavaScript甚至也可以用來操作數據庫。NoSQL數據庫這個概念,本身就是在JSON(JavaScript Object Notation,JavaScript對象表示法)格式的基礎上誕生的,大部分NoSQL數據庫允許JavaScript直接操作。基于SQL語言的開源數據庫PostgreSQL支持JavaScript作為操作語言,可以部分取代SQL查詢語言。
(4)跨移動平臺
PhoneGap項目使得JavaScript可以開發在多種移動平臺(iOS和Android)上使用的應用程序。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項目](http://developer.chrome.com/apps/about_apps)、以及[TideSDK項目](http://www.tidesdk.org/),可以用來編寫運行于Windows、Mac OS和Android等多個桌面平臺的程序,不依賴瀏覽器。
(7)小結
可以預期,JavaScript最終將能讓你只用一種語言,就開發出適應不同平臺(包括桌面端、服務器端、手機端)的程序。根據2013年9月的[統計](http://adambard.com/blog/top-github-languages-for-2013-so-far/),JavaScript是本年度代碼托管網站Github上使用量排名第一的語言。
著名程序員Jeff Atwood甚至提出了一條[“Atwood定律”](http://www.codinghorror.com/blog/2007/07/the-principle-of-least-power.html):
> “所有可以用JavaScript編寫的程序,最終都會出現JavaScript的版本。”(Any application that can be written in JavaScript will eventually be written in JavaScript.)
## 易學性
相比學習其他語言,學習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》](http://javascript.crockford.com/),言下之意就是這門語言不好的地方很多,必須寫一本書才能講清楚。另外一些程序員則感到,為了更合理地編寫JavaScript程序,就不能用JavaScript來寫,而必須發明新的語言,比如CoffeeScript、TypeScript、Dart這些新語言的發明目的,多多少少都有這個因素。
盡管如此,目前看來,JavaScript的地位還是無法動搖。加之,語言標準的快速進化,使得JavaScript功能日益增強,而語法缺陷和怪異之處得到了彌補。所以,JavaScript還是值得學習,況且它的入門真的不難。
## 強大的性能
JavaScript的性能優勢體現在以下方面。
(1)靈活的語法,表達力強。
JavaScript既支持類似C語言清晰的過程式編程,也支持靈活的函數式編程。可以用來寫并發處理(concurrent)。這些語法特性已經被證明非常強大,可以用于許多場合,尤其適用非同步編程。
JavaScript的所有值都是對象,這為程序員提供了靈活性和便利性。因為你可以很方便地、按照需要隨時創造數據結構,不用進行麻煩的預定義。
JavaScript的標準還是快速進化中,并不斷合理化,并添加更適用的語法特性。
(2)支持編譯運行。
JavaScript語言本身,雖然是一種解釋型語言,但是在現代瀏覽器中,JavaScript都是編譯后運行。程序會被高度優化,運行效率接近二進制程序。而且,JavaScript引擎正在快速發展,性能將越來越好。
(3)事件驅動和非阻塞式設計。
JavaScript程序可以采用事件驅動(event-driven)和非阻塞式(non-blocking)設計,在服務器端適合高并發環境,普通的硬件就可以承受很大的訪問量。
## 開放性
JavaScript是一種開放的語言。它的標準是國際標準,寫得非常詳盡明確;主要的設計和實現都是開放的,而且質量很高;不屬于任何公司或個人,不存在版權和專利的問題。
行業內的主要公司都支持它,單單是解釋器就有好幾個品種,兼容性很好,不做調整或只做很小的調整,它編寫的程序就能在所有瀏覽器上運行。
## 社區支持
全世界程序員都在使用JavaScript,它有著極大的社區、廣泛的文獻和圖書、豐富的代碼資源。絕大部分你需要用到的功能,都有多個開源函數庫可供選用。
作為項目負責人,你不難招聘到數量眾多的JavaScript程序員;作為開發者,你也不難找到一份JavaScript的工作。
- 第一章 導論
- 1.1 前言
- 1.2 為什么學習JavaScript?
- 1.3 JavaScript的歷史
- 第二章 基本語法
- 2.1 語法概述
- 2.2 數值
- 2.3 字符串
- 2.4 對象
- 2.5 數組
- 2.6 函數
- 2.7 運算符
- 2.8 數據類型轉換
- 2.9 錯誤處理機制
- 2.10 JavaScript 編程風格
- 第三章 標準庫
- 3.1 Object對象
- 3.2 Array 對象
- 3.3 包裝對象和Boolean對象
- 3.4 Number對象
- 3.5 String對象
- 3.6 Math對象
- 3.7 Date對象
- 3.8 RegExp對象
- 3.9 JSON對象
- 3.10 ArrayBuffer:類型化數組
- 第四章 面向對象編程
- 4.1 概述
- 4.2 封裝
- 4.3 繼承
- 4.4 模塊化編程
- 第五章 DOM
- 5.1 Node節點
- 5.2 document節點
- 5.3 Element對象
- 5.4 Text節點和DocumentFragment節點
- 5.5 Event對象
- 5.6 CSS操作
- 5.7 Mutation Observer
- 第六章 瀏覽器對象
- 6.1 瀏覽器的JavaScript引擎
- 6.2 定時器
- 6.3 window對象
- 6.4 history對象
- 6.5 Ajax
- 6.6 同域限制和window.postMessage方法
- 6.7 Web Storage:瀏覽器端數據儲存機制
- 6.8 IndexedDB:瀏覽器端數據庫
- 6.9 Web Notifications API
- 6.10 Performance API
- 6.11 移動設備API
- 第七章 HTML網頁的API
- 7.1 HTML網頁元素
- 7.2 Canvas API
- 7.3 SVG 圖像
- 7.4 表單
- 7.5 文件和二進制數據的操作
- 7.6 Web Worker
- 7.7 SSE:服務器發送事件
- 7.8 Page Visibility API
- 7.9 Fullscreen API:全屏操作
- 7.10 Web Speech
- 7.11 requestAnimationFrame
- 7.12 WebSocket
- 7.13 WebRTC
- 7.14 Web Components
- 第八章 開發工具
- 8.1 console對象
- 8.2 PhantomJS
- 8.3 Bower:客戶端庫管理工具
- 8.4 Grunt:任務自動管理工具
- 8.5 Gulp:任務自動管理工具
- 8.6 Browserify:瀏覽器加載Node.js模塊
- 8.7 RequireJS和AMD規范
- 8.8 Source Map
- 8.9 JavaScript 程序測試
- 第九章 JavaScript高級語法
- 9.1 Promise對象
- 9.2 有限狀態機
- 9.3 MVC框架與Backbone.js
- 9.4 嚴格模式
- 9.5 ECMAScript 6 介紹
- 附錄
- 10.1 JavaScript API列表
- 草稿一:函數庫
- 11.1 Underscore.js
- 11.2 Modernizr
- 11.3 Datejs
- 11.4 D3.js
- 11.5 設計模式
- 11.6 排序算法
- 草稿二:jQuery
- 12.1 jQuery概述
- 12.2 jQuery工具方法
- 12.3 jQuery插件開發
- 12.4 jQuery.Deferred對象
- 12.5 如何做到 jQuery-free?
- 草稿三:Node.js
- 13.1 Node.js 概述
- 13.2 CommonJS規范
- 13.3 package.json文件
- 13.4 npm模塊管理器
- 13.5 fs 模塊
- 13.6 Path模塊
- 13.7 process對象
- 13.8 Buffer對象
- 13.9 Events模塊
- 13.10 stream接口
- 13.11 Child Process模塊
- 13.12 Http模塊
- 13.13 assert 模塊
- 13.14 Cluster模塊
- 13.15 os模塊
- 13.16 Net模塊和DNS模塊
- 13.17 Express框架
- 13.18 Koa 框架