Section 1.13 続・条件分岐

今回はまず問題からね。
えっ、最初から問題なの?
うん。でもカンタンな問題だから。
どんなの?
今日の曜日を表示するスクリプトを書いてみて。
曜日?
…って確か Date クラスの getDay メソッドを使うとわかるんだよね?
ん、そう。
§1.3 で説明したよね。
でも getDay メソッドで取得できるのは、曜日の文字列じゃなくて曜日に対応する数値なんだよね?
そ。あの時は数値で取得しても文字列に変換する方法がなかったから使わなかったんだけど、今ならできるでしょ。
うん。if を使って、取得した値が 0 だったら日曜日、1 だったら月曜日…って感じにすればいいんだよね。
じゃ、書いてみるね。

<曜日を表示するスクリプト>

var d = new Date();
var num_day = d.getDay();  // 曜日を取得します
var str_day; 

// 曜日を表す数値を文字列に変換します
if(num_day == 0)
    str_day = "日";
else if(num_day == 1)
    str_day = "月";
else if(num_day == 2)
    str_day = "火";
else if(num_day == 3)
    str_day = "水";
else if(num_day == 4)
    str_day = "木";
else if(num_day == 5)
    str_day = "金";
else
    str_day = "土";

System.inform("今日は" + str_day + "曜日です。");

こんな感じでどうかな?
ん、OK だね。
じゃ、一応実行しとこっか。
は〜い。

<実行結果>

表示されたメッセージ(今日は日曜日です。)

今日は確かに日曜日だから OK だよね。
じゃ、今度は if を使わずに同じスクリプトを書いてみるね。
えっ、そんなことできるの?
うん。条件分岐にはもう一つ switch ってのがあるんだ。
スイッチ?
switch を使うと、今回みたいに else if がいっぱいある時に ちょっとだけスッキリした書き方ができるんだ。
こんなふうに。

<曜日を表示するスクリプト(switch バージョン)>

var d = new Date();
var num_day = d.getDay();  // 曜日を取得します
var str_day; 

switch(num_day)
{
case 0:  // num_day が 0 の時これ以降のスクリプトが実行されます
    str_day = "日";
    break;
case 1:  // num_day が 1 の時これ以降のスクリプトが実行されます
    str_day = "月";
    break;
case 2:  // num_day が 2 の時これ以降のスクリプトが実行されます
    str_day = "火";
    break;
case 3:  // num_day が 3 の時これ以降のスクリプトが実行されます
    str_day = "水";
    break;
case 4:  // num_day が 4 の時これ以降のスクリプトが実行されます
    str_day = "木";
    break;
case 5:  // num_day が 5 の時これ以降のスクリプトが実行されます
    str_day = "金";
    break;
default:  // num_day が 0,1,2,3,4,5 以外の時これ以降のスクリプトが実行されます
    str_day = "土";
}

System.inform("今日は" + str_day + "曜日です。");

…なんか、かえって長くなっちゃってるんじゃない?
うっ、まぁそうなんだけど、比較する変数の名前は1回書くだけでよくなってるでしょ。
う〜ん…それはそうだけど、その代わり break が入ってるし…
ま、まぁこういう書き方もあるよってことで。
じゃ、説明してくね。
…まぁいっか。
うん、りょーかい。
まず、switch の後ろのカッコの中には、チェックしたい式を書くんだ。
今回は getDay メソッドで取得した値をチェックしたいから num_day ね。
式、ってことは別に変数1個じゃなくてもいいってこと?
うん。変数1個になることが多いんだけど、別に『a + b』とかでも OK。
あ、そうなんだ。
で、case の後に比較する値を書くんだ。
今回みたいに数値と比較することが多いんだけど、文字列や変数、あと式でも OK。
じゃあ、最後の default ってのは?
どの case の値とも一致しなかった場合は default 以降が実行されるんだ。
ちなみに、default は必要なければ書かなくてもいいよ。
ってことは、最初の caseif で、 次からの caseelse ifdefaultelse って感じだね。
あ、case の後ろにはカッコいらないの?
つけてもいいけど、普通はつけないね。
その代わり、最後に『:』が必要だから注意してね。
あ、ほんとだ。全部 : がついてるね。
で、上から順番に比較されるから、 最初に『num_day == 0』をチェックして、 もしこれが真だったら、『case 0:』の下に書いてあるスクリプトが実行されるんだ。
じゃあ、それが偽だったら次は『num_day == 1』をチェックするの?
ん、そう。
あと、比較に使う演算子だけど、=== じゃないってところに注意してね。
===== って §1.9 で出てきた比較演算子だよね。
== 演算子は両側の型が違ったら自動的に同じ型になるように変換してから比較するけど、 === 演算子は両側の型が同じじゃないと真にならないんだよね。
ん、そうそう。
ってことは、もし num_day"0" になってたら、 case 0: 以降のスクリプトが実行されるってこと?
うん。num_day が文字列になる可能性がある場合はそうなるね。
じゃ switch の後の型と case の後の型は合わせた方がいいの?
う〜ん、それはスクリプトによるんじゃないかな。
でも、比較するときに使う演算子が == 演算子だってことは意識しといた方がいいと思うよ。
うん、わかった。
じゃあ最後に、何で break があるかってことなんだけど…
break って、whilefor でも出てきたよね。
break が実行されるとループからすぐに抜けるんだったよね?
ん、そう。
これは switch でも同じで、break が実行されると、 すぐに switch ブロックから抜けるんだ。
でもなんでわざわざ break を書く必要があるの?
break の次の行は次の case なのに…
実は、switch の場合は if と違って、 case の値と一致したら、そこから switch の最後までが実行されるんだ。
だから、例えば num_day0 だったとしたら、
str_day = "日";』から『str_day = "土";』までが全部実行されちゃうってこと。
えっ、そうなの!?
うん。だから break を書き忘れないように気をつけてね。
うん……でも、なんでそうなってるの?
こういうスクリプトが書けるようにするためじゃないかな。

var d = new Date();
var month = d.getMonth() + 1;  // getMonth で取得できる値は 0 〜 11 なので 1 足します
var days;

switch(month)
{
case 2:
    // 2月は28日または29日あります
    days = "28か29";
    break;
case 4:
case 6:
case 9:
case 11:
    // 4,6,9,11月は30日あります
    days = "30";
    break;
default:
    // それ以外の月は31日あります
    days = "31";
}

System.inform("今月は" + days + "日あります。");

case が4つも続いてる…
break に出会うか switch の終わりまではずっと実行されるから、 今月が 4 月か 6 月か 9 月か 11 月だったら、 days"30" になるってワケ。
あ、そっか。これなら一回『days = "30";』って書くだけですむね。
うん。つまり、『if(month == 4 || month == 6 || month == 9 || month == 11)』 っていう条件を簡単に書けるようにするためにこうなってるってこと。
なるほどねー。
ま、大抵は if の方を使うから、あんまり switch は使わないかもね。
だよねぇ…
でも switch を使って書いた方が見やすくなることもあるから、たまには使うと思うよ。
そうなの?
ん、多分ね。
じゃ、今回はここまで。
また次回ね!


前へ | TOP | 次へ