您好,登錄后才能下訂單哦!
今天小編給大家分享一下JavaScript循環(huán)語句有哪些及怎么用的相關(guān)知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
在編程中,經(jīng)常需要使用循環(huán)語句處理各種各樣重復(fù)的工作。
例如,使用JavaScript
生成一個學(xué)生名稱列表,這就需要創(chuàng)建一個HTML
的<ul>
標簽,然后重復(fù)的往標簽中插入<li>
子標簽,從而生成如下的HTML
結(jié)構(gòu):
<ul><li>小明</li><li>小紅</li><li>小軍</li><li>...</li></ul>
不過,DOM
操作不是本文的主要內(nèi)容,后續(xù)章節(jié)會逐步介紹的。
循環(huán)語句共有三種類型:while
、do while
和for
,讀完本文就能掌握所有的循環(huán)了。
while
語法:
while(exp){ //循環(huán)體}
while
語句主要包括執(zhí)行條件exp
,和循環(huán)體兩部分。
執(zhí)行條件通常是一個條件表達式,例如i > 0
表示當(dāng)只有當(dāng)變量i
大于0
的時候,才會執(zhí)行循環(huán)體。
舉個栗子:
let i = 10;while(i>0){ console.log(i);//在控制臺輸出 i--;}
以上代碼創(chuàng)建了一個變量i
,并賦值為10
,當(dāng)i > 0
成立時,執(zhí)行{}
中的代碼。
代碼console.log(i);
可以在控制臺輸出一個字符串,敲黑板,控制臺還知道是什么吧!
然后執(zhí)行i--
,也就是變量i
的值減去1
。
總結(jié)上述代碼的作用就是,在瀏覽器的控制臺循環(huán)輸出變量i
,從10
輸出到1
。
代碼執(zhí)行結(jié)果如下圖:
通常情況下,循環(huán)的判斷條件都是一個條件表達式。條件表達式返回布爾值,當(dāng)返回值是true
時就執(zhí)行循環(huán)體,當(dāng)返回值是false
時,就結(jié)束循環(huán)語句的執(zhí)行。
實際上,判斷條件可以是任何類型的表達式,這里同樣會通過隱式轉(zhuǎn)換將表達式的計算結(jié)果轉(zhuǎn)為Boolean
型。
例如 i > 0
可以簡寫為while(i)
:
let i = 3;while (i) { // 當(dāng) i 變成 0 時,Boolean(i)為false console.log(i); i--;}
由于Boolean(0)
是false
所以以上代碼是成立的。
循環(huán)條件(變量i
)必須在每次執(zhí)行的過程中不斷的執(zhí)行減一操作,也就是i--
,否則i
的值永遠都大于0
,循環(huán)也就永遠不會停止,也就是常說的死循環(huán)。
如果出現(xiàn)了死循環(huán)并非沒有解決的方法,我們可以通過殺死當(dāng)前進程結(jié)束代碼執(zhí)行。
最簡單的做法就是,關(guān)閉瀏覽器,然后去控制臺殺死瀏覽器進程。
死循環(huán)對程序來講非常危險,它會占滿cpu
資源,甚至是整個內(nèi)存空間,造成死機。
所以,在編寫循環(huán)時,一定要注意不要忘記循環(huán)條件的更改。
當(dāng)循環(huán)體中只有一條語句時,就可以省略{}
花括號,從而簡化代碼。
舉個簡答的小李子:
let i = 10;while(i>0)console.log(i--);
執(zhí)行效果和上面的代碼是一樣的。
do{ //循環(huán)體}while(exp);
和while
循環(huán)不同的是,do {...} while
循環(huán)將判斷條件和循環(huán)體交換了位置,在判斷循環(huán)條件之前,會首先執(zhí)行一次循環(huán)體。
let i = 0;do { console.log(i); i++;} while (i<10);
以上代碼會輸出0~9
的數(shù)字,執(zhí)行結(jié)果如下:
也就是說使用do {...} while
語句,循環(huán)體至少為執(zhí)行一次:
let i = 0do { console.log(i) i--;}while(i>0);
以上代碼,雖然i
從一開始就不滿足執(zhí)行條件,循環(huán)體依舊會執(zhí)行一次。
實際上,
do {...} while
語句在現(xiàn)實編程過程中使用的非常少!
因為很少有情況需要我們在判斷條件不成立的情況下,依舊要執(zhí)行一次循環(huán)體。
即使存在這種情況,我們也通常使用while代替。
相較而言,for
循環(huán)語句是最復(fù)雜的,但也是最受歡迎的。
for(begin; exp; step){ //循環(huán)體}
直接從語法角度解釋for
可能令人疑惑,下面是一個最常見的案例:
for(let i = 0; i < 10 ; i++){ console.log(i)}
對比解讀:
語法構(gòu)件 | 對應(yīng)語句 | 解讀 |
---|---|---|
begin | let i = 0 | 首次執(zhí)行循環(huán)時,執(zhí)行一次 |
exp | i < 10 | 每次循環(huán)之前,進行判斷,true 則執(zhí)行循環(huán)體,否則停止循環(huán) |
step | i++ | 每次循環(huán)體執(zhí)行過后執(zhí)行 |
以上代碼的執(zhí)行順序是:
let i = 0;
,進入循環(huán)語句時執(zhí)行,只執(zhí)行一次;
判斷i < 10
,如果成立繼續(xù)執(zhí)行,否則推出循環(huán);
執(zhí)行console.log(i)
,控制臺輸出變量i
的值;
執(zhí)行i++
,改變循環(huán)變量i
的值;
循環(huán)執(zhí)行2 3 4
步,直至i < 10
不成立。
實際上,以上代碼在功能上完全等價于:
let i = 0;while(i < 10){ console.log(i); i++;}
和while
、do {...} while
不同的是,for
循環(huán)的條件變量i
是定義在for
語句內(nèi)部的,相當(dāng)于一個局部變量,或者說是內(nèi)聯(lián)變量,這樣的變量只能在for
循環(huán)內(nèi)部能夠使用。
舉個例子:
for(let i = 0; i < 10; i++){ console.log(i);}console.log(i); //報錯,i is not defined.
如下圖:
造成這種結(jié)果的原因是,i
是for
的局部變量,當(dāng)for
語句執(zhí)行完畢后立即被銷毀,后面的程序是無法使用的。
提醒:如果你執(zhí)行以上代碼并沒有出現(xiàn)錯誤,很有可能是在for語句之前就定義了變量
i
。
當(dāng)然,我們也可以不使用局部變量:
let i = 0;for(i = 0; i < 10; i++){ console.log(i);}console.log(i);// 10
這樣我們就可以在for
語句外面使用條件變量了!
for
語句中的任何部分都是可以省略的。
例如,省略begin
語句:
let i = 0;for (; i < 10; i++) { // 不再需要 "begin" 語句段 alert( i );}
例如,省略step
語句:
let i = 0;for (; i < 10;) { alert( i++ );//循環(huán)變量的修改在循環(huán)體中}
例如,省略循環(huán)體:
let i = 0;for (; i < 10;alert( i++ )) { //沒有循環(huán)體}
正常情況下,循環(huán)語句需要等待循環(huán)條件不滿足(返回false
),才會停止循環(huán)。
但是我們可以通過break
語句提前結(jié)束循環(huán),強制退出。
舉個例子:
while(1){//死循環(huán) let num = prompt('輸入一個數(shù)字',0); if(num > 9){ alert('數(shù)字太大了'); }else if(num < 9){ alert('數(shù)字太小了'); }else{ alert('真聰明,循環(huán)結(jié)束'); break;//結(jié)束循環(huán) }}
以上代碼是一個猜數(shù)字的游戲,循環(huán)條件永遠是1
,也就是說循環(huán)永遠不會結(jié)束,但是當(dāng)輸入數(shù)字9
后,就會使用break
強制結(jié)束循環(huán)。
這種無線循環(huán)加上break
的形式在實際編程場景中非常常見,建議用小本本記下來。
continue
可以停止當(dāng)前正在執(zhí)行的單次循環(huán),立即開始下一次循環(huán)。
舉個例子:
for(let i = 1;i < 100; i++){ if(i % 7)continue; console.log(i);}
以上代碼輸出100
以內(nèi)的所有7
的倍數(shù),當(dāng)i % 7
不為0
,也就是說i
不是7
的倍數(shù)的時候,執(zhí)行continue
語句,直接跳過后面的語句,執(zhí)行下一次循環(huán)。
在多層循環(huán)嵌套的情況下,會有這樣一個問題,怎樣從多重循環(huán)中跳出整個循環(huán)體呢?
例如:
for (let i = 0; i < 3; i++) { for (let j = 0; j < 3; j++) { let input = prompt(`Value at coords (${i},${j})`, ''); // 如果我想從這里退出并直接執(zhí)行 alert('Done!') }}alert('Done!')
如果我們需要在,用戶輸入0
時,直接讓程序執(zhí)行alert('Done!')
應(yīng)該怎么做呢?
這就需要使用標簽,語法如下:
label:for(...){ ... break label;}
break label
語句可以直接無條件的跳出循環(huán)到標簽label
處。
例如:
outer: for (let i = 0; i < 3; i++) { for (let j = 0; j < 3; j++) { let input = prompt(`Value at coords (${i},${j})`, ''); // 如果用戶輸入0,則中斷并跳出這兩個循環(huán)。 if (input=='0') break outer; // (*) }}alert('Done!');
上述代碼中,break outer 向上尋找名為 outer 的標簽并跳出當(dāng)前循環(huán)。
因此,控制權(quán)直接從 (*)
轉(zhuǎn)至 alert('Done!')
。
我們還可以使用continue label
直接結(jié)束當(dāng)前循環(huán),開始下次循環(huán):
outer: for (let i = 0; i < 3; i++) { for (let j = 0; j < 3; j++) { let input = prompt(`Value at coords (${i},${j})`, ''); // 如果用戶輸入0,則中斷并跳出這兩個循環(huán)。 if (input=='0') continue outer; // (*) }}alert('Done!');
continue outer
可以直接結(jié)束多重循環(huán)的最外層循環(huán),開始下一次循環(huán)。
例如當(dāng)我們在(0,0)
處輸入0
,那么程序會直接跳到(1,0)
處,而不是像break
一樣直接結(jié)束整個循環(huán)。
注意:
標簽并不是隨便跳轉(zhuǎn)的,必須符合一定的要求
例如:
break label;label: for(...){...}
就是不正確的。
利用console.log()
方法,使用循環(huán)輸出以下圖形:
* ** *** **** ***** ******
利用雙重循環(huán),創(chuàng)建一個3X3
的矩陣,并讓用戶可以輸入矩陣數(shù)據(jù)。
以上就是“JavaScript循環(huán)語句有哪些及怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。