最速JavaScript講座

制御構造:条件分岐

MZで複雑なイベントを組むときに必要不可欠なのが『条件分岐』です。
JavaScriptにも条件分岐に相当する書き方があります。それがif文です。

条件分岐(if)

if文とは条件を満たしたときのみ実行する処理を実現する最も基本的な構文です。
小カッコで指定した条件を満たしたときのみ、中カッコ{}で囲まれた部分を実行します。

構文
if (『条件式』) {
『条件を満たした場合に実行される処理』
}
let aaa = 1;
if (aaa <= 1) {
console.log('ok1');
console.log('ok2');
}

小カッコ()の中に記述するのは条件式です。
条件式には、比較演算子もしくは真偽値(忘れた人は変数の型を見直してください)を指定します。
比較演算子には以下の種類があります。

比較演算子 意味
a === b aとbが等しい
a !== b aとbが等しくない
a >= b aがb以上
a <= b aがb以下
a > b aがbより大きい
a < b aがbより小さい

中カッコで囲まれた部分は『ブロック』と呼びます。
ブロックとは複数の構文をひとつにまとめた固まりです。
ブロックはif文以外でも今後様々な局面で使われるので、よく覚えておいてください。

ところでイベントコマンド『条件分岐』には『条件を満たさないときの分岐を作成』というチェックボックスがあります。
これと同じことがif文でも実現可能です。

let aaa = 1;
if (aaa <= 1) {
console.log('ok1');
console.log('ok2');
} else {
console.log('ng1');
}

ブロックによる字下げ(インデント)

ブロックを中を記述するときは、下のように決まった数のスペースやタブを挿入します。これを字下げ(インデント)と呼びます。

if (aaa <= 1) {
console.log('この行は字下げされます。');
}

字下げをすることでプログラムの構造を把握しやすくなります。字下げはタブ1つ、半角スペース2つ、半角スペース4つなどが一般的です。
ツクールのイベントでも条件分岐やループなどで字下げされるので感覚的にも受け入れやすいと思います。

厳密でない等価演算子

他のプログラミング言語では、等しいかどうかの演算子は『a == b』であることが多いです。
実はこの演算子はJavaScriptにも存在します。
ですが変数の型が違う場合、たとえば数値の「1」と文字列の「'1'」を比較した場合でもtureを返してしまうなど、非常に問題のある仕様になっています。
そのため、実際の開発ではほとんど『===』(厳密等価演算子と呼びます)だけが使われています。『==』は忘れてしまってもほとんど問題ありません。

論理演算子

ここではより複雑なif文について解説します。
イベントコマンドでは『AかつBを満たしたときのみ分岐』のような処理では、条件分岐を入れ子にしていたと思います。
また『AまたはBを満たしたときに分岐』のような処理では、条件分岐を二つ併記していたと思います。
JavaScriptでは上記の分岐をひとつにまとめることが可能です。
『AかつB』は『A && B』として、『AまたはB』は『A || B』で表現します。

let a = true;
let b = false;
if (a && b) {
console.log('aはtrueだが、bはfalseなので条件を満たしません。');
}
if (a || b) {
console.log('aはtrueなので、bはfalseでも条件を満たします。');
}

論理演算子にはもうひとつ『否定』を表す『!』があります。
これは続く真偽値を反転させた結果を返します。

let a = true;
if (!a) {
console.log('aはtrueで、その結果が反転するので条件を満たしません。');
}

真偽値以外を条件に指定するとどうなるの?

if文の条件式に真偽値や比較演算子以外を指定すると以下のようになります。
配列やオブジェクトのnullチェックなどに使われます。

falseになる例 trueになる例
数値 0, NaN 左記以外(負の値含む)
文字列 空文字('') 左記以外(文字列の'0'含む)
配列、オブジェクト なし 全て(空配列や空オブジェクト含む)
null, undefined 全て なし

条件分岐(条件演算子)

条件演算子(三項演算子とも呼びます)とは、簡単に言ってしまえば分岐処理を1行で記述するための記法です。
MZのコアスクリプトにも多用されています。

構文
『条件式』 ? 『条件を満たした場合の式』: 『条件を満たさなかった場合の式』
let aaa = 1;
let bbb=(aaa===1 ? 2 : 3);
console.log(bbb);

上の例では、aaaに代入されている値は『1』なのでbbbには『2』が代入されます。

条件演算子は前述したif文でも代用できます。
では、条件演算子のメリットは何かというと、条件式をひとつの式で表現できるという点です。
MZではスキルやアイテムの計算式にもスクリプトを利用できますが、入力欄は1行しかありません。
以下の例は、通常攻撃のダメージ計算式に対して条件演算子による判定を追記したものです。
『b.isStateAffected(5)』という条件式は見慣れない書き方ですが、『攻撃対象がステートID[5]のステートになっていたら』という意味になります。

a.atk * 4 - b.def * 2 + (b.isStateAffected(5) ? 100 : 0);