成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript 編程精解 中文第三版 二、程序結(jié)構(gòu)

ThinkSNS / 1920人閱讀

摘要:為了運(yùn)行包裹的程序,可以將這些值應(yīng)用于它們。在瀏覽器中,輸出出現(xiàn)在控制臺(tái)中。在英文版頁面上運(yùn)行示例或自己的代碼時(shí),會(huì)在示例之后顯示輸出,而不是在瀏覽器的控制臺(tái)中顯示。這被稱為條件執(zhí)行。

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

原文:Program Structure

譯者:飛龍

協(xié)議:CC BY-NC-SA 4.0

自豪地采用谷歌翻譯

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

And my heart glows bright red under my filmy, translucent skin and they have to administer 10cc of JavaScript to get me to come back. (I respond well to toxins in the blood.) Man, that stuff will kick the peaches right out your gills!

why,《Why"s (Poignant) Guide to Ruby》

在本章中,我們開始做一些實(shí)際上稱為編程的事情。 我們將擴(kuò)展我們對(duì) JavaScript 語言的掌控,超出我們目前所看到的名詞和句子片斷,直到我們可以表達(dá)有意義的散文。

表達(dá)式和語句

在第 1 章中,我們?yōu)樗鼈儎?chuàng)建了值,并應(yīng)用了運(yùn)算符來獲得新的值。 像這樣創(chuàng)建值是任何 JavaScript 程序的主要內(nèi)容。 但是,這種東西必須在更大的結(jié)構(gòu)中構(gòu)建,才能發(fā)揮作用。 這就是我們接下來要做的。

我們把產(chǎn)生值的操作的代碼片段稱為表達(dá)式。按照字面含義編寫的值(比如22"psychoanalysis")都是一個(gè)表達(dá)式。而括號(hào)當(dāng)中的表達(dá)式、使用二元運(yùn)算符連接的表達(dá)式或使用一元運(yùn)算符的表達(dá)式,仍然都是表達(dá)式。

這展示了一部分基于語言的接口之美。 表達(dá)式可以包含其他表達(dá)式,其方式非常類似于人類語言的從句嵌套 - 從句可以包含它自己的從句,依此類推。 這允許我們構(gòu)建描述任意復(fù)雜計(jì)算的表達(dá)式。

如果一個(gè)表達(dá)式對(duì)應(yīng)一個(gè)句子片段,則 JavaScript 語句對(duì)應(yīng)于一個(gè)完整的句子。 一個(gè)程序是一列語句。

最簡(jiǎn)單的一條語句由一個(gè)表達(dá)式和其后的分號(hào)組成。比如這就是一個(gè)程序:

1;
!false;

不過,這是一個(gè)無用的程序。 表達(dá)式可以僅僅滿足于產(chǎn)生一個(gè)值,然后可以由閉合的代碼使用。 一個(gè)聲明是獨(dú)立存在的,所以它只有在影響到世界的時(shí)候才會(huì)成立。 它可以在屏幕上顯示某些東西 - 這可以改變世界 - 或者它可以改變機(jī)器的內(nèi)部狀態(tài),從而影響后面的語句。 這些變化被稱為副作用。 前面例子中的語句僅僅產(chǎn)生值1true,然后立即將它們?nèi)拥簟?這給世界沒有留下什么印象。 當(dāng)你運(yùn)行這個(gè)程序時(shí),什么都不會(huì)發(fā)生。

在某些情況下,JavaScript 允許您在語句結(jié)尾處省略分號(hào)。 在其他情況下,它必須在那里,否則下一行將被視為同一語句的一部分。 何時(shí)可以安全省略它的規(guī)則有點(diǎn)復(fù)雜且容易出錯(cuò)。 所以在本書中,每一個(gè)需要分號(hào)的語句都會(huì)有分號(hào)。 至少在你更了解省略分號(hào)的細(xì)節(jié)之前,我建議你也這樣做。

綁定

程序如何保持內(nèi)部狀態(tài)? 它如何記住東西? 我們已經(jīng)看到如何從舊值中產(chǎn)生新值,但這并沒有改變舊值,新值必須立即使用,否則將會(huì)再度消失。 為了捕獲和保存值,JavaScript 提供了一種稱為綁定或變量的東西:

let caught = 5 * 5;

這是第二種語句。 關(guān)鍵字(keyword)let表示這個(gè)句子打算定義一個(gè)綁定。 它后面跟著綁定的名稱,如果我們想立即給它一個(gè)值,使用=運(yùn)算符和一個(gè)表達(dá)式。

前面的語句創(chuàng)建一個(gè)名為caught的綁定,并用它來捕獲乘以5 * 5所產(chǎn)生的數(shù)字。

在定義綁定之后,它的名稱可以用作表達(dá)式。 這種表達(dá)式的值是綁定當(dāng)前所持有的值。 這是一個(gè)例子:

let ten = 10;
console.log(ten * ten);
// → 100

當(dāng)綁定指向某個(gè)值時(shí),并不意味著它永遠(yuǎn)與該值綁定。 可以在現(xiàn)有的綁定上隨時(shí)使用=運(yùn)算符,將它們與當(dāng)前值斷開連接,并讓它們指向一個(gè)新值:

var mood = "light";
console.log(mood);
// → light
mood = "dark";
console.log(mood);
// → dark

你應(yīng)該將綁定想象為觸手,而不是盒子。 他們不包含值; 他們捕獲值 - 兩個(gè)綁定可以引用相同的值。 程序只能訪問它還在引用的值。 當(dāng)你需要記住某些東西時(shí),你需要長(zhǎng)出一個(gè)觸手來捕獲它,或者你重新貼上你現(xiàn)有的觸手之一。

我們來看另一個(gè)例子。 為了記住 Luigi 欠你的美元數(shù)量,你需要?jiǎng)?chuàng)建一個(gè)綁定。 然后當(dāng)他還你 35 美元時(shí),你賦予這個(gè)綁定一個(gè)新值:

let luigisDebt = 140;
luigisDebt = luigisDebt - 35;
console.log(luigisDebt);
// → 105

當(dāng)你定義一個(gè)綁定而沒有給它一個(gè)值時(shí),觸手沒有任何東西可以捕獲,所以它只能捕獲空氣。 如果你請(qǐng)求一個(gè)空綁定的值,你會(huì)得到undefined值。

一個(gè)let語句可以同時(shí)定義多個(gè)綁定,定義必需用逗號(hào)分隔。

let one = 1, two = 2;
console.log(one + two);
// → 3

varconst這兩個(gè)詞也可以用來創(chuàng)建綁定,類似于let。

var name = "Ayda";
const greeting = "Hello ";
console.log(greeting + name);
// → Hello Ayda

第一個(gè)var(“variable”的簡(jiǎn)寫)是 JavaScript 2015 之前聲明綁定的方式。 我們?cè)谙乱徽轮?,?huì)講到它與let的確切的不同之處。 現(xiàn)在,請(qǐng)記住它大部分都做同樣的事情,但我們很少在本書中使用它,因?yàn)樗幸恍┝钊死Щ蟮奶匦浴?/p>

const這個(gè)詞代表常量。 它定義了一個(gè)不變的綁定,只要它存在,它就指向相同的值。 這對(duì)于一些綁定很有用,它們向值提供一個(gè)名詞,以便之后可以很容易地引用它。

綁定名稱

綁定名稱可以是任何單詞。 數(shù)字可以是綁定名稱的一部分,例如catch22是一個(gè)有效的名稱,但名稱不能以數(shù)字開頭。 綁定名稱可能包含美元符號(hào)($)或下劃線(_),但不包含其他標(biāo)點(diǎn)符號(hào)或特殊字符。

具有特殊含義的詞,如let,是關(guān)鍵字,它們不能用作綁定名稱。 在未來的 JavaScript 版本中還有一些“保留供使用”的單詞,它們也不能用作綁定名稱。 關(guān)鍵字和保留字的完整列表相當(dāng)長(zhǎng):

break case catch class const continue debugger default
delete do else enum export extends false finally for
function if implements import interface in instanceof let
new package private protected public return static super
switch this throw true try typeof var void while with yield

不要擔(dān)心記住這些東西。 創(chuàng)建綁定時(shí)會(huì)產(chǎn)生意外的語法錯(cuò)誤,請(qǐng)查看您是否嘗試定義保留字。

環(huán)境

給定時(shí)間中存在的綁定及其值的集合稱為環(huán)境。 當(dāng)一個(gè)程序啟動(dòng)時(shí),這個(gè)環(huán)境不是空的。 它總是包含作為語言標(biāo)準(zhǔn)一部分的綁定,并且在大多數(shù)情況下,它還具有一些綁定,提供與周圍系統(tǒng)交互的方式。 例如,在瀏覽器中,有一些功函數(shù)能可以與當(dāng)前加載的網(wǎng)站交互并讀取鼠標(biāo)和鍵盤輸入。

函數(shù)

在默認(rèn)環(huán)境中提供的許多值的類型為函數(shù)。 函數(shù)是包裹在值中的程序片段。 為了運(yùn)行包裹的程序,可以將這些值應(yīng)用于它們。 例如,在瀏覽器環(huán)境中,綁定prompt包含一函數(shù),個(gè)顯示一個(gè)小對(duì)話框,請(qǐng)求用戶輸入。 它是這樣使用的:

prompt("Enter passcode");

執(zhí)行一個(gè)函數(shù)被稱為調(diào)用,或應(yīng)用它(invoke,call,apply)。您可以通過在生成函數(shù)值的表達(dá)式之后放置括號(hào)來調(diào)用函數(shù)。 通常你會(huì)直接使用持有該函數(shù)的綁定名稱。 括號(hào)之間的值被賦予函數(shù)內(nèi)部的程序。 在這個(gè)例子中,prompt函數(shù)使用我們提供的字符串作為文本來顯示在對(duì)話框中。 賦予函數(shù)的值稱為參數(shù)。 不同的函數(shù)可能需要不同的數(shù)量或不同類型的參數(shù)。

prompt函數(shù)在現(xiàn)代 Web 編程中用處不大,主要是因?yàn)槟銦o法控制所得對(duì)話框的外觀,但可以在玩具程序和實(shí)驗(yàn)中有所幫助。

console.log函數(shù)

在例子中,我使用console.log來輸出值。 大多數(shù) JavaScript 系統(tǒng)(包括所有現(xiàn)代 Web 瀏覽器和 Node.js)都提供了console.log函數(shù),將其參數(shù)寫入一個(gè)文本輸出設(shè)備。 在瀏覽器中,輸出出現(xiàn)在 JavaScript 控制臺(tái)中。 瀏覽器界面的這一部分在默認(rèn)情況下是隱藏的,但大多數(shù)瀏覽器在您按 F12 或在 Mac 上按 Command-Option-I 時(shí)打開它。 如果這不起作用,請(qǐng)?jiān)诓藛沃兴阉髅麨椤伴_發(fā)人員工具”或類似的項(xiàng)目。

在英文版頁面上運(yùn)行示例(或自己的代碼)時(shí),會(huì)在示例之后顯示console.log輸出,而不是在瀏覽器的 JavaScript 控制臺(tái)中顯示。
let x = 30;
console.log("the value of x is", x);
// → the value of x is 30

盡管綁定名稱不能包含句號(hào)字符,但是console.log確實(shí)擁有。 這是因?yàn)?b>console.log不是一個(gè)簡(jiǎn)單的綁定。 它實(shí)際上是一個(gè)表達(dá)式,它從console綁定所持有的值中檢索log屬性。 我們將在第 4 章中弄清楚這意味著什么。

返回值

顯示對(duì)話框或?qū)⑽淖謱懭肫聊皇且粋€(gè)副作用。 由于它們產(chǎn)生的副作用,很多函數(shù)都很有用。 函數(shù)也可能產(chǎn)生值,在這種情況下,他們不需要有副作用就有用。 例如,函數(shù)Math.max可以接受任意數(shù)量的參數(shù)并返回最大值。

console.log(Math.max(2, 4));
// → 4

當(dāng)一個(gè)函數(shù)產(chǎn)生一個(gè)值時(shí),它被稱為返回該值。 任何產(chǎn)生值的東西都是 JavaScript 中的表達(dá)式,這意味著可以在較大的表達(dá)式中使用函數(shù)調(diào)用。 在這里,Math.min的調(diào)用(與Math.max相反)用作加法表達(dá)式的一部分:

console.log(Math.min(2, 4) + 100);
// → 102

我們會(huì)在下一章當(dāng)中講解如何編寫自定義函數(shù)。

控制流

當(dāng)你的程序包含多個(gè)語句時(shí),這些語句就像是一個(gè)故事一樣從上到下執(zhí)行。 這個(gè)示例程序有兩個(gè)語句。 第一個(gè)要求用戶輸入一個(gè)數(shù)字,第二個(gè)在第一個(gè)之后執(zhí)行,顯示該數(shù)字的平方。

let theNumber = Number(prompt("Pick a number"));
console.log("Your number is the square root of " +
            theNumber * theNumber);

Number函數(shù)將一個(gè)值轉(zhuǎn)換為一個(gè)數(shù)字。 我們需要這種轉(zhuǎn)換,因?yàn)?b>prompt的結(jié)果是一個(gè)字符串值,我們需要一個(gè)數(shù)字。 有類似的函數(shù)叫做StringBoolean,它們將值轉(zhuǎn)換為這些類型。

以下是直線控制流程的相當(dāng)簡(jiǎn)單的示意圖:

條件執(zhí)行

并非所有的程序都是直路。 例如,我們可能想創(chuàng)建一條分叉路,在那里該程序根據(jù)當(dāng)前的情況采取適當(dāng)?shù)姆种А?這被稱為條件執(zhí)行。

在 JavaScript 中,條件執(zhí)行使用if關(guān)鍵字創(chuàng)建。 在簡(jiǎn)單的情況下,當(dāng)且僅當(dāng)某些條件成立時(shí),我們才希望執(zhí)行一些代碼。 例如,僅當(dāng)輸入實(shí)際上是一個(gè)數(shù)字時(shí),我們可能打算顯示輸入的平方。

let theNumber = Number(prompt("Pick a number", ""));
if (!isNaN(theNumber))
  alert("Your number is the square root of " +
        theNumber * theNumber);

修改之后,如果您輸入"parrot",則不顯示輸出。

if關(guān)鍵字根據(jù)布爾表達(dá)式的值執(zhí)行或跳過語句。 決定性的表達(dá)式寫在關(guān)鍵字之后,括號(hào)之間,然后是要執(zhí)行的語句。

Number.isNaN函數(shù)是一個(gè)標(biāo)準(zhǔn)的 JavaScript 函數(shù),僅當(dāng)它給出的參數(shù)是NaN時(shí)才返回true。 當(dāng)你給它一個(gè)不代表有效數(shù)字的字符串時(shí),Number函數(shù)恰好返回NaN。 因此,條件翻譯為“如果theNumber是一個(gè)數(shù)字,那么這樣做”。

在這個(gè)例子中,if下面的語句被大括號(hào)({})括起來。 它們可用于將任意數(shù)量的語句分組到單個(gè)語句中,稱為代碼塊。 在這種情況下,你也可以忽略它們,因?yàn)樗鼈冎话粋€(gè)語句,但為了避免必須考慮是否需要,大多數(shù) JavaScript 程 序員在每個(gè)這樣的被包裹的語句中使用它們。 除了偶爾的一行,我們?cè)诒緯写蠖鄷?huì)遵循這個(gè)約定。

if (1 + 1 == 2) console.log("It"s true");
// → It"s true

您通常不會(huì)只執(zhí)行條件成立時(shí)代碼,還會(huì)處理其他情況的代碼。 該替代路徑由圖中的第二個(gè)箭頭表示。 可以一起使用ifelse關(guān)鍵字,創(chuàng)建兩個(gè)多帶帶的替代執(zhí)行路徑。

let theNumber = Number(prompt("Pick a number"));
if (!Number.isNaN(theNumber)) {
  console.log("Your number is the square root of " +
              theNumber * theNumber);
} else {
  console.log("Hey. Why didn"t you give me a number?");
}

如果我們需要執(zhí)行的路徑多于兩條,可以將多個(gè)if/else對(duì)鏈接在一起使用。如下所示例子:

let num = Number(prompt("Pick a number", "0"));

if (num < 10) {
  console.log("Small");
} else if (num < 100) {
  console.log("Medium");
} else {
  console.log("Large");
}

該程序首先會(huì)檢查num是否小于 10。如果條件成立,則執(zhí)行顯示"Small"的這條路徑;如果不成立,則選擇else分支,else分支自身包含了第二個(gè)if。如果第二個(gè)條件即num小于 100 成立,且數(shù)字的范圍在 10 到 100 之間,則執(zhí)行顯示"Medium"的這條路徑。如果上述條件均不滿足,則執(zhí)行最后一條else分支路徑。

這個(gè)程序的模式看起來像這樣:

whiledo循環(huán)

現(xiàn)考慮編寫一個(gè)程序,輸出 0 到 12 之間的所有偶數(shù)。其中一種編寫方式如下所示:

console.log(0);
console.log(2);
console.log(4);
console.log(6);
console.log(8);
console.log(10);
console.log(12);

該程序確實(shí)可以工作,但編程的目的在于減少工作量,而非增加。如果我們需要小于 1000 的偶數(shù),上面的方式是不可行的。我們現(xiàn)在所需的是重復(fù)執(zhí)行某些代碼的方法,我們將這種控制流程稱為循環(huán)。

我們可以使用循環(huán)控制流來讓程序執(zhí)行回到之前的某個(gè)位置,并根據(jù)程序狀態(tài)循環(huán)執(zhí)行代碼。如果我們?cè)谘h(huán)中使用一個(gè)綁定計(jì)數(shù),那么就可以按照如下方式編寫代碼:

let number = 0;
while (number <= 12) {
  console.log(number);
  number = number + 2;
}
// → 0
// → 2
//   … etcetera

循環(huán)語句以關(guān)鍵字while開頭。在關(guān)鍵字while后緊跟一個(gè)用括號(hào)括起來的表達(dá)式,括號(hào)后緊跟一條語句,這種形式與if語句類似。只要表達(dá)式產(chǎn)生的值轉(zhuǎn)換為布爾值后為true,該循環(huán)會(huì)持續(xù)進(jìn)入括號(hào)后面的語句。

number綁定演示了綁定可以跟蹤程序進(jìn)度的方式。 每次循環(huán)重復(fù)時(shí),number的值都比以前的值多 2。 在每次重復(fù)開始時(shí),將其與數(shù)字 12 進(jìn)行比較來決定程序的工作是否完成。

作為一個(gè)實(shí)際上有用的例子,現(xiàn)在我們可以編寫一個(gè)程序來計(jì)算并顯示2**10(2 的 10 次方)的結(jié)果。 我們使用兩個(gè)綁定:一個(gè)用于跟蹤我們的結(jié)果,一個(gè)用來計(jì)算我們將這個(gè)結(jié)果乘以 2 的次數(shù)。 該循環(huán)測(cè)試第二個(gè)綁定是否已達(dá)到 10,如果不是,則更新這兩個(gè)綁定。

let result = 1;
let counter = 0;
while (counter < 10) {
  result = result * 2;
  counter = counter + 1;
}
console.log(result);
// → 1024

計(jì)數(shù)器也可以從1開始并檢查<= 10,但是,由于一些在第 4 章中澄清的原因,從 0 開始計(jì)數(shù)是個(gè)好主意。

do循環(huán)控制結(jié)構(gòu)類似于while循環(huán)。兩者之間只有一個(gè)區(qū)別:do循環(huán)至少執(zhí)行一遍循環(huán)體,只有第一次執(zhí)行完循環(huán)體之后才會(huì)開始檢測(cè)循環(huán)條件。do循環(huán)中將條件檢測(cè)放在循環(huán)體后面,正反映了這一點(diǎn):

let yourName;
do {
  yourName = prompt("Who are you?");
} while (!yourName);
console.log(yourName);

這個(gè)程序會(huì)強(qiáng)制你輸入一個(gè)名字。 它會(huì)一再詢問,直到它得到的東西不是空字符串。 !運(yùn)算符會(huì)將值轉(zhuǎn)換為布爾類型再取反,除了""之外的所有字符串都轉(zhuǎn)換為true。 這意味著循環(huán)持續(xù)進(jìn)行,直到您提供了非空名稱。

代碼縮進(jìn)

在這些例子中,我一直在語句前添加空格,它們是一些大型語句的一部分。 這些都不是必需的 - 沒有它們,計(jì)算機(jī)也會(huì)接受該程序。 實(shí)際上,即使是程序中的換行符也是可選的。 如果你喜歡,你可以將程序編寫為很長(zhǎng)的一行。

塊內(nèi)縮進(jìn)的作用是使代碼結(jié)構(gòu)顯而易見。 在其他塊內(nèi)開啟新的代碼塊中,可能很難看到塊的結(jié)束位置,和另一個(gè)塊開始位置。 通過適當(dāng)?shù)目s進(jìn),程序的視覺形狀對(duì)應(yīng)其內(nèi)部塊的形狀。 我喜歡為每個(gè)開啟的塊使用兩個(gè)空格,但風(fēng)格不同 - 有些人使用四個(gè)空格,而有些人使用制表符。 重要的是,每個(gè)新塊添加相同的空格量。

if (false != true) {
  console.log("That makes sense.");
  if (1 < 2) {
    console.log("No surprise there.");
  }
}

大多數(shù)代碼編輯器程序(包括本書中的那個(gè))將通過自動(dòng)縮進(jìn)新行來提供幫助。

for循環(huán)

許多循環(huán)遵循while示例中看到的規(guī)律。 首先,創(chuàng)建一個(gè)計(jì)數(shù)器綁定來跟蹤循環(huán)的進(jìn)度。 然后出現(xiàn)一個(gè)while循環(huán),通常用一個(gè)測(cè)試表達(dá)式來檢查計(jì)數(shù)器是否已達(dá)到其最終值。 在循環(huán)體的末尾,更新計(jì)數(shù)器來跟蹤進(jìn)度。

由于這種規(guī)律非常常見,JavaScript 和類似的語言提供了一個(gè)稍短而且更全面的形式,for循環(huán):

for (let number = 0; number <= 12; number = number + 2)
  console.log(number);
// → 0
// → 2
//   … etcetera

該程序與之前的偶數(shù)打印示例完全等價(jià)。 唯一的變化是,所有與循環(huán)“狀態(tài)”相關(guān)的語句,在for之后被組合在一起。

關(guān)鍵字for后面的括號(hào)中必須包含兩個(gè)分號(hào)。第一個(gè)分號(hào)前面的是循環(huán)的初始化部分,通常是定義一個(gè)綁定。第二部分則是判斷循環(huán)是否繼續(xù)進(jìn)行的檢查表達(dá)式。最后一部分則是用于每個(gè)循環(huán)迭代后更新狀態(tài)的語句。絕大多數(shù)情況下,for循環(huán)比while語句更簡(jiǎn)短清晰。

下面的代碼中使用了for循環(huán)代替while循環(huán),來計(jì)算2**10

var result = 1;
for (var counter = 0; counter < 10; counter = counter + 1)
  result = result * 2;
console.log(result);
// → 1024
跳出循環(huán)

除了循環(huán)條件為false時(shí)循環(huán)會(huì)結(jié)束以外,我們還可以使用一個(gè)特殊的break語句來立即跳出循環(huán)。

下面的程序展示了break語句的用法。該程序的作用是找出第一個(gè)大于等于 20 且能被 7 整除的數(shù)字。

for (let current = 20; ; current++) {
  if (current % 7 == 0) 
    break;
  }
}
// → 21

我們可以使用余數(shù)運(yùn)算符(%)來判斷一個(gè)數(shù)是否能被另一個(gè)數(shù)整除。如果可以整除,則余數(shù)為 0。

本例中的for語句省略了檢查循環(huán)終止條件的表達(dá)式。這意味著除非執(zhí)行了內(nèi)部的break語句,否則循環(huán)永遠(yuǎn)不會(huì)結(jié)束。

如果你要?jiǎng)h除這個(gè)break語句,或者你不小心寫了一個(gè)總是產(chǎn)生true的結(jié)束條件,你的程序就會(huì)陷入死循環(huán)中。 死循環(huán)中的程序永遠(yuǎn)不會(huì)完成運(yùn)行,這通常是一件壞事。

如果您在(英文版)這些頁面的其中一個(gè)示例中創(chuàng)建了死限循環(huán),則通常會(huì)詢問您是否要在幾秒鐘后停止該腳本。 如果失敗了,您將不得不關(guān)閉您正在處理的選項(xiàng)卡,或者在某些瀏覽器中關(guān)閉整個(gè)瀏覽器,以便恢復(fù)。

continue關(guān)鍵字與break類似,也會(huì)對(duì)循環(huán)執(zhí)行過程產(chǎn)生影響。循環(huán)體中的continue語句可以跳出循環(huán)體,并進(jìn)入下一輪循環(huán)迭代。

更新綁定的簡(jiǎn)便方法

程序經(jīng)常需要根據(jù)綁定的原值進(jìn)行計(jì)算并更新值,特別是在循環(huán)過程中,這種情況更加常見。

counter = counter + 1;

JavaScript 提供了一種簡(jiǎn)便寫法:

counter += 1;

JavaScript 還為其他運(yùn)算符提供了類似的簡(jiǎn)便方法,比如result*=2可以將result變?yōu)樵瓉淼膬杀?,?b>counter-=1可以將counter減 1。

這樣可以稍微簡(jiǎn)化我們的計(jì)數(shù)示例代碼。

for (let number = 0; number <= 12; number += 2)
  console.log(number);

對(duì)于counter+=1counter-=1,還可以進(jìn)一步簡(jiǎn)化代碼,counter+=1可以修改為counter++counter-=1可以修改為counter--。

switch條件分支

我們很少會(huì)編寫如下所示的代碼。

if (x == "value1") action1();
else if (x == "value2") action2();
else if (x == "value3") action3();
else defaultAction();

有一種名為switch的結(jié)構(gòu),為了以更直接的方式表達(dá)這種“分發(fā)”。 不幸的是,JavaScript 為此所使用的語法(它從 C/Java 語言中繼承而來)有些笨拙 - if語句鏈看起來可能更好。 這里是一個(gè)例子:

switch (prompt("What is the weather like?")) {
  case "rainy":
    console.log("Remember to bring an umbrella.");
    break;
  case "sunny":
    console.log("Dress lightly.");
  case "cloudy":
    console.log("Go outside.");
    break;
  default:
    console.log("Unknown weather type!");
    break;
}

你可以在switch打開的塊內(nèi)放置任意數(shù)量的case標(biāo)簽。 程序會(huì)在向switch提供的值的對(duì)應(yīng)標(biāo)簽處開始執(zhí)行,或者如果沒有找到匹配值,則在default處開始。 甚至跨越了其他標(biāo)簽,它也會(huì)繼續(xù)執(zhí)行,直到達(dá)到了break聲明。 在某些情況下,例如在示例中的"sunny"的情況下,這可以用來在不同情況下共享一些代碼(它建議在晴天和多云天氣外出)。 但要小心 - 很容易忘記這樣的break,這會(huì)導(dǎo)致程序執(zhí)行你不想執(zhí)行的代碼。

大寫

綁定名中不能包含空格,但很多時(shí)候使用多個(gè)單詞有助于清晰表達(dá)綁定的實(shí)際用途。當(dāng)綁定名中包含多個(gè)單詞時(shí)可以選擇多種寫法,以下是可以選擇的幾種綁定名書寫方式:

fuzzylittleturtle
fuzzy_little_turtle
FuzzyLittleTurtle
fuzzyLittleTurtle

第一種風(fēng)格可能很難閱讀。 我更喜歡下劃線的外觀,盡管這種風(fēng)格有點(diǎn)痛苦。 標(biāo)準(zhǔn)的 JavaScript 函數(shù)和大多數(shù) JavaScript 程序員都遵循最底下的風(fēng)格 - 除了第一個(gè)詞以外,它們都會(huì)將每個(gè)詞的首字母大寫。 要習(xí)慣這樣的小事并不困難,而且混合命名風(fēng)格的代碼可能會(huì)讓人反感,所以我們遵循這個(gè)約定。

在極少數(shù)情況下,綁定名首字母也會(huì)大寫,比如Number函數(shù)。這種方式用來表示該函數(shù)是構(gòu)造函數(shù)。我們會(huì)在第6章詳細(xì)講解構(gòu)造函數(shù)的概念?,F(xiàn)在,我們沒有必要糾結(jié)于表面上的風(fēng)格不一致性。

注釋

通常,原始代碼并不能傳達(dá)你讓一個(gè)程序傳達(dá)給讀者的所有信息,或者它以神秘的方式傳達(dá)信息,人們可能不了解它。 在其他時(shí)候,你可能只想包含一些相關(guān)的想法,作為你程序的一部分。 這是注釋的用途。

注釋是程序中的一段文本,而在程序執(zhí)行時(shí)計(jì)算機(jī)會(huì)完全忽略掉這些文本。JavaScript 中編寫注釋有兩種方法,寫單行注釋時(shí),使用兩個(gè)斜杠字符開頭,并在后面添加文本注釋。

let accountBalance = calculateBalance(account);
// It"s a green hollow where a river sings
accountBalance.adjust();
// Madly catching white tatters in the grass.
let report = new Report();
// Where the sun on the proud mountain rings:
addToReport(accountBalance, report);
// It"s a little valley, foaming like light in a glass.

//注釋只能到達(dá)行尾。 /**/之間的一段文本將被忽略,不管它是否包含換行符。 這對(duì)添加文件或程序塊的信息塊很有用。

/*
 I first found this number scrawled on the back of one of
 an old notebook. Since then, it has often dropped by,
 showing up in phone numbers and the serial numbers of
 products that I"ve bought. It obviously likes me, so I"ve
 decided to keep it.
*/
const myNumber = 11213;
本章小結(jié)

在本章中,我們學(xué)習(xí)并了解了程序由語句組成,而每條語句又有可能包含了更多語句。在語句中往往包含了表達(dá)式,而表達(dá)式還可以由更小的表達(dá)式組成。

程序中的語句按順序編寫,并從上到下執(zhí)行。你可以使用條件語句(if、elseswitch)或循環(huán)語句(while、dofor)來改變程序的控制流。

綁定可以用來保存任何數(shù)據(jù),并用一個(gè)綁定名對(duì)其引用。而且在記錄你的程序執(zhí)行狀態(tài)時(shí)十分有用。環(huán)境是一組定義好的綁定集合。JavaScript 的運(yùn)行環(huán)境中總會(huì)包含一系列有用的標(biāo)準(zhǔn)綁定。

函數(shù)是一種特殊的值,用于封裝一段程序。你可以通過functionName(arg1, arg2)這種寫法來調(diào)用函數(shù)。函數(shù)調(diào)用可以是一個(gè)表達(dá)式,也可以用于生成一個(gè)值。

習(xí)題

如果你不清楚在哪里可以找到習(xí)題的提示,請(qǐng)參考本書的簡(jiǎn)介部分。

每個(gè)練習(xí)都以問題描述開始。 閱讀并嘗試解決這個(gè)練習(xí)。 如果遇到問題,請(qǐng)考慮閱讀練習(xí)后的提示。 本書不包含練習(xí)的完整解決方案,但您可以在 eloquentjavascript.net/code 上在線查找它們。 如果你想從練習(xí)中學(xué)到一些東西,我建議僅在你解決了這個(gè)練習(xí)之后,或者至少在你努力了很長(zhǎng)時(shí)間而感到頭疼之后,再看看這些解決方案。

LoopingaTriangle

編寫一個(gè)循環(huán),調(diào)用 7 次console.log函數(shù),打印出如下的三角形:

#
##
##
###
###
####
#####

這里給出一個(gè)小技巧,在字符串后加上.length可以獲取字符串的長(zhǎng)度。

let abc = "abc";
console.log(abc.length);
// → 3
FizzBuzz

編寫一個(gè)程序,使用console.log打印出從 1 到 100 的所有數(shù)字。不過有兩種例外情況:當(dāng)數(shù)字能被 3 整除時(shí),不打印數(shù)字,而打印"Fizz"。當(dāng)數(shù)字能被 5 整除時(shí)(但不能被 3 整除),不打印數(shù)字,而打印"Buzz"。

當(dāng)以上程序可以正確運(yùn)行后,請(qǐng)修改你的程序,讓程序在遇到能同時(shí)被 3 與 5 整除的數(shù)字時(shí),打印出"FizzBuzz"

(這實(shí)際上是一個(gè)面試問題,據(jù)說剔除了很大一部分程序員候選人,所以如果你解決了這個(gè)問題,你的勞動(dòng)力市場(chǎng)價(jià)值就會(huì)上升。)

棋盤

編寫一個(gè)程序,創(chuàng)建一個(gè)字符串,用于表示8×8的網(wǎng)格,并使用換行符分隔行。網(wǎng)格中的每個(gè)位置可以是空格或字符"#"。這些字符組成了一張棋盤。

將字符串傳遞給console.log將會(huì)輸出以下結(jié)果:

 # # # #
# # # #
 # # # #
# # # #
 # # # #
# # # #
 # # # #
# # # #

當(dāng)程序可以產(chǎn)生這樣的輸出后,請(qǐng)定義綁定size=8,并修改程序,使程序可以處理任意尺寸(長(zhǎng)寬由size確定)的棋盤,并輸出給定寬度和高度的網(wǎng)格。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/105027.html

相關(guān)文章

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

    摘要:來源編程精解中文第三版翻譯項(xiàng)目原文譯者飛龍協(xié)議自豪地采用谷歌翻譯部分參考了編程精解第版,這是一本關(guān)于指導(dǎo)電腦的書。在可控的范圍內(nèi)編寫程序是編程過程中首要解決的問題。我們可以用中文來描述這些指令將數(shù)字存儲(chǔ)在內(nèi)存地址中的位置。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目原文:Introduction 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 自豪地...

    sanyang 評(píng)論0 收藏0
  • JavaScript 編程精解 中文三版 十三、瀏覽器中的 JavaScript

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

    zhiwei 評(píng)論0 收藏0
  • JavaScript 編程精解 中文三版、項(xiàng)目:編程語言

    摘要:來源編程精解中文第三版翻譯項(xiàng)目原文譯者飛龍協(xié)議自豪地采用谷歌翻譯部分參考了編程精解第版確定編程語言中的表達(dá)式含義的求值器只是另一個(gè)程序。若文本不是一個(gè)合法程序,解析器應(yīng)該指出錯(cuò)誤。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目原文:Project: A Programming Language 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 自豪地采用...

    Near_Li 評(píng)論0 收藏0
  • JavaScript 編程精解 中文三版 十四、文檔對(duì)象模型

    摘要:在其沙箱中提供了將文本轉(zhuǎn)換成文檔對(duì)象模型的功能。瀏覽器使用與該形狀對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)來表示文檔。我們將這種表示方式稱為文檔對(duì)象模型,或簡(jiǎn)稱。樹回想一下第章中提到的語法樹。語言的語法樹有標(biāo)識(shí)符值和應(yīng)用節(jié)點(diǎn)。元素表示標(biāo)簽的節(jié)點(diǎn)用于確定文檔結(jié)構(gòu)。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目原文:The Document Object Model 譯者:飛龍 協(xié)議...

    gggggggbong 評(píng)論0 收藏0
  • JavaScript 編程精解 中文三版 十九、項(xiàng)目:像素藝術(shù)編輯器

    摘要:相反,當(dāng)響應(yīng)指針事件時(shí),它會(huì)調(diào)用創(chuàng)建它的代碼提供的回調(diào)函數(shù),該函數(shù)將處理應(yīng)用的特定部分?;卣{(diào)函數(shù)可能會(huì)返回另一個(gè)回調(diào)函數(shù),以便在按下按鈕并且將指針移動(dòng)到另一個(gè)像素時(shí)得到通知。它們?yōu)榻M件構(gòu)造器的數(shù)組而提供。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目原文:Project: A Pixel Art Editor 譯者:飛龍 協(xié)議:CC BY-NC-SA 4...

    Meils 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<