9. つぎはFizzの番
ここまでを踏まえると、
for(i=0; i++<100; document.write(i%5 ? s || i : s+"Buzz", "<br>")) {
s = i%3 ? "" : "Fizz";
}
これは
i=0
i++<100
s = i%3 ? "" : "Fizz"
document.write(i%5 ? s || i : s+"Buzz", "<br>")
の順序になるので、1~100までのループをしつつ、iが3で割り切れな
いときには空文字列、割り切れたときは"Fizz"を変数sにセットする。
s = i%3 ? "" : "Fizz"
ちなみに歴史的理由によりfalseは0や空文字列、trueは非0や文字列
で代用でき、それを利用した三項演算子の使用法ですがややこしいの
で普段は使っちゃダメですよ?
Proprietary and Confidential to Lanchester Co.,LTD. Page 8
10. さいごにBuzzの番
最後にBuzzを処理するけど
i%5 ? s || i : s+"Buzz"
iが5で割り切れたときにsに"Buzz"を足す方はいいとして、5で割り切れ
なかったときの
s || i
これは何かというとif文で使われる||(or)です。
つまり変数を展開すると
"" || i (3で割り切れなかったとき)
"Fizz" || i (3で割り切れてたとき)
のどちらかになります。
論理演算の値は「最終的に評価した値」を返しますので、前者は空文
字列なので値的にはfalseとなりorの次のiが最終的な値、後者は"Fizz"
が値的にはtrueなので"Fizz"が最終的な値となります。
Proprietary and Confidential to Lanchester Co.,LTD. Page 9
11. まとめ
for(i=0; i++<100; ) {
if( i % 3 != 0 ) {
s = "";
} else {
s = "Fizz";
}
if( i % 5 != 0 ) {
if( s != "" ) {
document.write( s, "<br>" );
} else {
document.write( i, "<br>" );
}
} else {
document.write( s + "Buzz", "<br>" );
}
}
for(i=0;i++<100;document.write(i%5?s||i:s+"Buzz","<br>"))s=i%3?"":"Fizz";
Proprietary and Confidential to Lanchester Co.,LTD. Page 10