《JavaScript 闖關(guān)記》之語(yǔ)句

表達(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ì)象的變量值為 nullundefined帝美,for-in 語(yǔ)句會(huì)拋出錯(cuò)誤。雖然 ECMAScript 5更正了這一行為晤硕;對(duì)這種情況不再拋出錯(cuò)誤悼潭,而只是不執(zhí)行循環(huán)體笨奠。為了保證最大限度的兼容性箕别,建議在使用 for-in 循環(huán)之前貌亭,先檢測(cè)確認(rèn)該對(duì)象的值不是 nullundefined踩蔚。

跳轉(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)簽可以在將來由 breakcontinue 語(yǔ)句引用勃教。加標(biāo)簽的語(yǔ)句一般都要與 for 語(yǔ)句等循環(huán)語(yǔ)句配合使用兄墅。

breakcontinue 語(yǔ)句

breakcontinue 語(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)山析。另一方面堰燎,變量 num0 開始,用于記錄循環(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)致它少遞增了一次柑贞。

breakcontinue 語(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)變量 ij 都等于 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) j5 時(shí),continue 語(yǔ)句執(zhí)行腰奋,而這也就意味著內(nèi)部循環(huán)少執(zhí)行了 5 次单起,因此 num 的結(jié)果是 95

雖然聯(lián)用 break劣坊、continuelabel 語(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í)行镀钓。盡管 catchfinally 都是可選的,但 try 從句需要至少二者之一與之組成完整的語(yǔ)句镀迂。try丁溅、catchfinally 語(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)拜银。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市遭垛,隨后出現(xiàn)的幾起案子尼桶,更是在濱河造成了極大的恐慌,老刑警劉巖锯仪,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泵督,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡庶喜,警方通過查閱死者的電腦和手機(jī)小腊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來久窟,“玉大人秩冈,你說我怎么就攤上這事〕饪福” “怎么了入问?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)稀颁。 經(jīng)常有香客問我芬失,道長(zhǎng),這世上最難降的妖魔是什么匾灶? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任棱烂,我火速辦了婚禮,結(jié)果婚禮上粘昨,老公的妹妹穿的比我還像新娘垢啼。我一直安慰自己,他們只是感情好张肾,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布芭析。 她就那樣靜靜地躺著,像睡著了一般吞瞪。 火紅的嫁衣襯著肌膚如雪馁启。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音惯疙,去河邊找鬼翠勉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛霉颠,可吹牛的內(nèi)容都是我干的对碌。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼蒿偎,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼朽们!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起诉位,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤骑脱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后苍糠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叁丧,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年岳瞭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拥娄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寝优,死狀恐怖条舔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情乏矾,我是刑警寧澤孟抗,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站钻心,受9級(jí)特大地震影響凄硼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捷沸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一摊沉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧痒给,春花似錦说墨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至试吁,卻和暖如春棺棵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工烛恤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留母怜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓缚柏,卻偏偏與公主長(zhǎng)得像苹熏,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子船惨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容