国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript 編程精解 中文第三版 零、前言

sanyang / 2626人閱讀

摘要:來源編程精解中文第三版翻譯項目原文譯者飛龍協議自豪地采用谷歌翻譯部分參考了編程精解第版,這是一本關于指導電腦的書。在可控的范圍內編寫程序是編程過程中首要解決的問題。我們可以用中文來描述這些指令將數字存儲在內存地址中的位置。

來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項目

原文:Introduction

譯者:飛龍

協議:CC BY-NC-SA 4.0

自豪地采用谷歌翻譯

部分參考了《JavaScript 編程精解(第 2 版)》

We think we are creating the system for our own purposes. We believe we are making it in our own image... But the computer is not really like us. It is a projection of a very slim part of ourselves: that portion devoted to logic, order, rule, and clarity.

Ellen Ullman,《Close to the Machine: Technophilia and its Discontents》

這是一本關于指導電腦的書。時至今日,計算機就像螺絲刀一樣隨處可見,但相比于螺絲刀而言,計算機更復雜一些,并且,讓他們做你想讓他們做的事情,并不總是那么容易。

如果你讓計算機執行的任務是常見的,易于理解的任務,例如向你顯示你的電子郵件,或像計算器一樣工作,則可以打開相應的應用并開始工作。 但對于獨特的或開放式的任務,應用可能不存在。

這就是編程可能出現的地方。編程是構建一個程序的行為 - 它是一組精確的指令,告訴計算機做什么。 由于計算機是愚蠢的,迂腐的野獸,編程從根本上是乏味和令人沮喪的。

幸運的是,如果你可以克服這個事實,并且甚至可以享受愚蠢機器可以處理的嚴謹思維,那么編程可以是非常有益的。 它可以讓你在幾秒鐘內完成手動操作。 這是一種方法,讓你的電腦工具去做它以前做不到的事情。 它也提供了抽象思維的優秀練習。

大多數編程都是用編程語言完成的。 編程語言是一種人工構建的語言,用于指導計算機。 有趣的是,我們發現與電腦溝通的最有效的方式,與我們彼此溝通的方式相差太大。 與人類語言一樣,計算機語言可以以新的方式組合詞語和詞組,從而可以表達新的概念。

在某種程度上,基于語言的界面,例如 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操作來輸出結果。

最后,我們恰好有rangesum這類方便的操作。下面代碼中的range函數用于創建數字集合,sum函數用于計算數字集合之和:

console.log(sum(range(1, 10)));
// → 55

我們可以從這里了解到,同一個程序的長度可長可短,可讀性可高可低。第一個版本的程序晦澀難懂,而最后一個版本的程序則接近于人類語言的表達方式:將 1~10 范圍內的數字之和記錄下來(我們會在后面的章節中詳細介紹如何編寫sumrange這樣的函數)。

優秀的編程語言可以為開發人員提供更高層次的抽象,使用類似于人類語言的方式來與計算機進行交互。它有助于省略細節,提供便捷的積木(比如whileconsole.log),允許你定義自己的積木(比如sumrange函數),并使這些積木易于編寫。。

什么是 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 解釋器中執行習題代碼。這樣一來,你就可以馬上獲知代碼工作情況的反饋,而且我希望讀者去做更多的試驗,而不僅僅局限于習題的要求。

可以在 http://eloquentjavascript.net...,該網址會提供每個習題的初始代碼,讓你專心于解答習題。

如果想要在本書提供的沙箱以外執行本書代碼,需要稍加注意。許多的示例是獨立的,而且可以在任何 JavaScript 環境下運行。但后續章節的代碼大多數都是為特定環境(瀏覽器或者 Node.js)編寫的,而且只能在這些特定環境下執行代碼。此外,許多章節定義了更大的程序,這些章節中出現的代碼片段會互相依賴或是依賴于一些外部文件。本書網站的沙箱提供了 zip 壓縮文件的鏈接,該文件包含了所有運行特定章節代碼所需的腳本和數據文件。

本書概覽

本書包括三個部分。前十二章討論 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

祝好運!

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/105029.html

相關文章

  • JavaScript 編程精解 中文三版 五、高階函數

    摘要:高階函數如果一個函數操作其他函數,即將其他函數作為參數或將函數作為返回值,那么我們可以將其稱為高階函數。我們可以使用高階函數對一系列操作和值進行抽象。高階函數有多種表現形式。腳本數據集數據處理是高階函數表現突出的一個領域。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項目原文:Higher-Order Functions 譯者:飛龍 協議:CC BY-NC-...

    blastz 評論0 收藏0
  • JavaScript 編程精解 中文三版 一、值,類型和運算符

    摘要:來源編程精解中文第三版翻譯項目原文譯者飛龍協議自豪地采用谷歌翻譯部分參考了編程精解第版在機器的表面之下,程序在運轉。本章將會介紹程序當中的基本元素,包括簡單的值類型以及值運算符。示例中的乘法運算符優先級高于加法。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項目原文:Values, Types, and Operators 譯者:飛龍 協議:CC BY-NC...

    wh469012917 評論0 收藏0
  • JavaScript 編程精解 中文三版 二、程序結構

    摘要:為了運行包裹的程序,可以將這些值應用于它們。在瀏覽器中,輸出出現在控制臺中。在英文版頁面上運行示例或自己的代碼時,會在示例之后顯示輸出,而不是在瀏覽器的控制臺中顯示。這被稱為條件執行。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項目原文:Program Structure 譯者:飛龍 協議:CC BY-NC-SA 4.0 自豪地采用谷歌翻譯 部分參考了《J...

    ThinkSNS 評論0 收藏0
  • JavaScript 編程精解 中文三版 十三、瀏覽器中的 JavaScript

    摘要:在本例中,使用屬性指定鏈接的目標,其中表示超文本鏈接。您應該認為和元數據隱式出現在示例中,即使它們沒有實際顯示在文本中。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項目原文:JavaScript and the Browser 譯者:飛龍 協議:CC BY-NC-SA 4.0 自豪地采用谷歌翻譯 部分參考了《JavaScript 編程精解(第 2 版)》 ...

    zhiwei 評論0 收藏0
  • JavaScript 編程精解 中文三版 十九、項目:像素藝術編輯器

    摘要:相反,當響應指針事件時,它會調用創建它的代碼提供的回調函數,該函數將處理應用的特定部分。回調函數可能會返回另一個回調函數,以便在按下按鈕并且將指針移動到另一個像素時得到通知。它們為組件構造器的數組而提供。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項目原文:Project: A Pixel Art Editor 譯者:飛龍 協議:CC BY-NC-SA 4...

    Meils 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<