循環(huán)讓一塊代碼運(yùn)行一定的次數(shù):
~~~
for ( var i = 0; i < 5; i++ ) {
// Logs "try 0", "try 1", ..., "try 4".
console.log( "try " + i );
}
~~~
需要注意的是在循環(huán)中,變量?`i`?的不僅僅作用于循環(huán)代碼塊,即使在變量名前使用了關(guān)鍵字?`var`。在[作用域](http://js101.co/javascript-101/scope.html)部分將對(duì)作用域進(jìn)行深入討論。
## `for`?循環(huán)
一個(gè)?`for`?循環(huán)由四個(gè)語(yǔ)句組成,并具有以下結(jié)構(gòu):
~~~
for ( [initialization]; [conditional]; [iteration] ) {
[loopBody]
}
~~~
初始化語(yǔ)句(_initialization_)在循環(huán)開始前只執(zhí)行一次。它是用來(lái)準(zhǔn)備或聲明任何變量的。
條件語(yǔ)句(_conditional_)在每次迭代之前執(zhí)行,它會(huì)返回一個(gè)值用來(lái)判斷循環(huán)是否繼續(xù)。如果條件語(yǔ)句的計(jì)算結(jié)果為一個(gè)假值,則循環(huán)停止。
迭代語(yǔ)句(_iteration_)在每次迭代結(jié)束時(shí)執(zhí)行,它給你一個(gè)機(jī)會(huì)來(lái)改變重要變量的狀態(tài)。通常,這將涉及遞增或遞減一個(gè)計(jì)數(shù)器,從而使循環(huán)接近結(jié)束。
循環(huán)體語(yǔ)句(_loopBody_)是每一次循環(huán)執(zhí)行的內(nèi)容,它可以包含任何東西。通常,會(huì)有需要被執(zhí)行的多行語(yǔ)句,并應(yīng)包裹在一個(gè)代碼塊中(`{...}`)。
一個(gè)典型的?`for`?循環(huán):
~~~
for (var i = 0, limit = 100; i < limit; i++) {
// This block will be executed 100 times.
console.log( "Currently at " + i );
// Note: The last log will be "Currently at 99".
}
~~~
## `for...in`?循環(huán)
一個(gè)?`for...in`?循環(huán)遍歷一個(gè)對(duì)象的屬性,針對(duì)每一個(gè)屬性,循環(huán)體語(yǔ)句可以被執(zhí)行一次。
~~~
for ( prop in obj ) {
// statements here will be executed for every key in the object
console.log( prop + ': ' + obj[ prop ] );
}
~~~
## `while`?循環(huán)
一個(gè)?`while`?循環(huán)類似于一個(gè)?`if`?語(yǔ)句,不同之處在于它的主體部分會(huì)繼續(xù)執(zhí)行,直到條件語(yǔ)句計(jì)算結(jié)果為一個(gè)假值。
~~~
while ( [conditional] ) {
[loopBody]
}
~~~
一個(gè)典型的?`while`?循環(huán):
~~~
var i = 0;
while ( i < 100 ) {
// This block will be executed 100 times.
console.log( "Currently at " + i );
i++; // Increment i
}
~~~
需要注意的是計(jì)數(shù)器是在循環(huán)的主體部分遞增的。將條件和增量合并也是可行的,像這樣:
~~~
var i = -1;
while ( ++i < 100 ) {
// This block will be executed 100 times.
console.log( "Currently at " + i );
}
~~~
請(qǐng)注意計(jì)數(shù)器開始于-1,并使用前置增量符(`++i`)。
## `do-while`?循環(huán)
這幾乎是與?`while`?循環(huán)完全一樣的,不同的是實(shí)際上它的循環(huán)主體內(nèi)容在條件測(cè)試之前至少會(huì)執(zhí)行一次。
~~~
do {
[loopBody]
} while ( [conditional] )
~~~
一個(gè)?`do-while`?循環(huán):
~~~
do {
// Even though the condition evaluates to false
// this loop's body will still execute once.
alert( "Hi there!" );
} while ( false );
~~~
這一類型的循環(huán)是少見的,因?yàn)橹挥袠O少數(shù)情況下需要盲目的執(zhí)行一次循環(huán)。無(wú)論如何,意識(shí)到這一點(diǎn)就好。
## `break`?和?`continue`
通常的,條件語(yǔ)句的計(jì)算結(jié)果不是一個(gè)真值會(huì)導(dǎo)致循環(huán)的終止,但是也可以通過(guò)循環(huán)內(nèi)部的?`break`?語(yǔ)句將循環(huán)在其正常運(yùn)行軌道期終止:
~~~
// Stopping a loop
for ( var i = 0; i < 10; i++ ) {
if ( something ) {
break;
}
}
~~~
你可能還需要繼續(xù)循環(huán),但不執(zhí)行循環(huán)主體內(nèi)的部分內(nèi)容。這可以通過(guò)?`continue`語(yǔ)句做到:
~~~
// Skipping to the next iteration of a loop
for ( var i = 0; i < 10; i++ ) {
if ( something ) {
continue;
}
// The following statement will only be executed
// if the conditional "something" has not been met
console.log( "I have been reached" );
}
~~~
