いきなり問題です
[1]つぎのActionScriptの問題点は何でしょう? [2]実行するとどのような結果になりますか?
if (condition=1) {
trace (true);
} else {
trace (false);
}
[1]はスクリプト初心者のよくやる失敗です。変数「condition」の値が1かどうかを調べるのなら、等価演算子==を使わなければなりません。=は、代入演算子です。[2]の結果は、出力ウィンドウにtrueと表示されます。ということは、ifアクションの条件判定で、trueと評価されたことを意味します。なぜエラーになることもなく、しかもtrueと評価されたのでしょう。
代入式で返される値
ifアクションの条件には、等価演算子(==)や比較演算子(<や>、<=、>=など)を使った論理式を指定することが多いです。けれど、評価できる値を返しさえすれば、論理式でなく、たとえば変数でも構いません。condition=1がtrueと評価されたということは、この代入式も値を返したということを意味します。traceアクションで確かめてみましょう。
trace (condition=1);
//出力ウィンドウの結果
1
代入式は、代入された値を返します。ですから、つぎのような代入が可能になるのです。
i = j = 1;
代入の式は、右から実行されます。ですから、まずj=1の代入が行われます。そして、この式は代入された値1を返すので、その値がつぎのiに代入されることになります。したがって、iとjには、ともに1が代入されます。
trueとされる式、falseとされる式
さて、整数値1は、条件判定ではtrueと評価されます。そのために、最初の問題のifアクションでは、trueの場合のステートメントが実行されたのです。その他の値は、どう評価されるのでしょう。
0はfalseと評価されます。0以外の数値はtrueになります。ただし、NaNはfalseとされます(「ActionScript辞書」には記述がありませんが、ActionScript Dictionary[英文改訂版]に追加されています)。その他のデータ型では、nullやundefined、空白ストリング""などが、falseと評価されます。ですから、falseと評価される値が特定されているといった方がよいでしょう。それ以外の値は、trueになるということです。ストリングの評価については、別途「ストリングの論理値評価」をご参照ください。
そうしますと、数値の判定で間違って代入演算子を使って条件を指定してしまうと、trueになる可能性の方が高いといえそうです。ifアクションの場合はまだよいですが、forアクションのループ条件でこの失敗をすると、ループから抜けられなくなってしまいます。注意しましょう。
if条件に代入式を使うのは間違い?
最初の問題[1]で、if条件に代入式を使ったActionScriptの「問題点」を質問しました。ここで「間違い」と聞かなかったのは、シンタックス上誤りではないからです。実際、if条件に代入式を使う場合が、ないわけではありません。
たとえば、変数bFlagにtrueまたはfalseを格納しておき、ボタンクリックなどでその値を逆転するという処理が考えられます。その後、ifアクションで変数値を評価して、処理を分岐させる以下のスクリプトのような場合です。なお、!(論理値反転)は、trueとfalseの値を逆転する演算子です(詳しくは、「ActionScript辞書」をご参照ください)。
bFlag = !bFlag; //bFlagの論理値を逆転して代入
if (bFlag) { //逆転後のbFlagの論理値を評価
// bFlagが'true'の場合の処理
}
このスクリプトは、代入式をifアクションの条件に指定しても、同じ処理になります。
if (bFlag=!bFlag) { //bFlagの論理値を逆転して代入したうえで値を評価
// bFlagが'true'の場合の処理
}
協力者: Tatsuo Kato Ginga Baba 5MegaPixel