JavaScript控制語句見習(xí)

1.標(biāo)簽跳轉(zhuǎn)

類似于C語言里面有g(shù)oto語句瘪阁,JavaScript里面有個(gè)語句跳轉(zhuǎn)的玩意兒操禀,叫做標(biāo)簽跳轉(zhuǎn)隧枫。不過它沒有C語言這么夸張纬乍,C語言好像設(shè)定是可以跳轉(zhuǎn)到函數(shù)內(nèi)任意的地方第晰。我們先來看一個(gè)C語言的例子锁孟。

#include <stdio.h>

int main() {
  int i = 0;
 tag:
  printf("Hello Lan\n");
  printf("Hello World\n");
  if(i < 10) {printf("%d\n", i);}
  goto tag;
}

很遺憾這里是一個(gè)無限循環(huán)。會(huì)不斷打印出Hello Lan, Hello World, 0但荤。在taggoto之間還是可以存在有挺多語句的罗岖。這樣給C語言帶來了不少麻煩。所以就算是C語言的作者也不建議我們使用goto語句腹躁。如果太多這類跳轉(zhuǎn)只會(huì)徒增代碼維護(hù)的成本桑包。(更可怕的是Review你代碼的人可能會(huì)拿著菜刀來追你!!)

于此相對(duì)應(yīng)的Javascript的跳轉(zhuǎn)有節(jié)操很多。標(biāo)簽只定義在條件語句或者循環(huán)語句前面, 而且如果標(biāo)簽與目標(biāo)語句之間還有額外的語句纺非,就不能通過解釋器哑了。我們只能從條件語句或者循環(huán)語句內(nèi)部通過continue, break兩個(gè)關(guān)鍵字進(jìn)行跳轉(zhuǎn)。烧颖。不再多說弱左,舉幾個(gè)栗子就很好理解了。

// example.js
var a = 10;
tag1:while(a < 100) {
    a++;
    if (a == 90) continue tag1;
}
console.log("value of a is: " + a);

var b = 10;
tag2: if(b < 100) {
    b++;
    break tag2;
}
console.log("value of b is: " + b);

var c = 10;
tag3:while(c < 100) {
    c++;
    if (c == 90) break tag3;
}
console.log("value of c is: " + c);

打印的結(jié)果是:

value of a is: 100
value of b is: 11
value of c is: 90

continue跳轉(zhuǎn)tag會(huì)跳轉(zhuǎn)到tag的位置炕淮,然后繼續(xù)執(zhí)行對(duì)應(yīng)的循環(huán)拆火。(因?yàn)闂l件語句里面也用不了continue),而break跳轉(zhuǎn)tag會(huì)終止tag所指示的循環(huán)語句或者條件語句的運(yùn)行涂圆。

這里我們tag1用了continue所以它會(huì)跳轉(zhuǎn)到tag1然后繼續(xù)執(zhí)行while循環(huán)们镜,直到a>=100才退出循環(huán)。而我們tag2處用了break润歉,直接結(jié)束了tag2所指示的語句模狭。我們只執(zhí)行了一次b++所以得到了11這個(gè)結(jié)果。

不能夠在標(biāo)簽與指定語句之間添加其他語句踩衩,或者在條件以及循環(huán)以外的情景打標(biāo)簽嚼鹉。下面是錯(cuò)誤示范

// error1.js

var d = 10;
tag4:
// 在標(biāo)簽與想指定的循環(huán)之間插入語句贩汉。
console.log("good");
while(d < 100) {
    d++;
    if (d == 90) break tag3;
}
console.log("value of d is: " + d);
// error2.js
// 對(duì)函數(shù)打標(biāo)簽, 這條也是錯(cuò)誤的語法
tag:function errorFun() {
    console.log("good");
    break tag;
}

上面的語句都是無法通過解釋器的。只是作為反面教材锚赤。請(qǐng)大家謹(jǐn)慎了匹舞。總的來說Javascript的跳轉(zhuǎn)相比于C可維護(hù)性方面還是稍微高了點(diǎn)宴树。畢竟限制多了策菜。大家酌情使用吧。

2.continue語句對(duì)于for跟while兩種循環(huán)會(huì)有不同的行為

continue語句在while循環(huán)中直接進(jìn)入下一輪循環(huán)酒贬。而在for循環(huán)中使用則先計(jì)算increment表達(dá)式又憨,然后再進(jìn)行循環(huán)條件判斷。

-_-這聽起來就是個(gè)坑嘛锭吨。

我還是舉例子說明一下

// loop1.js
for (var i = 0; i < 10; i++) {
    console.log(i);
    continue;
}
// loop2.js
var i = 0;
while(i < 10) {
    if (i === 8) continue;
    console.log(i);
    i++;
}

兩個(gè)看似一樣的循環(huán)蠢莺。其實(shí)第一個(gè)循環(huán)會(huì)打印出0 1 2 3 4 5 6 7 8 9的數(shù)字。而第二個(gè)則打印到7的時(shí)候就進(jìn)入無限循環(huán)了零如。這表明了for循環(huán)在使用continue的時(shí)候先執(zhí)行了for語句中的遞增語句然后才進(jìn)行條件判斷躏将。而while循環(huán)中則直接進(jìn)行條件判斷了。使用這兩個(gè)循環(huán)語句的時(shí)候請(qǐng)小心這個(gè)特性考蕾。

說到這里必須要提一提我們的異常處理

3.finally語句的一些奇怪特性

如果finally從句運(yùn)行到了return語句祸憋,盡管已經(jīng)拋出異常且這個(gè)異常還沒有處理,這個(gè)方法依然會(huì)正常返回肖卧。

這感覺又是一個(gè)坑啊蚯窥。

// exception.js
var foo = function() {
    try {
        throw Error();
    } finally {
        return 1;
    }
}

console.log(foo());

你要知道這個(gè)東西最后得出的結(jié)果是

1

它并沒有理會(huì)拋出的錯(cuò)誤而是正常返回了。汗!!!
為此有些喪心病狂的人還想采用這種特性用while來模擬for循環(huán)的行為塞帐。

// loop3.js
var i = 0;
while(i < 10) {
    try {
        if (i == 8) continue;
        console.log(i);
    } finally {
        i ++;
    }
}

這看起來是沒什么問題拦赠。無論怎樣while循環(huán)都會(huì)執(zhí)行increment語句了。這似乎已經(jīng)解決了while循環(huán)中包含continue的話直接跳到測(cè)試語句的問題葵姥。continue語句直接跳轉(zhuǎn)到finally執(zhí)行遞增語句荷鼠。這行為似乎跟for相同了。

But榔幸,如果我們try語句里面包含的是break的話允乐。放在for循環(huán)看則會(huì)直接退出。而加入了trywhile循環(huán)則會(huì)執(zhí)行了increment操作之后才退出循環(huán)削咆。

-_-最后喳篇,他們有了這個(gè)結(jié)論。

即便使用了finally态辛,用while來完全模擬for循環(huán)依然是不可能的。

幾個(gè)個(gè)比較簡(jiǎn)單的東西好像也說了不少挺尿。下次會(huì)控制篇幅奏黑,感謝你能看到這里炊邦。

Happy Coding !!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市熟史,隨后出現(xiàn)的幾起案子馁害,更是在濱河造成了極大的恐慌,老刑警劉巖蹂匹,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碘菜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡限寞,警方通過查閱死者的電腦和手機(jī)忍啸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來履植,“玉大人计雌,你說我怎么就攤上這事∶钓” “怎么了凿滤?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)庶近。 經(jīng)常有香客問我翁脆,道長(zhǎng),這世上最難降的妖魔是什么鼻种? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任反番,我火速辦了婚禮,結(jié)果婚禮上普舆,老公的妹妹穿的比我還像新娘恬口。我一直安慰自己,他們只是感情好沼侣,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布祖能。 她就那樣靜靜地躺著,像睡著了一般蛾洛。 火紅的嫁衣襯著肌膚如雪养铸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天轧膘,我揣著相機(jī)與錄音钞螟,去河邊找鬼。 笑死谎碍,一個(gè)胖子當(dāng)著我的面吹牛鳞滨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蟆淀,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼拯啦,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼澡匪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起褒链,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤唁情,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后甫匹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體甸鸟,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年兵迅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抢韭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡喷兼,死狀恐怖篮绰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情季惯,我是刑警寧澤吠各,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站勉抓,受9級(jí)特大地震影響贾漏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜藕筋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一纵散、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧隐圾,春花似錦伍掀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盐碱,卻和暖如春把兔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓮顽。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工县好, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人暖混。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓缕贡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子善绎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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

  • 作者的序言 朋友們黔漂,棄療系列4出來啦,作者還并沒有放棄禀酱,感覺自己萌萌噠,233牧嫉。 語句 js程序其實(shí)就是一系列可執(zhí)...
    zhaolion閱讀 1,747評(píng)論 0 8
  • [The Swift Programming Language 中文版]本頁包含內(nèi)容: Swift提供了多種流程控...
    風(fēng)林山火閱讀 559評(píng)論 0 0
  • 女人是家中的定心丸剂跟,事要少,心要大酣藻,別找事曹洽,能容人。古人立德修善都是遇人危急則委曲成全辽剧,遇有橫逆則反躬自省送淆,...
    許若湃閱讀 1,506評(píng)論 2 2
  • 其實(shí)姑娘到現(xiàn)在都覺得少年也許只是自己的一個(gè)夢(mèng)來的。他就像是兔子偶爾打出的飽嗝般怕轿,飄飄然出現(xiàn)在她面前偷崩,偶爾跟他有一搭...
    沙加之倫閱讀 300評(píng)論 0 0
  • 今天打完羽毛球,現(xiàn)在感覺好累撞羽,該睡覺了阐斜。
    幽九天獨(dú)步閱讀 149評(píng)論 0 0