大家用的最多的循環(huán)語(yǔ)句肯定是for担忧,那能不能用while模擬一下for完成一些循環(huán)芹缔?
如題,用while
去模擬for
瓶盛,打印數(shù)組的全部元素
let arr = [1, 2, 3];
for(let i = 0; i < arr.length; i++) {
consoel.log(arr[i]);
}
//仿照上面的循環(huán)最欠,用while寫(xiě)一遍
let j = 0;
while (j < arr.length) {
console.log(arr[j]);
j++;
}
上面兩段代碼,用while
模仿了一次for
循環(huán)惩猫,感覺(jué)還差不多芝硬,雖然在變量定義方面有點(diǎn)小差別,for
循環(huán)結(jié)束后轧房,會(huì)釋放掉i
的內(nèi)存拌阴,而while
沒(méi)有,不過(guò)兩個(gè)循環(huán)的輸出一樣奶镶,可以算模擬成功了迟赃。
但是...現(xiàn)在要改需求了陪拘,同學(xué)們,要求使用continue
let arr = [1, 2, 3, undefined, 5];
for (let i = 0; i < arr.length; i++) {
if (!arr[i]) continue;
console.log(arr[i]);
}
//輸出1 2 3 5
console.log('**************');
let j = -1;
while (j < arr.length) {
j++;
if (!arr[j]) continue;
console.log(arr[j]);
}
//輸出1 2 3 5
上面代碼中while
內(nèi)部調(diào)整了一下j
的累加位置纤壁,如果還按第一次那樣去輸出左刽,那么while
會(huì)陷入死循環(huán),因?yàn)?code>continue在while
內(nèi)部執(zhí)行的時(shí)候會(huì)直接跳到下一次循環(huán)酌媒,導(dǎo)致我們的j無(wú)法累加欠痴,而for
循環(huán)中遇到continue
后是先給增量i
加1,然后再判斷跳出條件秒咨,所以上方代碼雖然強(qiáng)行把輸出結(jié)果調(diào)整為一致斋否,都是跳過(guò)undefined
,但是內(nèi)部的運(yùn)行機(jī)制已經(jīng)存在差別了拭荤,對(duì)待continue
的處理情況不一致茵臭,所以while
不能模擬for
。
繞了一大圈舅世,有點(diǎn)不甘心旦委,能不能有什么方法幫助while
執(zhí)行到continue
之后的增量累加呢?必然得有啊雏亚,可以使用try/finally
缨硝,通過(guò)不管什么情況下finally一定會(huì)執(zhí)行的特點(diǎn),保證執(zhí)行增量計(jì)算罢低。
let j = 0;
while (j < arr.length) {
try {
if (!arr[j]) continue;
console.log(arr[j]);
} finally {
j++;
}
}
//輸出1 2 3 5
這回while
應(yīng)該高興了查辩,終于模擬成for
了,可喜可賀网持,那么問(wèn)題又來(lái)了宜岛,finally
中的代碼是一定會(huì)執(zhí)行的,那么while
的增量j
一定會(huì)加1
功舀,能不能使for
里面的增量i
不增加萍倡? 當(dāng)然也可以呀!用break
就可以辟汰。
let arr = [1, 2, 3, undefined, 5, 6, 7];
let i = 0;
for (; i < arr.length; i++) {
if (!arr[i]) continue;
if (arr[i] === 6) {
break;
}
}
console.log(i);
//輸出 5
console.log('**************');
let j = 0;
while (j < arr.length) {
try {
if (!arr[j]) continue;
if (arr[j] === 6) {
break;
}
}finally {
j++;
}
}
console.log(j);
//輸出 6
while
比for
多進(jìn)行了一次增量計(jì)算列敲,所以一直在模仿,從未被超越帖汞,while
還是沒(méi)能成為for
戴而。
各位道友,還能反轉(zhuǎn)不翩蘸?
本編文章是參考了《JavaScript權(quán)威指南》一書(shū)所意,推薦大家讀的一本好書(shū)。