摘要:會自動調(diào)用轉(zhuǎn)換函數(shù)將這個表達式的結(jié)果轉(zhuǎn)換為一個布爾值。語句語句與語句的關(guān)系最為密切,而且也是在其他語言中普遍使用的一種流控制語句。
表達式在 JavaScript 中是短語,那么語句就是整句命令。表達式用來計算出一個值,語句用來執(zhí)行以使某件事發(fā)生。從本質(zhì)上看,語句定義了 JavaScript 中的主要語法,語句通常使用一或多個關(guān)鍵字來完成給定任務(wù)。語句可以很簡單,例如通知函數(shù)退出;也可以比較復(fù)雜,例如指定重復(fù)執(zhí)行某個命令的次數(shù)。下表列出了 JavaScript 大部分語句的語法和用途:
語句 | 語法 | 用途 |
---|---|---|
break | break [label]; | 退出最內(nèi)層循環(huán)或者退出 switch 語句,又或者退出 label 指定的語句 |
case | case expression: | 在 switch 語句中標(biāo)記一條語句 |
continue | continue [label]; | 重新開始最內(nèi)層的循環(huán)或重新開始 label 指定的循環(huán) |
debugger | debugger; | 斷點器調(diào)試 |
default | default; | 在 switch 中標(biāo)記默認(rèn)的語句 |
do-while | do statement while(expression); | while 循環(huán)的一種替代形式 |
empty | ; | 什么都不做 |
for | for(init;expr;incr) statement | 簡寫的循環(huán)結(jié)構(gòu) |
for-in | for(var in object) statement | 遍歷一個對象的屬性 |
function |
function name([param[],...]) {statement} |
聲明一個函數(shù) |
if-else |
if (expression) statement1 [else statement2] |
執(zhí)行 statement1 或者 statement2 |
label | label:statement | 給 statement 指定一個名字 label |
return | return [expression]; | 從函數(shù)返回一個值 |
switch | switch(expression){statement} | 用 case 或者 default 語句標(biāo)記的多分支語句 |
throw | throw expression; | 拋出異常 |
try |
try {statement} [catch {handler statement}] [finally {cleaup statement}] |
捕獲異常 |
use strict | "use strict" | 對腳本和函數(shù)應(yīng)用嚴(yán)格模式 |
var | var name=[=expr][,...]; | 聲明并初始化一個或多個變量 |
while | while(expression) statement | 基本的循環(huán)結(jié)構(gòu) |
with | with(object) statement | 擴展作用域鏈 |
大多數(shù)編程語言中最為常用的一個語句就是 if-else 語句。以下是 if-else 語句的語法:
if (condition) statement1 [else statement2]
其中的 condition 可以是任意表達式;而且對這個表達式求值的結(jié)果不一定是布爾值。JavaScript 會自動調(diào)用 Boolean() 轉(zhuǎn)換函數(shù)將這個表達式的結(jié)果轉(zhuǎn)換為一個布爾值。如果對 condition 求值的結(jié)果是 true,則執(zhí)行 statement1,如果對 condition 求值的結(jié)果是 false,則執(zhí)行 statement2。而且這兩個語句既可以是一行代碼,也可以是一個代碼塊(以一對花括號括起來的多行代碼)。請看下面的例子:
if (i > 25) console.log("Greater than 25."); // 單行語句 else { console.log("Less than or equal to 25."); // 代碼塊中的語句 }
業(yè)界普遍推崇的最佳實踐是始終使用代碼塊,即使要執(zhí)行的只有一行代碼。因為這樣可以消除人們的誤解,否則可能讓人分不清在不同條件下要執(zhí)行哪些語句。
switch 語句switch 語句與 if 語句的關(guān)系最為密切,而且也是在其他語言中普遍使用的一種流控制語句。JavaScript 中 switch 語句的語法與其他基于 C 的語言非常接近,如下所示:
switch (expression) { case value: statement break; case value: statement break; case value: statement break; case value: statement break; default: statement }
switch 語句中的每一種情形的含義是:“如果表達式等于這個值(value),則執(zhí)行后面的語句(statement)”。而 break 關(guān)鍵字會導(dǎo)致代碼執(zhí)行流跳出 switch 語句。如果省略 break 關(guān)鍵字,就會導(dǎo)致執(zhí)行完當(dāng)前 case 后,繼續(xù)執(zhí)行下一個 case。最后的 default 關(guān)鍵字則用于在表達式不匹配前面任何一種情形的時候,也相當(dāng)于一個 else 語句。從根本上講,switch 語句就是為了讓開發(fā)人員免于編寫像下面這樣的代碼:
if (i === 25){ console.log("25"); } else if (i === 35) { console.log("35"); } else if (i === 45) { console.log("45"); } else { console.log("Other"); }
而與此等價的switch語句如下所示:
switch (i) { case 25: console.log("25"); break; case 35: console.log("35"); break; case 45: console.log("45"); break; default: console.log("Other"); }
通過為每個case后面都添加一個break語句,就可以避免同時執(zhí)行多個case代碼的情況。假如確實需要混合幾種情形,不要忘了在代碼中添加注釋,說明你是有意省略了break關(guān)鍵字。
雖然 JavaScript 中的 switch 語句借鑒自其他語言,但這個語句也有自己的特色。首先,可以在 switch 語句中使用任何數(shù)據(jù)類型(在很多其他語言中只能使用數(shù)值),無論是字符串,還是對象都沒有問題。其次,每個 case 的值不一定是常量,可以是變量,甚至是表達式。請看下面這兩個例子:
switch ("hello world") { case "hello" + " world": console.log("Greeting was found."); break; case "goodbye": console.log("Closing was found."); break; default: console.log("Unexpected message was found."); } var num = 25; switch (true) { case num < 0: console.log("Less than 0."); break; case num >= 0 && num <= 10: console.log("Between 0 and 10."); break; case num > 10 && num <= 20: console.log("Between 10 and 20."); break; default: console.log("More than 20."); }
switch 語句首先計算 switch 關(guān)鍵字后的表達式,然后按照從上到下的順序計算每個 case 后的表達式,直到執(zhí)行到 case 的表達式的值與 switch 的表達式的值相等時為止。由于對每個 case 的匹配操作實際上是 === 恒等運算符比較,而不是 == 相等運算符比較,因此,表達式和 case 的匹配并不會做任何類型轉(zhuǎn)換。
循環(huán) while 語句while 語句屬于前測試循環(huán)語句,也就是說,在循環(huán)體內(nèi)的代碼被執(zhí)行之前,就會對出口條件求值。因引,循環(huán)體內(nèi)的代碼有可能永遠不會被執(zhí)行。以下是 while 語句的語法:
while(expression) statement
下面是一個示例:
var i = 0; while (i < 10) { i += 2; }do-while 語句
do-while 語句是一種后測試循環(huán)語句,即只有在循環(huán)體中的代碼執(zhí)行之后,才會測試出口條件。換句話說,在對條件表達式求值之前,循環(huán)體內(nèi)的代碼至少會被執(zhí)行一次。以下是 do-while 語句的語法:
do { statement } while (expression);
下面是一個示例:
var i = 0; do { i += 2; } while (i < 10);for 語句
for 語句也是一種前測試循環(huán)語句,但它具有在執(zhí)行循環(huán)之前初始化變量和定義循環(huán)后要執(zhí)行的代碼的能力。以下是 for 語句的語法:
for (initialization; expression; post-loop-expression) statement
下面是一個示例:
var count = 10; for (var i = 0; i < count; i++){ console.log(i); }
這個 for 循環(huán)語句與下面的 while 語句的功能相同:
var count = 10; var i = 0; while (i < count){ console.log(i); i++; }
由于 JavaScript 中不存在塊級作用域,因此在循環(huán)內(nèi)部定義的變量也可以在外部訪問到。例如:
var count = 10; for (var i = 0; i < count; i++){ console.log(i); } console.log(i); // 10
此外,for 語句中的初始化表達式、控制表達式和循環(huán)后表達式都是可選的。將這兩個表達式全部省略,就會創(chuàng)建一個無限循環(huán),例如:
// 無限循環(huán) for (;;) { doSomething(); }for-in 語句
for-in 語句是一種精準(zhǔn)的迭代語句,可以用來枚舉對象的屬性。以下是 for-in 語句的語法:
for (property in object) statement
下面是一個示例:
for (var propName in window) { console.log(propName); }
在這個例子中,我們使用 for-in 循環(huán)來顯示了 BOM 中 window 對象的所有屬性。每次執(zhí)行循環(huán)時,都會將 window 對象中存在的一個屬性名賦值給變量 propName。這個過程會一直持續(xù)到對象中的所有屬性都被枚舉一遍為止。與 for 語句類似,這里控制語句中的 var 操作符也不是必需的。但是,為了保證使用局部變量,我們推薦上面例子中的這種做法。
JavaScript 對象的屬性沒有順序。因此,通過 for-in 循環(huán)輸出的屬性名的順序是不可預(yù)測的。具體來講,所有屬性都會被返回一次,但返回的先后次序可能會因瀏覽器而異。
如果表示要迭代的對象的變量值為 null 或 undefined,for-in 語句會拋出錯誤。雖然 ECMAScript 5更正了這一行為;對這種情況不再拋出錯誤,而只是不執(zhí)行循環(huán)體。為了保證最大限度的兼容性,建議在使用 for-in 循環(huán)之前,先檢測確認(rèn)該對象的值不是 null 或 undefined。
跳轉(zhuǎn) label 語句使用 label 語句可以在代碼中添加標(biāo)簽,以便將來使用。以下是 label 語句的語法:
label: statement
下面是一個示例:
start: for (var i=0; i < count; i++) { console.log(i); }
這個例子中定義的 start 標(biāo)簽可以在將來由 break 或 continue 語句引用。加標(biāo)簽的語句一般都要與 for 語句等循環(huán)語句配合使用。
break 和 continue 語句break 和 continue 語句用于在循環(huán)中精確地控制代碼的執(zhí)行。其中,break 語句會立即退出循環(huán),強制繼續(xù)執(zhí)行循環(huán)后面的語句。而 continue 語句雖然也是立即退出循環(huán),但退出循環(huán)后會從循環(huán)的頂部繼續(xù)執(zhí)行。請看下面的例子:
var num = 0; for (var i=1; i < 10; i++) { if (i % 5 == 0) { break; } num++; } console.log(num); // 4
這個例子中的 for 循環(huán)會將變量 i 由1遞增至 10。在循環(huán)體內(nèi),有一個 if 語句檢查 i 的值是否可以被 5 整除(使用求模運算符)。如果是,則執(zhí)行 break 語句退出循環(huán)。另一方面,變量 num 從 0 開始,用于記錄循環(huán)執(zhí)行的次數(shù)。在執(zhí)行 break 語句之后,結(jié)果顯示 4。也就是說,在變量 i 等于 5 時,循環(huán)總共執(zhí)行了 4 次;而 break 語句的執(zhí)行,導(dǎo)致了循環(huán)在 num 再次遞增之前就退出了。如果在這里把 break 替換為 continue 的話,則可以看到另一種結(jié)果:
var num = 0; for (var i=1; i < 10; i++) { if (i % 5 == 0) { continue; } num++; } console.log(num); // 8
例子的結(jié)果顯示 8,也就是循環(huán)總共執(zhí)行了 8 次。當(dāng)變量 i 等于 5 時,循環(huán)會在 num 再次遞增之前退出,但接下來執(zhí)行的是下一次循環(huán),即i的值等于 6 的循環(huán)。于是,循環(huán)又繼續(xù)執(zhí)行,直到 i 等于 10 時自然結(jié)束。而 num 的最終值之所以是 8,是因為 continue 語句導(dǎo)致它少遞增了一次。
break 和 continue 語句都可以與 label 語句聯(lián)合使用,從而返回代碼中特定的位置。這種聯(lián)合使用的情況多發(fā)生在循環(huán)嵌套的情況下,如下面的例子所示:
var num = 0; outermost: for (var i = 0; i < 10; i++) { for (var j = 0; j < 10; j++) { if (i == 5 && j == 5) { break outermost; } num++; } } console.log(num); // 55
在這個例子中,outermost 標(biāo)簽表示外部的 for 語句。如果每個循環(huán)正常執(zhí)行 10 次,則 num++ 語句就會正常執(zhí)行 100 次。換句話說,如果兩個循環(huán)都自然結(jié)束,num 的值應(yīng)該是 100。但內(nèi)部循環(huán)中的 break 語句帶了一個參數(shù):要返回到的標(biāo)簽。添加這個標(biāo)簽的結(jié)果將導(dǎo)致 break 語句不僅會退出內(nèi)部的 for 語句(即使用變量 j 的循環(huán)),而且也會退出外部的 for 語句(即使用變量 i 的循環(huán))。為此,當(dāng)變量 i 和 j 都等于 5 時, num的值正好是 55。同樣,continue 語句也可以像這樣與 label 語句聯(lián)用,如下面的例子所示:
var num = 0; outermost: for (var i = 0; i < 10; i++) { for (var j = 0; j < 10; j++) { if (i == 5 && j == 5) { continue outermost; } num++; } } console.log(num); // 95
在這種情況下,continue 語句會強制繼續(xù)執(zhí)行循環(huán),退出內(nèi)部循環(huán),執(zhí)行外部循環(huán)。當(dāng) j 是 5 時,continue 語句執(zhí)行,而這也就意味著內(nèi)部循環(huán)少執(zhí)行了 5 次,因此 num 的結(jié)果是 95。
雖然聯(lián)用 break、continue 和 label 語句能夠執(zhí)行復(fù)雜的操作,但如果使用過度,也會給調(diào)試帶來麻煩。在此,我們建議如果使用 label 語句,一定要使用描述性的標(biāo)簽,同時不要嵌套過多的循環(huán)。
return 語句return 語句的作用是指定函數(shù)調(diào)用后的返回值。return 語句的語法如下:
return [expression];
下面是一個示例:
function square(x) { return x*x; } // 一個包含 return 語句的函數(shù) square(2); // 調(diào)用結(jié)果為 4
return 語句只能在函數(shù)體內(nèi)出現(xiàn),如果不是的話會報語法錯誤。當(dāng)執(zhí)行到 return 語句的時候,函數(shù)終止執(zhí)行,并返回 expression 的值給調(diào)用程序。如果沒有 return 語句,則函數(shù)調(diào)用僅依次執(zhí)行函數(shù)體內(nèi)的每一條語句直到函數(shù)結(jié)束,最后返回調(diào)用程序。這種情況下,調(diào)用表達式的結(jié)果是 undefined。return 語句經(jīng)常作為函數(shù)內(nèi)的最后一條語句出現(xiàn),但并不是說要一定放在函數(shù)最后。return 語句可以多帶帶使用而不必帶有 expression,這樣的話函數(shù)也會向調(diào)用程序返回 undefined。
由于 JavaScript 可以自動插入分號,因此在 return 關(guān)鍵字和它后面的表達式之間不能有換行。
throw 語句throw 語句的作用是把程序運行時產(chǎn)生的錯誤顯式地拋出異常。throw 語句的語法如下:
throw expression;
expression 的值可以是任意類型的??梢話伋鲆粋€代表錯誤碼的數(shù)字,或者包含可讀的錯誤消息的字符串。當(dāng) JavaScript 解釋器拋出異常的時候通常采用 Error 類型和其子類型。Error 對象有一個 name 屬性表示錯誤類型,一個 message 屬性用來存放傳遞給構(gòu)造函數(shù)的字符串,在下面的例子中,當(dāng)使用非法參數(shù)調(diào)用函數(shù)時就拋出一個 Error 對象:
function factorial(x) { // 如果輸入?yún)?shù)是非法的,則拋出一個異常 if (x < 0) throw new Error("x不能是負數(shù)"); // 否則,計算出一個值,并正常地返回它 for(var f = 1; x > 1; f *= x, x--) /* empty */ ; return f; }
當(dāng)拋出異常時,JavaScript 解釋器會立即停止當(dāng)前正在執(zhí)行的邏輯,并跳轉(zhuǎn)至就近的異常處理程序。如果沒有找到任何異常處理程序,異常就會沿著 JavaScript 方法的詞法結(jié)構(gòu)和調(diào)用棧向上傳播。最終 JavaScript 將把異常當(dāng)成程序錯誤來處理,并報告給用戶。
try 語句try-catch-finally 語句是 JavaScript 中異常處理機制,try-catch-finally 語句的語法如下:
try {statement} [catch {handler statement}] [finally {cleaup statement}]
try 從句定義了需要處理的異常所在的代碼塊。catch 從句跟隨在 try 從句之后,當(dāng) try 塊內(nèi)某處發(fā)生了異常時,調(diào)用 catch 內(nèi)的代碼邏輯。catch 從句后跟隨 finally 塊,后者中放置清理代碼,不管 try 塊中是否產(chǎn)生異常,finally 塊內(nèi)的邏輯總是會執(zhí)行。盡管 catch 和 finally 都是可選的,但 try 從句需要至少二者之一與之組成完整的語句。try、catch 和 finally 語句塊都需要使用花括號括起來,這里的花括號是必需的,即使從句中只有一條語句也不能省略花括號。
下面的代碼詳細的說明了 try-catch-finally 的使用目的:
try { // 通常來講,這里的代碼會從頭執(zhí)行到尾而不會產(chǎn)生任何問題, // 但有時會拋出一個異常,要么是由 throw 語句直接拋出異常, // 要么是通過調(diào)用一個方法間接拋出異常 } catch(e) { // 當(dāng)且僅當(dāng) try 語句塊拋出了異常,才會執(zhí)行這里的代碼 // 這里可以通過局部變量 e 來獲得對 Error 對象或者拋出的其他值的引用 // 這里的代碼塊可以基于某種原因處理這個異常,也可以忽略這個異常, // 還可以通過 throw 語句重新拋出異常 } finally { // 不管 try 語句塊是否拋出了異常,這里的邏輯總是會執(zhí)行,終止 try 語句塊的方式有: // 1)正常終止,執(zhí)行完語句塊的最后一條語句 // 2)通過 break、continue 或 return 語句終止 // 3)拋出一個異常,異常被 catch 從句捕獲 // 4)拋出一個異常,異常未被捕獲,繼續(xù)向上傳播 }其他 with 語句
with 語句的作用是將代碼的作用域設(shè)置到一個特定的對象中。with 語句的語法如下:
with (expression) statement;
定義 with 語句的目的主要是為了簡化多次編寫同一個對象的工作,如下面的例子所示:
var qs = location.search.substring(1); var hostName = location.hostname; var url = location.href;
上面幾行代碼都包含 location 對象。如果使用 with 語句,可以把上面的代碼改寫成如下所示:
with(location){ var qs = search.substring(1); var hostName = hostname; var url = href; }
在這個重寫后的例子中,使用 with 語句關(guān)聯(lián)了 location 對象。這意味著在 with 語句的代碼塊內(nèi)部,每個變量首先被認(rèn)為是一個局部變量,而如果在局部環(huán)境中找不到該變量的定義,就會查詢 location 對象中是否有同名的屬性。如果發(fā)現(xiàn)了同名屬性,則以 location 對象屬性的值作為變量的值。
由于大量使用 with 語句會導(dǎo)致性能下降,同時也會給調(diào)試代碼造成困難,因此在開發(fā)大型應(yīng)用程序時,不建議使用 with 語句。嚴(yán)格模式下不允許使用 with 語句,否則將視為語法錯誤。
debugger 語句debugger 語句通常什么也不做。然而,當(dāng)瀏覽器的調(diào)試工具可用并運行的時候,JavaScript 解釋器將會以調(diào)式模式運行。實際上,這條語句用來產(chǎn)生一個斷點(breakpoint),JavaScript 代碼的執(zhí)行會停止在斷點的位置,這時可以使用調(diào)試器輸出變量的值、檢查調(diào)用棧等。例如:
function f(o) { if (o === undefined) { debugger; // 程序會停止在該位置 } // 函數(shù)的其他部分 }use strict 語句
關(guān)卡請參見「語法」-「嚴(yán)格模式」。
// 挑戰(zhàn)一 var k; for(i=0, j=0; i<10, j<6; i++, j++){ k = i + j; } console.log(k); // ???
// 挑戰(zhàn)二 var nums = [12,32,54,56,78,89]; for(var n in nums){ console.log(n); // ??? }
// 挑戰(zhàn)三 function showCase(value) { switch (value) { case "A": console.log("Case A"); break; case "B": console.log("Case B"); break; case undefined: console.log("undefined"); break; default: console.log("Do not know!"); } } showCase(new String("A")); // ???
// 挑戰(zhàn)四 function showCase(value) { switch (value) { case "A": console.log("Case A"); case "B": console.log("Case B"); break; case undefined: console.log("undefined"); break; default: console.log("Do not know!"); } } showCase(String("A")); // ???
// 挑戰(zhàn)五 var i = 0; for (;;) { if (i = 2) { continue; } if (i = 20) { break; } i++; } console.log(i); // ???更多
關(guān)注微信公眾號「劼哥舍」回復(fù)「答案」,獲取關(guān)卡詳解。
關(guān)注 https://github.com/stone0090/javascript-lessons,獲取最新動態(tài)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/80242.html
摘要:對象數(shù)組初始化表達式,闖關(guān)記之上文檔對象模型是針對和文檔的一個。闖關(guān)記之?dāng)?shù)組數(shù)組是值的有序集合。數(shù)組是動態(tài)的,根闖關(guān)記之語法的語法大量借鑒了及其他類語言如和的語法。 《JavaScript 闖關(guān)記》之 DOM(下) Element 類型 除了 Document 類型之外,Element 類型就要算是 Web 編程中最常用的類型了。Element 類型用于表現(xiàn) XML 或 HTML 元素...
摘要:的語法大量借鑒了及其他類語言如和的語法。也就是說,關(guān)鍵字變量函數(shù)名和所有的標(biāo)識符都必須采取一致的大小寫形式。中的字面量有字符串?dāng)?shù)字布爾值對象數(shù)組函數(shù)正則表達式,以及特殊的值。這是為了不破壞語法而特意選定的語法。 JavaScript 的語法大量借鑒了 C 及其他類 C 語言(如 Java 和 Perl)的語法。因此,熟悉這些語言的開發(fā)人員在接受 JavaScript 更加寬松的語法時,...
摘要:瀏覽器只是實現(xiàn)的宿主環(huán)境之一,其他宿主環(huán)境包括和。年月,版發(fā)布,成為國際標(biāo)準(zhǔn)。事件定義了事件和事件處理的接口。對于已經(jīng)正式納入標(biāo)準(zhǔn)的來說,盡管各瀏覽器都實現(xiàn)了某些眾所周知的共同特性,但其他特性還是會因瀏覽器而異。 JavaScript 是面向 Web 的編程語言,絕大多數(shù)現(xiàn)代網(wǎng)站都使用了 JavaScript,并且所有的現(xiàn)代 Web 瀏覽器(電腦,手機,平板)均包含了 JavaScri...
摘要:本課程之所以叫做闖關(guān)記,是因為部分章節(jié)精心設(shè)計了挑戰(zhàn)關(guān)卡,通過提供更多的實戰(zhàn)機會,讓大家可以循序漸進地有目的地有挑戰(zhàn)地開展學(xué)習(xí)。課程結(jié)構(gòu)及目錄以下目錄只是初步構(gòu)想,課程結(jié)構(gòu)及內(nèi)容會根據(jù)實際情況隨時進行調(diào)整。 為何寫作此課程 stone 主要負責(zé)基于 Web 的企業(yè)內(nèi)部管理系統(tǒng)的開發(fā),雖然能夠熟練地使用 JavaScript,但隨著對 JavaScript 的理解越來越深,才發(fā)現(xiàn)自己尚...
摘要:使用元素嵌入代碼時,只需為指定屬性。需要注意的是,帶有屬性的元素不應(yīng)該在其和元素之間再包含額外的代碼。在包含外部文件時,必須將屬性設(shè)置為指向相應(yīng)文件的。所有元素都會按照他們在頁面中出現(xiàn)的先后順序依次被解析。關(guān)注,獲取最新動態(tài)。 當(dāng)學(xué)習(xí)一門新的編程語言的時候,應(yīng)該邊學(xué)邊做,反復(fù)演練以加深理解。因此,你需要一個 JavaScript 解釋器。幸運的是,每一個 Web 瀏覽器都包含一個 Ja...
閱讀 2633·2021-11-19 09:56
閱讀 886·2021-09-24 10:25
閱讀 1653·2021-09-09 09:34
閱讀 2211·2021-09-09 09:33
閱讀 1066·2019-08-30 15:54
閱讀 552·2019-08-29 18:33
閱讀 1279·2019-08-29 17:19
閱讀 516·2019-08-29 14:19