出版時間:2012-10-1 出版社:機械工業(yè)出版社華章公司 作者:Marijn Haverbeke 頁數(shù):162 譯者:徐濤
Tag標(biāo)簽:無
前言
前言20世紀(jì)70年代,業(yè)界首次推出個人計算機時,大多數(shù)計算機都內(nèi)置一種簡單的編程語言—通常是BASIC的變體,人與計算機之間的互動需要通過這種語言實現(xiàn)。這意味著,對天生喜歡鉆研技術(shù)的人來說,從單純使用計算機到編程的過渡非常容易?,F(xiàn)在的計算機相比20世紀(jì)70年代的功能更加強大,價格也更加便宜,軟件接口呈現(xiàn)的是使用鼠標(biāo)操作的靈活圖形界面,而不是語言界面。這使計算機更容易使用,總的來說,這是一個巨大的進步。然而,這也在計算機用戶與編程世界之間制造了一個障礙—業(yè)余愛好者必須積極尋找自己的編程環(huán)境,而不是一打開電腦就呈現(xiàn)的環(huán)境。實質(zhì)上,計算機系統(tǒng)仍然被各種編程語言控制。大多數(shù)的編程語言都比早期個人計算機中的BASIC語言更加先進。例如,本書的主題—JavaScript語言,就存在于每一款主流Web瀏覽器中。關(guān)于編程不憤不啟,不悱不發(fā)。舉一隅不以三隅反,則不復(fù)也?!鬃颖緯私榻BJavaScript外,也致力于介紹編程的基本原理。事實上,這種編程還是比較難的。編程的基本規(guī)則通常都簡單明了,但計算機程序構(gòu)建在這些基本規(guī)則之上后,會變得很復(fù)雜,產(chǎn)生了其自身的規(guī)則和復(fù)雜性。正因為如此,編程并不是那么簡單或可預(yù)測的。正如計算機科學(xué)的鼻祖高德納(Donald Knuth)所說,編程是一門藝術(shù),而不是一門科學(xué)。要想從本書里獲取最大收獲,不能僅僅依靠被動閱讀。一定要集中注意力去理解示例代碼,只有確定自己真正理解了前面的內(nèi)容,才能繼續(xù)往下閱讀。程序員對其創(chuàng)造的宇宙負全部責(zé)任,因為他們是創(chuàng)造者。以計算機程序的形式,可創(chuàng)造出無限復(fù)雜的宇宙。——Joseph Weizenbaum,《Computer Power and Human Reason》一個程序包含很多含義。它是程序員敲出的一串字符,是計算機運行的指向力,是計算機內(nèi)存中的數(shù)據(jù),還控制同一個內(nèi)存上的執(zhí)行動作。僅使用熟悉的類推法比較程序與對象往往還不夠,因為從表面上看適合該操作的是機器。機械表的齒輪巧妙地嚙合在一起,如果表的制造者技術(shù)很棒,它就能夠連續(xù)多年準(zhǔn)確地顯示時間。計算機程序的元素也以類似的方式組合在一起,如果程序員知道自己在做什么,那么這個程序就能夠正常運行而不會崩潰。計算機作為這些無形機器的載體而存在。計算機本身只會做簡單直接的工作。它們之所以如此有用,是因為它們能夠以驚人的速度完成這些工作。程序可以巧妙地把許多簡單動作結(jié)合起來,去完成非常復(fù)雜的工作。對有些人來說,編寫計算機程序是一種很有趣的游戲。程序是思想的構(gòu)筑,它零成本、零重量,在我們的敲打中不斷發(fā)展。如果我們不細心,它的規(guī)模和復(fù)雜性將失去控制,甚至創(chuàng)造者也會感到混亂。這就是編程的主要問題:控制好程序。程序在工作時是很不可思議的,編程的藝術(shù)就是控制復(fù)雜性的技巧,好的程序其復(fù)雜性也會降低。如今,很多程序員認(rèn)為只要在程序中使用少量易于理解的技術(shù),就可以最有效地降低復(fù)雜性。他們制定了嚴(yán)格的編程規(guī)則(最佳實踐)及書寫格式,那些破壞規(guī)則的人被稱為“差勁”的程序員。豐富多彩的編程世界里包含了太多的復(fù)雜性!讓我們努力將程序變得簡單和可預(yù)測,并為所有奇妙和優(yōu)美的程序制定禁忌規(guī)則。編程技術(shù)的前景是廣闊的,其多樣性使人著迷,它的世界仍有很多未被探索的部分。編程過程中有很多陷阱和圈套,缺乏經(jīng)驗的程序員會犯各類糟糕的錯誤,告誡我們需要謹(jǐn)慎,并保持頭腦清醒。學(xué)習(xí)編程時總是需要探索新的挑戰(zhàn)、新的領(lǐng)域,拒絕不斷探索的程序員必定會停滯不前、忘記編程的快樂、并失去編程的意志(或成為管理人員)。語言為何很重要在計算機誕生初期并沒有編程語言。程序看起來就像這樣:這是一個從1加到10并輸出結(jié)果(1 + 2 +…+ 10 = 55)的程序。它可以在一個非常簡單、理想化的計算機上運行。為早期的計算機編制程序時,必須在正確的位置設(shè)置一排排的開關(guān)或者在紙帶上打上一系列有規(guī)律的孔點,這樣才能將程序傳遞給計算機。可以想象這個過程有多么繁瑣和易出錯。即使編寫簡單的程序也需要使用很多腦力和規(guī)則,編寫復(fù)雜的程序更是不可想象。當(dāng)然,手動輸入這些二進制位(即以上這些1和0的統(tǒng)稱)的神秘組合,讓程序員感覺自己像巫師一樣擁有強大的魔力,而且還能夠獲得工作滿足感,因此這點還是很值得的。程序的每一行都包含一條單獨的指令??梢杂谜Z言這樣描述:1)將數(shù)字0保存在第0個存儲單元;2)將數(shù)字1保存在第1個存儲單元;3)將第1個存儲單元的值保存在第2個存儲單元;4)將第2個存儲單元中的值減去數(shù)字11;5)如果第2個存儲單元中的值是數(shù)字0,則繼續(xù)執(zhí)行指令9;6)將第1個存儲單元的值添加至第0個存儲單元;7)將數(shù)字1添加至第1個存儲單元;8)繼續(xù)執(zhí)行指令3;9)輸出第0個存儲單元的值。雖然這比二進制位易讀,但仍然令人不快。用名稱代替指令和存儲單元的數(shù)字或許更有幫助。在這里不難看出程序是如何運行的。前兩行代碼為兩個存儲單元賦予初始值:total用于創(chuàng)建計算的結(jié)果,count記錄當(dāng)前看到的數(shù)字。使用compare的行可能是最令人費解的地方。該程序的目的是判斷count是否等于11,從而確定能否停止運行。由于該機器相當(dāng)原始,它只能測試一個數(shù)字是否為零,并在此基礎(chǔ)上做出判斷(跳轉(zhuǎn)),因此它使用標(biāo)記compare的存儲單元來計算count的值,即11,并在該值的基礎(chǔ)上做出判斷。后面兩行代碼將count的值添加到結(jié)果total上,當(dāng)程序判斷count不是11時,為count加1。下面是用JavaScript編寫的有同樣效果的程序。這段程序有了更多的改進。最重要的是,不再需要指定程序來回轉(zhuǎn)換的方式,while這個神奇的單詞會幫助解決這個問題。只要滿足給定的條件:count
內(nèi)容概要
如果你只想閱讀一本關(guān)于JavaScript的圖書,那么本書應(yīng)該是你的首選。本書由世界級JavaScript程序員撰寫,JavaScript之父和多位JavaScript專家鼎力推薦。本書適合作為系統(tǒng)學(xué)習(xí)JavaScript的參考書,它在寫作思路上幾乎與現(xiàn)有的所有同類書都不同,打破常規(guī),將編程原理與運用規(guī)則完美地結(jié)合在一起,而且將所有知識點與一個又一個經(jīng)典的編程故事融合在一起,讀者可以在輕松的游戲式開發(fā)中學(xué)會JavaScript程序設(shè)計,趣味性十足,可操作性極強。
全書一共12章:第1~3章介紹了JavaScript的基本語法,旨在幫助讀者編寫出正確的JavaScript程序,包含數(shù)字、算術(shù)、字符串、變量、程序結(jié)構(gòu)、控制流程、類型、函數(shù)、對象和數(shù)組等最基礎(chǔ)和最核心的內(nèi)容;第4~7章講解了JavaScript編程中的高級技術(shù),目的是幫助讀者編寫更復(fù)雜的JavaScript程序,主要涉及錯誤處理、函數(shù)式編程、面向?qū)ο缶幊獭⒛K化等重要內(nèi)容;第8~12章則將重心轉(zhuǎn)移到JavaScript環(huán)境中可用的工具上,分別詳細講解了正則表達式、與Web編程相關(guān)的知識、文檔對象模型、瀏覽器事件和HTTP請求等。
作者簡介
Marijn
Haverbeke 世界級JavaScript程序員,通曉多種編程語言,在Web開發(fā)方面積累了豐富的經(jīng)驗,在JavaScript領(lǐng)域頗有影響力。如今,他專注于動態(tài)語言下的數(shù)據(jù)庫系統(tǒng)的研究和Web
API的設(shè)計。此外,他創(chuàng)建并維護著多個流行的開源項目。
書籍目錄
對本書的贊譽
譯者序
前言
第1章 JavaScript基礎(chǔ):值、變量、控制流程
1.1 值
1.1.1 數(shù)字
1.1.2 算術(shù)
1.1.3 字符串
1.1.4 一元操作符
1.1.5 布爾值、比較和布爾邏輯
1.1.6 表達式與語句
1.2 變量
1.3 環(huán)境
1.3.1 函數(shù)
1.3.2 prompt和confirm
1.3.3 print函數(shù)
1.3.4 修改環(huán)境
1.4 程序結(jié)構(gòu)
1.4.1 條件執(zhí)行
1.4.2 while循環(huán)與do循環(huán)
1.4.3 縮進代碼
1.4.4 for循環(huán)
1.4.5 跳出循環(huán)
1.4.6 更新變量簡便法
1.4.7 使用switch進行調(diào)度
1.4.8 大小寫
1.4.9 注釋
1.5 進一步認(rèn)識類型
1.5.1 Undefined值
1.5.2 自動類型轉(zhuǎn)換
1.5.3 自動類型轉(zhuǎn)換的風(fēng)險
1.5.4 進一步了解&&和||
第2章 函數(shù)
2.1 剖析函數(shù)定義
2.1.1 定義順序
2.1.2 局部變量
2.1.3 嵌套作用域
2.1.4 棧
2.1.5 函數(shù)值
2.1.6 閉包
2.1.7 可選參數(shù)
2.2 技巧
2.2.1 避免重復(fù)
2.2.2 純函數(shù)
2.2.3 遞歸
第3章 數(shù)據(jù)結(jié)構(gòu):對象與數(shù)組
3.1 問題:Emily姨媽家的貓
3.2 基本數(shù)據(jù)結(jié)構(gòu)
3.2.1 屬性
3.2.2 對象值
3.2.3 對象即集合
3.2.4 易變性
3.2.5 對象即集合:數(shù)組
3.2.6 方法
3.3 解決關(guān)于Emily姨媽家貓的問題
3.3.1 分離段落
3.3.2 找出相關(guān)段落
3.3.3 提取貓的名字
3.3.4 完整算法
3.3.5 清理代碼
3.3.6 日期表示
3.3.7 日期提取
3.3.8 收集更多信息
3.3.9 數(shù)據(jù)表示
3.4 更多理論
3.4.1 arguments對象
3.4.2 完成掃尾工作
3.4.3 Math對象
3.4.4 可枚舉屬性
第4章 錯誤處理
4.1 問題類型
4.1.1 程序員錯誤
4.1.2 運行時錯誤
4.2 處理錯誤
4.2.1 返回特殊值
4.2.2 異常
4.2.3 異常之后的錯誤清除
4.2.4 Error對象
4.2.5 未處理的異常
4.2.6 選擇性Catch
4.3 自動化測試
第5章 函數(shù)式編程
5.1 抽象
5.2 高階函數(shù)
5.2.1 修改函數(shù)
5.2.2 歸約函數(shù)
5.2.3 映射數(shù)組
5.3 隱士的悲慘故事
5.3.1 HTML
5.3.2 隱士的文本文件
5.3.3 找出段落
5.3.4 強調(diào)與腳注
5.3.5 移動腳注
5.3.6 生成HTML
5.3.7 轉(zhuǎn)化隱士的書
5.4 其他函數(shù)技巧
5.4.1 操作符函數(shù)
5.4.2 分布應(yīng)用
5.4.3 組合
第6章 面向?qū)ο缶幊?br />6.1 對象
6.1.1 定義方法
6.1.2 構(gòu)造函數(shù)
6.1.3 從原型中構(gòu)建
6.1.4 構(gòu)造函數(shù)與原型
6.1.5 原型污染
6.1.6 對象即詞典
6.1.7 指定接口
6.2 構(gòu)建生態(tài)系統(tǒng)模擬
6.2.1 定義生態(tài)圈
6.2.2 空間里的點
6.2.3 呈現(xiàn)網(wǎng)格
6.2.4 昆蟲的編程接口
6.2.5 生態(tài)圈對象
6.2.6 this及其作用域
6.2.7 有活力的生命
6.2.8 昆蟲移動
6.2.9 更多生命形式
6.2.10 多態(tài)性
6.3 更逼真的模擬生態(tài)系統(tǒng)
6.3.1 繼承
6.3.2 記錄能量
6.3.3 添加植物
6.3.4 食草動物
6.3.5 為它帶來生命
6.3.6 人工愚蠢
6.4 原型繼承
6.4.1 類型定義工具
6.4.2 類型原型
6.4.3 對象的世界
6.4.4 instanceof操作符
6.4.5 混合類型
第7章 模塊化
7.1 模塊
7.1.1 生態(tài)圈例子
7.1.2 模塊文件化
7.2 模塊的形態(tài)
7.2.1 函數(shù)作為局部命名空間
7.2.2 模塊對象
7.3 接口設(shè)計
7.3.1 可預(yù)見性
7.3.2 可組合性
7.3.3 分層接口
7.3.4 參數(shù)對象
7.4 JS庫
第8章 正則表達式
8.1 語法
8.1.1 匹配字符集
8.1.2 匹配單詞和字符邊界
8.1.3 重復(fù)模式
8.1.4 子表達式分組
8.1.5 多選一
8.2 匹配與替換
8.2.1 匹配方法
8.2.2 正則表達式和替換方法
8.2.3 動態(tài)創(chuàng)建RegExp 對象
8.3 解析.ini文件
8.4 結(jié)論
第9章 Web編程:速成課
9.1 互聯(lián)網(wǎng)
9.1.1 URL網(wǎng)址
9.1.2 服務(wù)器端編程
9.1.3 客戶端編程
9.2 Web腳本基礎(chǔ)知識
9.2.1 windows對象
9.2.2 document對象
9.2.3 計時器
9.2.4 表單
9.2.5 表單腳本化
9.2.6 自動焦點
9.3 瀏覽器非兼容性
9.4 延伸閱讀
第10章 文檔對象模型
10.1 DOM元素
10.1.1 節(jié)點鏈接
10.1.2 節(jié)點類型
10.1.3 innerHTML屬性
10.1.4 查找節(jié)點
10.1.5 創(chuàng)建節(jié)點
10.1.6 節(jié)點創(chuàng)建輔助函數(shù)
10.1.7 移動節(jié)點
10.1.8 print實現(xiàn)
10.2 樣式表
10.2.1 樣式屬性
10.2.2 隱藏節(jié)點
10.2.3 定位
10.2.4 控制節(jié)點大小
10.3 警示語
第11章 瀏覽器事件
11.1 事件句柄
11.1.1 注冊事件句柄
11.1.2 事件對象
11.1.3 鼠標(biāo)相關(guān)事件類型
11.1.4 鍵盤事件
11.1.5 停止事件
11.1.6 事件對象正規(guī)化
11.1.7 跟蹤焦點
11.1.8 表單事件
11.1.9 window事件
11.2 示例:實現(xiàn)推箱子
11.2.1 等級輸入格式
11.2.2 程序設(shè)計
11.2.3 游戲板展示
11.2.4 控制器對象
第12章 HTTP請求
12.1 HTTP協(xié)議
12.2 XMLHttpRequest API
12.2.1 創(chuàng)建請求對象
12.2.2 簡單的請求
12.2.3 發(fā)送異步請求
12.2.4 獲取XML數(shù)據(jù)
12.2.5 讀取JSON數(shù)據(jù)
12.2.6 基本的請求包裝
12.3 學(xué)習(xí)HTTP
章節(jié)摘錄
版權(quán)頁: 插圖: 應(yīng)用于模擬環(huán)境中時,這種新動物(Clever Lichen Eater)比之前的簡單同類動物(Lichen Eater)活得要長久。如果給定一個足夠大的生活空間,部分環(huán)境食物充足,部分環(huán)境食物不足,而不是每個地方都一樣,那么這個生態(tài)系統(tǒng)似乎可以保持穩(wěn)定。 6.4原型繼承 整個生態(tài)圈應(yīng)該為我們在實際程序中如何使用對象提供一些啟發(fā)。本章剩余部分將針對Java Script里的繼承和繼承相關(guān)的問題做更深入的講解。 首先,來復(fù)習(xí)一些理論。我們經(jīng)常聽到一些學(xué)習(xí)面向?qū)ο缶幊痰膶W(xué)生討論繼承的正確和錯誤使用,這些談話通常很冗長也很精細。重點要記?。豪^承歸根結(jié)底只是一種使程序員可以偷懶的技巧(這里使用“偷懶”是最貼切的說法),可以編寫更少的代碼。因此,繼承的使用是否正確的問題可以歸結(jié)為代碼是否正常工作以及如何避免不必要重復(fù)工作的問題。盡管如此,這些學(xué)生采用的原則為我們思考繼承相關(guān)的內(nèi)容提供了很好的途徑。 繼承是創(chuàng)建新類型對象——子類型(subtype),子類型基于父類型(supertype)。子類型擁有父類型所有的屬性和方法(從父類型繼承得到),然后修改其中的部分內(nèi)容或者添加新的內(nèi)容。繼承最好在子類型模型可以被視為父類型對象的時候使用。 因此,鋼琴類型(Piano)可以是樂器類型(Instrument)的子類型,因為鋼琴是一種樂器。鋼琴有一組鋼琴鍵,我們可能想讓鋼琴作為Array的子類型,但鋼琴不是數(shù)組,像數(shù)組一樣實現(xiàn)它一定會導(dǎo)致各種各樣的愚蠢錯誤。例如,鋼琴也有踏板,為什么piano[0]給出是第一個鍵,而不是第一個踏板呢?實際情況是,鋼琴有鋼琴鍵也有踏板,因此最好給piano對象一個屬性keys(鋼琴鍵),再給一個屬性pedals(踏板),兩者都擁有數(shù)組。 也可以讓一個子類型作為另外一個子類型的父類型。有些問題最好的解決方法就是構(gòu)建一個復(fù)雜的類型家族樹。必須注意不要有太多繼承。繼承有自己的組合代碼方式,過度使用會使代碼之間的銜接混亂,并且很難修改。 6.4.1類型定義工具 使用new關(guān)鍵字和構(gòu)造函數(shù)的prototype屬性都是定義類型的特定方式,這些是我們到目前為止一直使用的。對于簡單的對象(比如生態(tài)圈生物),這種方式是非常有效的??墒牵?dāng)程序過度使用繼承時,這種創(chuàng)建對象的方法很快就顯得笨拙了。
媒體關(guān)注與評論
編程原理與運用規(guī)則的簡練、完美融合。我喜歡游戲式的程序開發(fā)教程。本書再次點燃了我學(xué)習(xí)編程的熱情。對了,是JavaScript!——BrendanEich,JavaScript之父因為這本書,我成為了更棒的架構(gòu)師、作家、咨詢師和開發(fā)者。——AngusCroll,Twitter開發(fā)者如果你決定只買一本有關(guān)JavaScript的書,那么就應(yīng)是MarijnHaverbeke的這本書?!狫oeydeVilla,GlobalNerdy本書不僅是學(xué)習(xí)JavaScript最棒的教材之一,也是通過學(xué)習(xí)JavaScript進而學(xué)習(xí)現(xiàn)代編程的優(yōu)秀圖書。當(dāng)有人問我如何學(xué)好JavaScript時,我會推薦這本書?!狢hrisWilliams,美國JSConf組織者我讀過的最棒的JavaScript書籍之一?!猂eyBango,微軟Client-Web社區(qū)項目經(jīng)理和jQuery團隊成員這本書不僅是一本非常不錯的JavaScript指導(dǎo)書,而且是一本很棒的編程指導(dǎo)書?!狟enNadel,Epicenter咨詢公司首席軟件工程師真是本好書?!狣esignShack這本書對編程基本原理的詳述以及對棧和環(huán)境等概念的解釋非常到位。注重細節(jié)使本書從其他的JavaScript書中脫穎而出。——Designorati學(xué)習(xí)JavaScript的好書。——CraigBuckler,OptimalWorksWebDesign公司
編輯推薦
《JavaScript編程精解》編輯推薦:世界級JavaScript程序員力作,JavaScript之父Brendan Eich高度評價并強力推薦。JavaScript編程原理與運用規(guī)則完美融合,讀者將在游戲式開發(fā)中學(xué)會JavaScript程序設(shè)計,是系統(tǒng)學(xué)習(xí)JavaScript程序設(shè)計的首選之作。
名人推薦
編程原理與運用規(guī)則的簡練、完美融合。我喜歡游戲式的程序開發(fā)教程。本書再次點燃了我學(xué)習(xí)編程的熱情。對了,是JavaScript!——Brendan Eich,JavaScript之父因為這本書,我成為了更棒的架構(gòu)師、作家、咨詢師和開發(fā)者。——Angus Croll,Twitter開發(fā)者如果你決定只買一本有關(guān)JavaScript的書,那么就應(yīng)是Marijn Haverbeke的這本書?!狫oey deVilla,Global Nerdy本書不僅是學(xué)習(xí)JavaScript最棒的教材之一,也是通過學(xué)習(xí)JavaScript進而學(xué)習(xí)現(xiàn)代編程的優(yōu)秀圖書。當(dāng)有人問我如何學(xué)好JavaScript時,我會推薦這本書?!狢hris Williams,美國JSConf組織者我讀過的最棒的JavaScript書籍之一?!猂ey Bango,微軟Client-Web社區(qū)項目經(jīng)理和jQuery團隊成員這本書不僅是一本非常不錯的JavaScript指導(dǎo)書,而且是一本很棒的編程指導(dǎo)書。——Ben Nadel,Epicenter咨詢公司首席軟件工程師真是本好書。——Design Shack這本書對編程基本原理的詳述以及對棧和環(huán)境等概念的解釋非常到位。注重細節(jié)使本書從其他的JavaScript書中脫穎而出?!狣esignorati學(xué)習(xí)JavaScript的好書?!狢raig Buckler,OptimalWorks Web Design公司
圖書封面
圖書標(biāo)簽Tags
無
評論、評分、閱讀與下載