文章摘要: 當被要求第一次使用 JavaScript 編寫程式碼時下面使用 JavaScript 重新編寫了上面的程式
這是一本關於指導電腦的書。時至今日,計算機就像螺絲刀一樣隨處可見,但相比於螺絲刀而言,計算機更復雜一些,並且,讓他們做你想讓他們做的事情,並不總是那麼容易。
如果你讓計算機執行的任務是常見的,易於理解的任務,例如向你顯示你的電子郵件,或像計算器一樣工作,則可以開啟相應的應用並開始工作。 但對於獨特的或開放式的任務,應用可能不存在。
這就是程式設計可能出現的地方。程式設計是構建一個程式的行為 – 它是一組精確的指令,告訴計算機做什麼。 由於計算機是愚蠢的,迂腐的野獸,程式設計從根本上是乏味和令人沮喪的。
幸運的是,如果你可以克服這個事實,並且甚至可以享受愚蠢機器可以處理的嚴謹思維,那麼程式設計可以是非常有益的。 它可以讓你在幾秒鐘內完成手動操作。 這是一種方法,讓你的電腦工具去做它以前做不到的事情。 它也提供了抽象思維的優秀練習。
大多數程式設計都是用程式語言完成的。 程式語言是一種人工構建的語言,用於指導計算機。 有趣的是,我們發現與電腦溝通的最有效的方式,與我們彼此溝通的方式相差太大。 與人類語言一樣,計算機語言可以以新的方式組合詞語和片語,從而可以表達新的概念。
在某種程度上,基於語言的介面,例如 80 年代和 90 年代的 BASIC 和 DOS 提示符,是與計算機互動的主要方法。 這些已經在很大程度上被視覺介面取代,這些視覺介面更容易學習,但提供更少的自由。 計算機語言仍然存在,如果你知道在哪裏看到。 每種現代 Web 瀏覽器都內建了一種這樣的語言,即 JavaScript,因此幾乎可以在所有裝置上使用。
本書將試圖讓你足夠了解這門語言,從而完成有用和有趣的東西。
關於程式設計
除了講解 JavaScript 之外,本書也會介紹一些程式設計的基本原則。程式設計還是比較複雜的。程式設計的基本規則簡單清晰,但在這些基本規則之上構建的程式卻容易變得複雜,導致程式產生了自己的規則和複雜性。即便程式是按照你自己的思路去構建的,你也有可能迷失在程式碼之間。
在閱讀本書時,你有可能會覺得書中的概念難以理解。如果你剛剛開始學習程式設計,那麼你估計還有不少東西需要掌握呢。如果你想將所學知識融會貫通,那麼就需要去多參考和學習一些資料。
是否付出必要的努力完全取決於你自己。當你閱讀本書的時候發現任何難點,千萬不要輕易就對自己的能力下結論。只要能堅持下去,你就是好樣的。稍做休息,複習一下所學的知識點,始終確保自己閱讀並理解了示例程式和相關的練習。學習是一項艱鉅的任務,但你掌握的所有知識都屬於你自己,而且今後的學習道路會愈加輕鬆。
當行動無利可圖時,就收集資訊;當資訊無利可圖時,就休息。
Ursula K. Le Guin,《The Left Hand of Darkness》
一個程式有很多含義:它是開發人員編寫的一段文字、計算機執行的一段指令集合、計算機記憶體當中的資料以及控制記憶體中資料的操作集合。我們通常很難將程式與我們日常生活中熟悉的事物進行對比。有一種表面上比較恰當的比喻,即將程式視作包含許多元件的機器,爲了讓機器正常工作,這些元件通過內部通訊來實現整個機器的正常運轉。
計算機是一臺物理機器,充當這些非物質機器的載體。計算機本身並不能實現多麼複雜的功能,但計算機之所以有用是因為它們的運算速度非常快。而程式的作用就是將這些看似簡單的動作組合起來,然後實現複雜的功能。
程式是思想的結晶。編寫程式不需要什麼物質投入,它很輕量級,通過我們的雙手創造。
但如果不稍加註意,程式的體積和複雜度就會失去控制,甚至程式碼的編寫者也會感到迷惑。在可控的範圍內編寫程式是程式設計過程中首要解決的問題。當程式執行時,一切都是那麼美好。程式設計的精粹就在於如何更好地控制複雜度。質量高的程式的複雜度都不會太高。
很多開發人員認為,控制程式複雜度的最好方法就是避免使用不熟悉的技術。他們制定了嚴格的規則(「最佳實踐」),並小心翼翼地呆在他們安全區內。
這不僅無聊,而且也是無效的。新問題往往需要新的解決方案。程式設計領域還很年輕,仍然在迅速發展,並且多樣到足以為各種不同的方法留出空間。在程式設計中有許多可怕的錯誤,你應該繼續犯錯,以便你能理解它們。好的程式看起來是什麼樣的感覺,是在實踐中發展的,而不是從一系列規則中學到的。
為什麼編語言重要
在計算技術發展伊始,並沒有程式語言這個概念。程式看起來就像這樣:
00110001 00000000 00000000
00110001 00000001 00000001
00110011 00000001 00000010
01010001 00001011 00000010
00100010 00000010 00001000
01000011 00000001 00000000
01000001 00000001 00000001
00010000 00000010 00000000
01100010 00000000 00000000
該程式計算數字 1~10 之和,並列印出結果: 1+2+...+10=55
。該程式可以執行在一個簡單的機器上。在早期計算機上程式設計時,我們需要在正確的位置設定大量開關陣列,或在紙帶上穿孔並將紙帶輸入計算機中。你可以想象這個過程是多麼冗長乏味且易於出錯。即便是編寫非常簡單的程式,也需要有經驗的人耗費很大精力才能完成。編寫複雜的程式則更是難上加難。
當然了,手動輸入這些晦澀難懂的位序列(1 和 0)來編寫程式的確能讓程式設計師感到很有成就感,而且能給你的職業帶來極大的滿足感。
在上面的程式中,每行都包含一條指令。我們可以用中文來描述這些指令:
- 將數字 0 儲存在記憶體地址中的位置 0。
- 將數字 1 儲存在記憶體地址的位置 1。
- 將記憶體地址的位置 1 中的值儲存在記憶體地址的位置 2。
- 將記憶體地址的位置 2 中的值減去數字 11。
- 如果記憶體地址的位置 2 中的值是 0,則跳轉到指令 9。
- 將記憶體地址的位置 1 中的值加到記憶體地址的位置 0。
- 將記憶體地址的位置 1 中的值加上數字 1。
- 跳轉到指令 3。
- 輸出記憶體地址的位置 0 中的值。
雖說這已經比一大堆位序列要好讀了許多,但仍然不清晰。使用名稱而不是數字用於指令和儲存位置有所幫助:
Set 「total」 to 0.
Set 「count」 to 1.
[loop]
Set 「compare」 to 「count」.
Subtract 11 from 「compare」.
If 「compare」 is zero, continue at [end].
Add 「count」 to 「total」.
Add 1 to 「count」.
Continue at [loop].
[end]
Output 「total」.
現在你能看出該程式是如何工作的嗎?前兩行程式碼初始化兩個記憶體位置的值: total
用於儲存累加計算結果,而 count
則用於記錄當前數字。你可能覺得 compare
的那行程式碼看起來有些奇怪。程式想根據 count
是否等於 11 來決定是否應該停止執行。因為我們的機器相當原始,所以只能測試一個數字是否為 0,並根據它做出決策。因此程式用名為 compare
的記憶體位置存放 count–11
的值,並根據該值是否為 0 決定是否跳轉。接下來兩行將 count
的值累加到結果上,並將 count
加 1,直到 count
等於 11
為止。
下面使用 JavaScript 重新編寫了上面的程式:
let total = 0, count = 1;
while (count <= 10) {
total += count;
count += 1;
}
console.log(total);
// → 55
這個版本的程式得到了一些改進。更為重要的是,我們再也不需要指定程式如何來回跳轉了,而是由 while
結構負責完成這個任務。只要我們給予的條件成立, while
語句就會不停地執行其下方的語句塊(包裹在大括號中)。而我們給予的條件是 count<=10
,意思是「 count
小於等於 10」。我們再也不需要建立臨時的值並將其與 0 比較,那樣的程式碼十分煩瑣。程式語言的一項職責就是,能夠幫助我們處理這些煩瑣無趣的邏輯。
在程式的結尾,也就是 while
語句結束後,我們使用 console.log
操作來輸出結果。
最後,我們恰好有 range
和 sum
這類方便的操作。下面程式碼中的 range
函式用於建立數字集合, sum
函式用於計算數字集合之和:
console.log(sum(range(1, 10)));
// → 55
我們可以從這裏瞭解到,同一個程式的長度可長可短,可讀性可高可低。第一個版本的程式晦澀難懂,而最後一個版本的程式則接近於人類語言的表達方式:將 1~10 範圍內的數字之和記錄下來(我們會在後面的章節中詳細介紹如何編寫 sum
和 range
這樣的函式)。
優秀的程式語言可以為開發人員提供更高層次的抽象,使用類似於人類語言的方式來與計算機進行互動。它有助於省略細節,提供便捷的積木(比如 while
和 console.log
),允許你定義自己的積木(比如 sum
和 range
函式),並使這些積木易於編寫。。
什麼是 JavaScript
JavaScript 誕生於 1995 年。起初,Netscape Navigator 瀏覽器將其運用在網頁上新增程式。自此以後,各類主流圖形網頁瀏覽器均採用了 JavaScript。JavaScript 使得現代網頁應用程式成為可能 —— 使用 JavaScript 可以直接與使用者互動,從而避免每一個動作都需要重新載入頁面。但有許多傳統網站也會使用 JavaScript 來提供實時互動以及更加智慧的表單功能。
JavaScript 其實和名為Java的程式設計語言沒有任何關係。起了這麼一個相似的名字完全是市場考慮使然,這並非是一個明智的決定。當 JavaScript 出現時,Java 語言已在市場上得到大力推廣且擁有了極高人氣,因此某些人覺得依附於 Java 的成功是個不錯的主意。而我們現在已經無��擺脫這個名字了。
在 JavaScript 被廣泛採用之後,ECMA 國際制訂了一份標準文件來描述 JavaScript 的工作行為,以便所有聲稱支援 JavaScript 的軟體都使用同一種語言。標準化完成後,該標準被稱為 ECMAScript 標準。實際上,術語 ECMAScript 和 JavaScript 可以交換使用。它們不過是同一種語言的兩個名字而已。
許多人會說 JavaScript 語言的壞話。這其中有很多這樣的言論都是正確的。當被要求第一次使用 JavaScript 編寫程式碼時,我當時就覺得這門語言難以駕馭。JavaScript 接受我輸入的任何程式碼,但是又使用和我的想法完全不同的方式來解釋程式碼。由於我沒有任何線索知道我之前做了什麼,因此我需要做出更多工作,但這也就存在一個實際問題:我們可以自由使用 JavaScript,而這種自由卻幾乎沒有限度。這種設計其實是希望初學者更容易使用 JavaScript 編寫程式。但實際上,系統不會指出我們錯在何處,因此從程式中找出問題變得更加棘手。
但這種自由性也有其優勢,許多技術在更為嚴格的語言中不可能實現,而在 JavaScript 中則留下了實現的餘地,正如你看到的那樣(比如第十章),有些優勢可以彌補 JavaScript 的一些缺點。在正確地學習 JavaScript 並使用它工作了一段時間後,我真正喜歡上了 JavaScript。
JavaScript 版本眾多。大約在 2000~2010 年間,這正是 JavaScript 飛速發展的時期,瀏覽器支援最多的是 ECMAScript 3。在此期間,ECMA 著手製定 ECMAScript 4,這是一個雄心勃勃的版本,ECMA 計劃在這個版本中加入許多徹底的改進與擴充套件。但由於 ECMAScript 3 被廣泛使用,這種過於激進的修改必然會遭遇重重阻礙,最後 ECMA 不得不於 2008 年放棄了版本 4 的制定。這就產生了不那麼雄心勃勃的版本 5,這只是一些沒有爭議的改進,出現在 2009 年。 然後版本 6 在 2015 年誕生,這是一個重大的更新,其中包括計劃用於版本 4 的一些想法。從那以後,每年都會有新的更新。
語言不斷髮展的事實意味著,瀏覽器必須不斷跟上,如果你使用的是較老的瀏覽器,它可能不支援每個特性。 語言設計師會注意,不要做任何可能破壞現有程式的改變,所以新的瀏覽器仍然可以執行舊的程式。 在本書中,我使用的是 2017 版的 JavaScript。
Web 瀏覽器並不是唯一一個可以執行 JavaScript 的平臺。有些資料庫,比如 MongoDB 和 CouchDB,也使用 JavaScript 作為指令碼語言和查詢語言。一些桌面和伺服器開發的平臺,特別是 Node.js 專案(第二十章介紹),為瀏覽器以外的 JavaScript 程式設計提供了一個環境。
本書概覽
本書包括三個部分。前十二章討論 JavaScript 語言本身的一些特性。接下來的 8 章討論網頁瀏覽器和 JavaScript 在網頁程式設計中的實踐。最後兩章專門講解另一個使用 JavaScript 程式設計的環境 —— Node.js。
縱觀本書,共有 5 個專案實戰章,用於講解規模較大的示例程式,你可以通過這些章來仔細品味真實的程式設計過程。根據專案出現次序,我們會陸續構建遞送機器人(7)、程式設計語言(12)、平臺遊戲(16)、畫素繪圖程式(19)和一個動態網站(21)。
本書介紹程式語言時,首先使用4章來介紹 JavaScript 語言的基本結構,包括第二章控制結構(比如在本前言中看到的 while
單詞)、第三章函式(編寫你自己的積木)和第四章數據結構。此後你就可以編寫簡單的程式了。接下來,第五章和第六章介紹函式和物件的運用技術,以編寫更加抽象的程式碼並以此來控制複雜度。
介紹完第一個專案實戰(7)之後,將會繼續講解語言部分,例如第八章錯誤處理和 bug 修復、第九章正規表示式(處理文字資料的重要工具)、第十章模組化(解決複雜度的問題)以及第十一章非同步程式設計(處理需要時間的事件)。第二個專案實戰章節(12)則是對本書第一部分的總結。
第二部分(第十三章到第十九章),闡述了瀏覽器 JavaScript 中的一些工具。你將會學到在螢幕上顯示某些元素的方法(第十四章與第十七章),響應使用者輸入的方法(第十五章)和通過網路通訊的方法(第十八章)。這部分又有兩個專案實戰章節。
此後,第二十章闡述 Node.js,而第二十一章使用該工具構建一個簡單的網頁系統。
本書版式約定
本書中存在大量程式碼,程式(包括你迄今為止看到的一些示例)程式碼的字型如下所示:
function factorial(n) {
if (n == 0) {
return 1;
} else {
return factorial(n - 1) * n;
}
}
爲了展示程式產生的輸出,本書常在程式碼後編寫程式碼期望輸出,輸出結果前會加上兩個反斜槓和一個箭頭。
console.log(factorial(8));
// → 40320
祝好運!
ASP.NET MVC4開發指南PDF掃描版+原始碼完整版可從以下資訊得到下載:
點選這個 http://www.linuxidc.com/Linux/2013-12/93755.htm 連結 關注 Linux公社官方微信 ,關注後回覆數字 152679 。即可得到網友的分享密碼。
如果取消關注Linux公社公眾號,即使再次關注,也將無法提供本服務!
連結: https://pan.baidu.com/s/1aajOu_tkOLnELeuDxBttBw 密碼:獲得見上面的方法,地址失效請在下面留言。
------------------------------------------分割線------------------------------------------
也可以到Linux公社1號FTP伺服器下載
FTP地址: ftp://ftp1.linuxidc.com
使用者名稱:ftp1.linuxidc.com
密碼:www.linuxidc.com
在 2018年LinuxIDC.com//6月/JavaScript 程式設計精解 中文第三版 PDF+原始碼/
下載方法見 http://www.linuxidc.com/Linux/2013-10/91140.htm
------------------------------------------分割線------------------------------------------
Linux公社的RSS地址 : https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址: https://www.linuxidc.com/Linux/2018-06/152679.htm