表達(dá)式在 JavaScript 中是短語(yǔ)氓润,那么語(yǔ)句就是整句命令罢荡。表達(dá)式用來計(jì)算出一個(gè)值憨募,語(yǔ)句用來執(zhí)行以使某件事發(fā)生紧索。從本質(zhì)上看,語(yǔ)句定義了 JavaScript 中的主要語(yǔ)法菜谣,語(yǔ)句通常使用一或多個(gè)關(guān)鍵字來完成給定任務(wù)珠漂。語(yǔ)句可以很簡(jiǎn)單,例如通知函數(shù)退出尾膊;也可以比較復(fù)雜媳危,例如指定重復(fù)執(zhí)行某個(gè)命令的次數(shù)。下表列出了 JavaScript 大部分語(yǔ)句的語(yǔ)法和用途:
語(yǔ)句 | 語(yǔ)法 | 用途 |
---|---|---|
break |
break [label]; |
退出最內(nèi)層循環(huán)或者退出 switch 語(yǔ)句眯停,又或者退出 label 指定的語(yǔ)句 |
case |
case expression: |
在 switch 語(yǔ)句中標(biāo)記一條語(yǔ)句 |
continue |
continue [label]; |
重新開始最內(nèi)層的循環(huán)或重新開始 label 指定的循環(huán) |
debugger |
debugger; |
斷點(diǎn)器調(diào)試 |
default |
default; |
在 switch 中標(biāo)記默認(rèn)的語(yǔ)句 |
do-while |
do statement while(expression); |
while 循環(huán)的一種替代形式 |
empty |
; |
什么都不做 |
for |
for(init;expr;incr) statement |
簡(jiǎn)寫的循環(huán)結(jié)構(gòu) |
for-in |
for(var in object) statement |
遍歷一個(gè)對(duì)象的屬性 |
function |
function name([param[],...]) {statement}
|
聲明一個(gè)函數(shù) |
if-else |
if (expression) statement1 [else statement2]
|
執(zhí)行 statement1 或者 statement2
|
label |
label:statement |
給 statement 指定一個(gè)名字 label
|
return |
return [expression]; |
從函數(shù)返回一個(gè)值 |
switch |
switch(expression){statement} |
用 case 或者 default 語(yǔ)句標(biāo)記的多分支語(yǔ)句 |
throw |
throw expression; |
拋出異常 |
try |
try {statement} [catch {handler statement}] [finally {cleaup statement}]
|
捕獲異常 |
use strict |
"use strict" |
對(duì)腳本和函數(shù)應(yīng)用嚴(yán)格模式 |
var |
var name=[=expr][,...]; |
聲明并初始化一個(gè)或多個(gè)變量 |
while |
while(expression) statement |
基本的循環(huán)結(jié)構(gòu) |
with |
with(object) statement |
擴(kuò)展作用域鏈 |
條件語(yǔ)句
if-else
語(yǔ)句
大多數(shù)編程語(yǔ)言中最為常用的一個(gè)語(yǔ)句就是 if-else
語(yǔ)句济舆。以下是 if-else
語(yǔ)句的語(yǔ)法:
if (condition) statement1 [else statement2]
其中的 condition
可以是任意表達(dá)式;而且對(duì)這個(gè)表達(dá)式求值的結(jié)果不一定是布爾值莺债。JavaScript 會(huì)自動(dòng)調(diào)用 Boolean()
轉(zhuǎn)換函數(shù)將這個(gè)表達(dá)式的結(jié)果轉(zhuǎn)換為一個(gè)布爾值。如果對(duì) condition
求值的結(jié)果是 true
签夭,則執(zhí)行 statement1
齐邦,如果對(duì) condition
求值的結(jié)果是 false
,則執(zhí)行 statement2
第租。而且這兩個(gè)語(yǔ)句既可以是一行代碼措拇,也可以是一個(gè)代碼塊(以一對(duì)花括號(hào)括起來的多行代碼)。請(qǐng)看下面的例子:
if (i > 25)
console.log("Greater than 25."); // 單行語(yǔ)句
else {
console.log("Less than or equal to 25."); // 代碼塊中的語(yǔ)句
}
業(yè)界普遍推崇的最佳實(shí)踐是始終使用代碼塊慎宾,即使要執(zhí)行的只有一行代碼丐吓。因?yàn)檫@樣可以消除人們的誤解,否則可能讓人分不清在不同條件下要執(zhí)行哪些語(yǔ)句趟据。
switch
語(yǔ)句
switch
語(yǔ)句與 if
語(yǔ)句的關(guān)系最為密切券犁,而且也是在其他語(yǔ)言中普遍使用的一種流控制語(yǔ)句。JavaScript 中 switch
語(yǔ)句的語(yǔ)法與其他基于 C 的語(yǔ)言非常接近汹碱,如下所示:
switch (expression) {
case value: statement
break;
case value: statement
break;
case value: statement
break;
case value: statement
break;
default: statement
}
switch
語(yǔ)句中的每一種情形的含義是:“如果表達(dá)式等于這個(gè)值(value)粘衬,則執(zhí)行后面的語(yǔ)句(statement)”。而 break
關(guān)鍵字會(huì)導(dǎo)致代碼執(zhí)行流跳出 switch
語(yǔ)句。如果省略 break
關(guān)鍵字稚新,就會(huì)導(dǎo)致執(zhí)行完當(dāng)前 case
后勘伺,繼續(xù)執(zhí)行下一個(gè) case
。最后的 default
關(guān)鍵字則用于在表達(dá)式不匹配前面任何一種情形的時(shí)候褂删,也相當(dāng)于一個(gè) else
語(yǔ)句飞醉。從根本上講,switch
語(yǔ)句就是為了讓開發(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");
}
而與此等價(jià)的switch語(yǔ)句如下所示:
switch (i) {
case 25:
console.log("25");
break;
case 35:
console.log("35");
break;
case 45:
console.log("45");
break;
default:
console.log("Other");
}
通過為每個(gè)case后面都添加一個(gè)break語(yǔ)句屯阀,就可以避免同時(shí)執(zhí)行多個(gè)case代碼的情況冒掌。假如確實(shí)需要混合幾種情形,不要忘了在代碼中添加注釋蹲盘,說明你是有意省略了break關(guān)鍵字股毫。
雖然 JavaScript 中的 switch
語(yǔ)句借鑒自其他語(yǔ)言,但這個(gè)語(yǔ)句也有自己的特色召衔。首先铃诬,可以在 switch
語(yǔ)句中使用任何數(shù)據(jù)類型(在很多其他語(yǔ)言中只能使用數(shù)值),無論是字符串苍凛,還是對(duì)象都沒有問題趣席。其次,每個(gè) case
的值不一定是常量醇蝴,可以是變量宣肚,甚至是表達(dá)式。請(qǐng)看下面這兩個(gè)例子:
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
語(yǔ)句首先計(jì)算 switch
關(guān)鍵字后的表達(dá)式悠栓,然后按照從上到下的順序計(jì)算每個(gè) case
后的表達(dá)式霉涨,直到執(zhí)行到 case
的表達(dá)式的值與 switch
的表達(dá)式的值相等時(shí)為止。由于對(duì)每個(gè) case
的匹配操作實(shí)際上是 ===
恒等運(yùn)算符比較惭适,而不是 ==
相等運(yùn)算符比較笙瑟,因此,表達(dá)式和 case
的匹配并不會(huì)做任何類型轉(zhuǎn)換癞志。
循環(huán)
while
語(yǔ)句
while
語(yǔ)句屬于前測(cè)試循環(huán)語(yǔ)句往枷,也就是說,在循環(huán)體內(nèi)的代碼被執(zhí)行之前凄杯,就會(huì)對(duì)出口條件求值错洁。因引,循環(huán)體內(nèi)的代碼有可能永遠(yuǎn)不會(huì)被執(zhí)行戒突。以下是 while
語(yǔ)句的語(yǔ)法:
while(expression) statement
下面是一個(gè)示例:
var i = 0;
while (i < 10) {
i += 2;
}
do-while
語(yǔ)句
do-while
語(yǔ)句是一種后測(cè)試循環(huán)語(yǔ)句屯碴,即只有在循環(huán)體中的代碼執(zhí)行之后,才會(huì)測(cè)試出口條件妖谴。換句話說窿锉,在對(duì)條件表達(dá)式求值之前酌摇,循環(huán)體內(nèi)的代碼至少會(huì)被執(zhí)行一次。以下是 do-while
語(yǔ)句的語(yǔ)法:
do {
statement
} while (expression);
下面是一個(gè)示例:
var i = 0;
do {
i += 2;
} while (i < 10);
for
語(yǔ)句
for
語(yǔ)句也是一種前測(cè)試循環(huán)語(yǔ)句嗡载,但它具有在執(zhí)行循環(huán)之前初始化變量和定義循環(huán)后要執(zhí)行的代碼的能力窑多。以下是 for
語(yǔ)句的語(yǔ)法:
for (initialization; expression; post-loop-expression) statement
下面是一個(gè)示例:
var count = 10;
for (var i = 0; i < count; i++){
console.log(i);
}
這個(gè) for
循環(huán)語(yǔ)句與下面的 while
語(yǔ)句的功能相同:
var count = 10;
var i = 0;
while (i < count){
console.log(i);
i++;
}
由于 JavaScript 中不存在塊級(jí)作用域,因此在循環(huán)內(nèi)部定義的變量也可以在外部訪問到洼滚。例如:
var count = 10;
for (var i = 0; i < count; i++){
console.log(i);
}
console.log(i); // 10
此外埂息,for
語(yǔ)句中的初始化表達(dá)式、控制表達(dá)式和循環(huán)后表達(dá)式都是可選的遥巴。將這兩個(gè)表達(dá)式全部省略千康,就會(huì)創(chuàng)建一個(gè)無限循環(huán),例如:
// 無限循環(huán)
for (;;) {
doSomething();
}
for-in
語(yǔ)句
for-in
語(yǔ)句是一種精準(zhǔn)的迭代語(yǔ)句铲掐,可以用來枚舉對(duì)象的屬性拾弃。以下是 for-in
語(yǔ)句的語(yǔ)法:
for (property in object) statement
下面是一個(gè)示例:
for (var propName in window) {
console.log(propName);
}
在這個(gè)例子中,我們使用 for-in
循環(huán)來顯示了 BOM 中 window
對(duì)象的所有屬性摆霉。每次執(zhí)行循環(huán)時(shí)豪椿,都會(huì)將 window
對(duì)象中存在的一個(gè)屬性名賦值給變量 propName
。這個(gè)過程會(huì)一直持續(xù)到對(duì)象中的所有屬性都被枚舉一遍為止携栋。與 for
語(yǔ)句類似搭盾,這里控制語(yǔ)句中的 var
操作符也不是必需的。但是婉支,為了保證使用局部變量鸯隅,我們推薦上面例子中的這種做法。
JavaScript 對(duì)象的屬性沒有順序向挖。因此蝌以,通過 for-in
循環(huán)輸出的屬性名的順序是不可預(yù)測(cè)的。具體來講户誓,所有屬性都會(huì)被返回一次饼灿,但返回的先后次序可能會(huì)因?yàn)g覽器而異。
如果表示要迭代的對(duì)象的變量值為 null
或 undefined
帝美,for-in
語(yǔ)句會(huì)拋出錯(cuò)誤。雖然 ECMAScript 5更正了這一行為晤硕;對(duì)這種情況不再拋出錯(cuò)誤悼潭,而只是不執(zhí)行循環(huán)體笨奠。為了保證最大限度的兼容性箕别,建議在使用 for-in
循環(huán)之前貌亭,先檢測(cè)確認(rèn)該對(duì)象的值不是 null
或 undefined
踩蔚。
跳轉(zhuǎn)
label
語(yǔ)句
使用 label
語(yǔ)句可以在代碼中添加標(biāo)簽源譬,以便將來使用闰集。以下是 label
語(yǔ)句的語(yǔ)法:
label: statement
下面是一個(gè)示例:
start: for (var i=0; i < count; i++) {
console.log(i);
}
這個(gè)例子中定義的 start
標(biāo)簽可以在將來由 break
或 continue
語(yǔ)句引用勃教。加標(biāo)簽的語(yǔ)句一般都要與 for
語(yǔ)句等循環(huán)語(yǔ)句配合使用兄墅。
break
和 continue
語(yǔ)句
break
和 continue
語(yǔ)句用于在循環(huán)中精確地控制代碼的執(zhí)行。其中晃酒,break
語(yǔ)句會(huì)立即退出循環(huán)表牢,強(qiáng)制繼續(xù)執(zhí)行循環(huán)后面的語(yǔ)句。而 continue
語(yǔ)句雖然也是立即退出循環(huán)贝次,但退出循環(huán)后會(huì)從循環(huán)的頂部繼續(xù)執(zhí)行崔兴。請(qǐng)看下面的例子:
var num = 0;
for (var i=1; i < 10; i++) {
if (i % 5 == 0) {
break;
}
num++;
}
console.log(num); // 4
這個(gè)例子中的 for
循環(huán)會(huì)將變量 i
由1遞增至 10
。在循環(huán)體內(nèi)蛔翅,有一個(gè) if
語(yǔ)句檢查 i
的值是否可以被 5
整除(使用求模運(yùn)算符)敲茄。如果是,則執(zhí)行 break
語(yǔ)句退出循環(huán)山析。另一方面堰燎,變量 num
從 0
開始,用于記錄循環(huán)執(zhí)行的次數(shù)笋轨。在執(zhí)行 break
語(yǔ)句之后秆剪,結(jié)果顯示 4
。也就是說翩腐,在變量 i
等于 5
時(shí)鸟款,循環(huán)總共執(zhí)行了 4
次;而 break
語(yǔ)句的執(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
時(shí),循環(huán)會(huì)在 num
再次遞增之前退出蛛砰,但接下來執(zhí)行的是下一次循環(huán)罐栈,即i的值等于 6
的循環(huán)。于是泥畅,循環(huán)又繼續(xù)執(zhí)行荠诬,直到 i
等于 10
時(shí)自然結(jié)束。而 num
的最終值之所以是 8
位仁,是因?yàn)?continue
語(yǔ)句導(dǎo)致它少遞增了一次柑贞。
break
和 continue
語(yǔ)句都可以與 label
語(yǔ)句聯(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
在這個(gè)例子中,outermost
標(biāo)簽表示外部的 for
語(yǔ)句琳疏。如果每個(gè)循環(huán)正常執(zhí)行 10
次有决,則 num++
語(yǔ)句就會(huì)正常執(zhí)行 100
次闸拿。換句話說,如果兩個(gè)循環(huán)都自然結(jié)束书幕,num
的值應(yīng)該是 100
新荤。但內(nèi)部循環(huán)中的 break
語(yǔ)句帶了一個(gè)參數(shù):要返回到的標(biāo)簽。添加這個(gè)標(biāo)簽的結(jié)果將導(dǎo)致 break
語(yǔ)句不僅會(huì)退出內(nèi)部的 for
語(yǔ)句(即使用變量 j
的循環(huán))按咒,而且也會(huì)退出外部的 for
語(yǔ)句(即使用變量 i
的循環(huán))迟隅。為此,當(dāng)變量 i
和 j
都等于 5
時(shí)励七, num
的值正好是 55
智袭。同樣,continue
語(yǔ)句也可以像這樣與 label
語(yǔ)句聯(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
語(yǔ)句會(huì)強(qiáng)制繼續(xù)執(zhí)行循環(huán),退出內(nèi)部循環(huán)两波,執(zhí)行外部循環(huán)瞳步。當(dāng) j
是 5
時(shí),continue
語(yǔ)句執(zhí)行腰奋,而這也就意味著內(nèi)部循環(huán)少執(zhí)行了 5
次单起,因此 num
的結(jié)果是 95
。
雖然聯(lián)用 break
劣坊、continue
和 label
語(yǔ)句能夠執(zhí)行復(fù)雜的操作嘀倒,但如果使用過度,也會(huì)給調(diào)試帶來麻煩局冰。在此测蘑,我們建議如果使用 label
語(yǔ)句,一定要使用描述性的標(biāo)簽康二,同時(shí)不要嵌套過多的循環(huán)碳胳。
return
語(yǔ)句
return
語(yǔ)句的作用是指定函數(shù)調(diào)用后的返回值。return
語(yǔ)句的語(yǔ)法如下:
return [expression];
下面是一個(gè)示例:
function square(x) { return x*x; } // 一個(gè)包含 return 語(yǔ)句的函數(shù)
square(2); // 調(diào)用結(jié)果為 4
return
語(yǔ)句只能在函數(shù)體內(nèi)出現(xiàn)沫勿,如果不是的話會(huì)報(bào)語(yǔ)法錯(cuò)誤挨约。當(dāng)執(zhí)行到 return
語(yǔ)句的時(shí)候,函數(shù)終止執(zhí)行产雹,并返回 expression
的值給調(diào)用程序烫罩。如果沒有 return
語(yǔ)句,則函數(shù)調(diào)用僅依次執(zhí)行函數(shù)體內(nèi)的每一條語(yǔ)句直到函數(shù)結(jié)束洽故,最后返回調(diào)用程序。這種情況下盗誊,調(diào)用表達(dá)式的結(jié)果是 undefined
时甚。return
語(yǔ)句經(jīng)常作為函數(shù)內(nèi)的最后一條語(yǔ)句出現(xiàn)隘弊,但并不是說要一定放在函數(shù)最后。return
語(yǔ)句可以單獨(dú)使用而不必帶有 expression
荒适,這樣的話函數(shù)也會(huì)向調(diào)用程序返回 undefined
梨熙。
由于 JavaScript 可以自動(dòng)插入分號(hào),因此在 return
關(guān)鍵字和它后面的表達(dá)式之間不能有換行刀诬。
throw
語(yǔ)句
throw
語(yǔ)句的作用是把程序運(yùn)行時(shí)產(chǎn)生的錯(cuò)誤顯式地拋出異常咽扇。throw
語(yǔ)句的語(yǔ)法如下:
throw expression;
expression
的值可以是任意類型的∩乱迹可以拋出一個(gè)代表錯(cuò)誤碼的數(shù)字质欲,或者包含可讀的錯(cuò)誤消息的字符串。當(dāng) JavaScript 解釋器拋出異常的時(shí)候通常采用 Error
類型和其子類型糠馆。Error
對(duì)象有一個(gè) name
屬性表示錯(cuò)誤類型嘶伟,一個(gè) message
屬性用來存放傳遞給構(gòu)造函數(shù)的字符串,在下面的例子中又碌,當(dāng)使用非法參數(shù)調(diào)用函數(shù)時(shí)就拋出一個(gè) Error
對(duì)象:
function factorial(x) {
// 如果輸入?yún)?shù)是非法的九昧,則拋出一個(gè)異常
if (x < 0) throw new Error("x不能是負(fù)數(shù)");
// 否則,計(jì)算出一個(gè)值毕匀,并正常地返回它
for(var f = 1; x > 1; f *= x, x--) /* empty */ ;
return f;
}
當(dāng)拋出異常時(shí)铸鹰,JavaScript 解釋器會(huì)立即停止當(dāng)前正在執(zhí)行的邏輯,并跳轉(zhuǎn)至就近的異常處理程序皂岔。如果沒有找到任何異常處理程序蹋笼,異常就會(huì)沿著 JavaScript 方法的詞法結(jié)構(gòu)和調(diào)用棧向上傳播。最終 JavaScript 將把異常當(dāng)成程序錯(cuò)誤來處理凤薛,并報(bào)告給用戶姓建。
try
語(yǔ)句
try-catch-finally
語(yǔ)句是 JavaScript 中異常處理機(jī)制,try-catch-finally
語(yǔ)句的語(yǔ)法如下:
try {statement} [catch {handler statement}] [finally {cleaup statement}]
try
從句定義了需要處理的異常所在的代碼塊缤苫。catch
從句跟隨在 try
從句之后速兔,當(dāng) try
塊內(nèi)某處發(fā)生了異常時(shí),調(diào)用 catch
內(nèi)的代碼邏輯活玲。catch
從句后跟隨 finally
塊涣狗,后者中放置清理代碼,不管 try
塊中是否產(chǎn)生異常舒憾,finally
塊內(nèi)的邏輯總是會(huì)執(zhí)行镀钓。盡管 catch
和 finally
都是可選的,但 try
從句需要至少二者之一與之組成完整的語(yǔ)句镀迂。try
丁溅、catch
和 finally
語(yǔ)句塊都需要使用花括號(hào)括起來,這里的花括號(hào)是必需的探遵,即使從句中只有一條語(yǔ)句也不能省略花括號(hào)窟赏。
下面的代碼詳細(xì)的說明了 try-catch-finally
的使用目的:
try {
// 通常來講妓柜,這里的代碼會(huì)從頭執(zhí)行到尾而不會(huì)產(chǎn)生任何問題,
// 但有時(shí)會(huì)拋出一個(gè)異常涯穷,要么是由 throw 語(yǔ)句直接拋出異常棍掐,
// 要么是通過調(diào)用一個(gè)方法間接拋出異常
}
catch(e) {
// 當(dāng)且僅當(dāng) try 語(yǔ)句塊拋出了異常,才會(huì)執(zhí)行這里的代碼
// 這里可以通過局部變量 e 來獲得對(duì) Error 對(duì)象或者拋出的其他值的引用
// 這里的代碼塊可以基于某種原因處理這個(gè)異常拷况,也可以忽略這個(gè)異常作煌,
// 還可以通過 throw 語(yǔ)句重新拋出異常
}
finally {
// 不管 try 語(yǔ)句塊是否拋出了異常,這里的邏輯總是會(huì)執(zhí)行赚瘦,終止 try 語(yǔ)句塊的方式有:
// 1)正常終止粟誓,執(zhí)行完語(yǔ)句塊的最后一條語(yǔ)句
// 2)通過 break、continue 或 return 語(yǔ)句終止
// 3)拋出一個(gè)異常蚤告,異常被 catch 從句捕獲
// 4)拋出一個(gè)異常努酸,異常未被捕獲,繼續(xù)向上傳播
}
其他
with
語(yǔ)句
with
語(yǔ)句的作用是將代碼的作用域設(shè)置到一個(gè)特定的對(duì)象中杜恰。with
語(yǔ)句的語(yǔ)法如下:
with (expression) statement;
定義 with
語(yǔ)句的目的主要是為了簡(jiǎn)化多次編寫同一個(gè)對(duì)象的工作获诈,如下面的例子所示:
var qs = location.search.substring(1);
var hostName = location.hostname;
var url = location.href;
上面幾行代碼都包含 location
對(duì)象。如果使用 with
語(yǔ)句心褐,可以把上面的代碼改寫成如下所示:
with(location){
var qs = search.substring(1);
var hostName = hostname;
var url = href;
}
在這個(gè)重寫后的例子中舔涎,使用 with
語(yǔ)句關(guān)聯(lián)了 location
對(duì)象。這意味著在 with
語(yǔ)句的代碼塊內(nèi)部逗爹,每個(gè)變量首先被認(rèn)為是一個(gè)局部變量亡嫌,而如果在局部環(huán)境中找不到該變量的定義,就會(huì)查詢 location
對(duì)象中是否有同名的屬性掘而。如果發(fā)現(xiàn)了同名屬性挟冠,則以 location
對(duì)象屬性的值作為變量的值。
由于大量使用 with
語(yǔ)句會(huì)導(dǎo)致性能下降袍睡,同時(shí)也會(huì)給調(diào)試代碼造成困難知染,因此在開發(fā)大型應(yīng)用程序時(shí),不建議使用 with
語(yǔ)句斑胜。嚴(yán)格模式下不允許使用 with
語(yǔ)句控淡,否則將視為語(yǔ)法錯(cuò)誤。
debugger
語(yǔ)句
debugger
語(yǔ)句通常什么也不做止潘。然而掺炭,當(dāng)瀏覽器的調(diào)試工具可用并運(yùn)行的時(shí)候,JavaScript 解釋器將會(huì)以調(diào)式模式運(yùn)行凭戴。實(shí)際上涧狮,這條語(yǔ)句用來產(chǎn)生一個(gè)斷點(diǎn)(breakpoint),JavaScript 代碼的執(zhí)行會(huì)停止在斷點(diǎn)的位置,這時(shí)可以使用調(diào)試器輸出變量的值勋篓、檢查調(diào)用棧等吧享。例如:
function f(o) {
if (o === undefined) {
debugger; // 程序會(huì)停止在該位置
}
// 函數(shù)的其他部分
}
use strict
語(yǔ)句
請(qǐng)參見「語(yǔ)法」-「嚴(yán)格模式」。
關(guā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)注微信公眾號(hào)「劼哥舍」回復(fù)「答案」譬嚣,獲取關(guān)卡詳解。
關(guān)注 https://github.com/stone0090/javascript-lessons钞它,獲取最新動(dòng)態(tài)拜银。