サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

&&(論理積)演算子

ID: FN0409001 Product: Flash

Platform: All
Version: MX and above

シンタックス
式1 && 式2

オペランド(被演算子)
式1および式2   プール(論理)値またはブール値として評価される式。

戻り値
式1または式2のどちらか1方の式の値[*1]を返します。

[*1] 各式がブール(論理)値を返す場合には、戻り値もtruefalseかのブール値になります。しかし、式の値がブール値でないときには、評価はブール値に変換して行われますが、戻り値は変換されたブール値ではなく式の値そのものです。

説明
(論理)演算子。オペランドをブール(論理)値として評価し、論理演算を行います。

オペランドがブール(論理)値を返す論理式(等価や非等価、比較などを調べる式)であれば、両式がともにtrueの場合のみtrueを返します[*2]。それ以外の場合、つまりどちらか一方の式または両式がfalseなら、戻り値はfalseになります(表001)。

表001■オペランドがブール値を返す場合の評価と戻り値
式1の値 式2の値 戻り値
true true true
true false false
false true false
false false false

オペランドの返す値がブール値以外の場合も含めた、一般的な処理の手順はつぎのとおりです。まず、&&演算子の左側のオペランド式1が評価されます。式1の値がブール値falseに変換できる場合は、その式1の値が返されます。それ以外のときは、右側のオペランド式2の値が戻り値となります(表002)[*2]。

表002■オペランドの評価と戻り値
式1の評価 式2の評価 戻り値
true true 式2の値
true false 式2の値
false true 式1の値
false false 式1の値

なお、左側のオペランド式1falseと評価された場合には、右側のオペランド式2は評価そのものが行われません[*3]。

[*2] ECMA-262「11.11 Binary Logical Operators」にもとづきます。オペランドがブール値を返す式の場合と、それ以外の値の場合の例は、つぎのとおりです。

var x:Number = 1;
var y:Number = 0;
trace((x > y) && (x != y));  // 出力: true
trace(x && y);  // 出力: 0

なお、Flash Player 7および8(r22による確認)には、ストリング(文字列)をオペランドとした場合の動作にバグがあります。左辺オペランドが空文字列以外のストリングなら、ブール値評価がtrueとなり、右辺オペランドの値が返されるべきです。ところが、左辺オペランド値が返されます。

Flash Player 6以前では、文字列が"0"を除く数字以外falseを返す仕様になっていました。論理積演算子(&&)の処理については、この古い仕様のまま修正されていないものと想像されます。JavaScriptでは、ECMA-262に準拠した結果が返されます。

trace("macromedia" && "adobe");   // 出力: macromedia ←*Flash Player 7以降では誤り
trace("1" && "0");//   出力: 0 ←*正しい

[*3] 右側のオペランドに関数呼出しを指定した場合、左側オペランドがfalseと評価されれば、関数は呼出されません。

function xIsNumber(myValue:Object):Boolean {
  return ((typeof myValue) == "number" && !isNaN(myValue));
}
function xEvaluationTest() {
  trace("evaluating...");
  return "my value";
}
// [1] 左側オペランドがfalseの場合
// 右側オペランドに指定した関数は呼出されない
trace(xIsNumber("string") && xEvaluationTest());  // 出力: false
// [2] 左側オペランドがtrueの場合
// 右側オペランドに指定した関数が呼出される  // 出力: evaluating...
trace(xIsNumber(1) && xEvaluationTest());  // 出力: my value


以下のフレームアクションは、渡された値が数値かどうかを調べる関数を定義しています。数値であればtrue、それ以外はfalseを返します。値が数値かどうかは、typeof演算子で調べることができます。しかし、この演算子は、値がNaNの場合にも、通常の数値のときと同じ"number"を返します。この関数では、NaNは除くことにしました。値がNaNかどうかは、isNaN()関数で調べます[*4]。

// フレームアクション
// 値が数値かどうかを返す関数
// [引数] myValue: Object型(任意のデータ型)。数値かどうかを調べる値
// [戻り値] ブーリアン(論理)値。数値ならtrue、そうでなければfalse
function xIsNumber(myValue:Object):Boolean {
  // データタイプが数値でかつNaNでなければtrueを返す
  return ((typeof myValue) == "number" && !isNaN(myValue));
}


[*4] 値がNaNであることは、等価演算子==で調べることはできません。詳しくは、「値がNaNかを調べる」をご参照ください。

Player
Flash Player 4.0以降。

関連項目
!(否定)演算子  !=(不等価)演算子  !==(厳密な不等価)演算子  ||(論理和)演算子  ==(等価)演算子  ===(厳密な等価)演算子

参考
Flash 8 ActionScriptリファレンスガイド: && 論理積(AND)演算子

_____

作成者: 野中文雄
更新日: 2005年10月17日 注釈[*2]に、バグについての記載を追加。参考のリンクをFlash 8のドキュメントに変更。
作成日: 2004年9月3日


Copyright © 2001-2006 Fumio Nonaka.  All rights reserved.