初遇js逗號表達(dá)式
初次碰到逗號表達(dá)式,是在一次面試中的一道筆試題:
var i=0,j=0,k=0;
for(;i<6,j<10;i++,j++){
k = i + j;
}
console.log(k);
一眼望去,就是個(gè)for循環(huán)啊,仔細(xì)一看,怎么有兩個(gè)參數(shù)?有點(diǎn)蒙逼的感覺。。。
我想js可以單行聲明變量,如下:
var i=0,j=0,k=0;
每個(gè)變量都能正常聲明,說明逗號前后的表達(dá)式都可以執(zhí)行,也互不影響。那這個(gè)for循環(huán)中的i++和j++應(yīng)該也是也互不影響?但是for循環(huán)是由哪個(gè)變量來控制啊,是由i<6還是由j<10?
思來想去,最終也是沒能給出正確答案。。。
什么是js逗號表達(dá)式?
面試結(jié)束后,趕緊去網(wǎng)上查資料,原來這種方式叫逗號表達(dá)式,它的特點(diǎn)是逗號前后的表達(dá)式都會執(zhí)行,并且把最后一個(gè)逗號后的表達(dá)式的值返回給整個(gè)表達(dá)式。先來個(gè)簡單的例子:
console.log((1,2,3));//3
結(jié)果可以看到打印的是3,也就是說表達(dá)式(1,2,3)返回的是最后一個(gè)逗號后面的值。
再來一個(gè)稍微復(fù)雜點(diǎn)的例子:
console.log((b=4,c=10+b,b*5));//20
console.log(c);//14
這個(gè)例子第一個(gè)會打印出20,這是因?yàn)榉祷亓薭*5,而b=4,所以會打印出20,第二個(gè)會打印出14,表示逗號表達(dá)式的每個(gè)被逗號隔開的表達(dá)式都會執(zhí)行,而c=10+b,所以打印結(jié)果是14。
for循環(huán)最終打印出多少?
再回到剛才那個(gè)for循環(huán),i<6,j<10這也是一個(gè)逗號表達(dá)式,for循環(huán)的循環(huán)條件取決于這個(gè)逗號表達(dá)式所返回的值,而根據(jù)之前所說,會返回最后一個(gè)逗號后的表達(dá)式的值作為整個(gè)逗號表達(dá)式的值。因此,當(dāng)j<10的時(shí)候,會返回true,for循環(huán)會一直進(jìn)行下去,當(dāng)j>=10,會返回fasle,整個(gè)for循環(huán)會結(jié)束。
后面的i++,j++,也是一個(gè)逗號表達(dá)式,每次循環(huán)i和j都會分別執(zhí)行,自加1。直到j(luò)=10的時(shí)候,for循環(huán)停止,此時(shí)內(nèi)部的i和j都自加到了9,因此k=9+9;結(jié)果會打印出18。
如果改變一下for循環(huán)條件位置,如下:
var i=0,j=0,k=0;
for(;j<10,i<6;i++,j++){
k = i + j;
}
console.log(k);
這樣會打印出多少呢?