XMLやFlashVarsのBoolean判定の罠
そこそこ忙しいけど 数は出したい。そんなときはさっきハマったネタを垂れ流すのが一番。わすれないし、エントリーも増えるし。
てことで、小ネタ続きですが、XMLやFlashVarsで受け取った値でハマりがちなポイントの一つであるBooleanの判定についてのTipsになります。
Booleanとは?
Booleanをわからない人はこのエントリに興味を示さないと思いますが、前提として触れておきます。
Booleanは日本語で真偽値と表し、その名の通り true または false のどちらかの値をとります。
たとえばこんな感じ。
var isLogin :Boolean = false; // -------- isLogin = true;
使われるシーンとしては、ログインしているかどうか、サウンドがOnかOffか、などフラグとして使われます。
また if 文や switch 文、for 文、while文のステートメントも、比較(==とか)の結果Booleanに置き換えられます。
var isLogin:Boolean = ( data.nickname != null );
値は2極値なので、value = !value のようにして反転することもできます。
ただし、undefinedとはちがうので、キャストすれば Boolean( undefined ) はfalseになりますが、undefined == false は成り立ちません。
同じような問題で空の文字列( "" )をキャストすると、値自体はありますが長さが0なので false になります。
XMLやFlashVarsの値は何か?
以上をふまえて、XMLやFlashVarsで何が問題になるのかというと、両方とも値の型が文字列(String)であることに起因したミスが発生します。
たとえばXML設定ファイルを読み込んでその中に<isLogin>false</isLogin>という文字列があったとします。
Boolean( xml.isLogin.toString() ) としても "false" という文字列を評価するためBoolean的には true になります。また "false" じゃないことが "true" であることを保証するわけでもないので注意が必要です。
文字列のBoolean値は "true" のみを真とする
まとめると、これを確実に評価するには、 xml.isLogin.toString() == "true" のように明示的に ”true”という文字列以外はすべて false という評価をする必要があります。
FlashVarsとかローカルだと存在しないし値がfalseになる要因が増えるとバグのもとになりやすいし、デバッグの効率が著しく落ちます。
ということで小さなコトではあるんですが、他の人のソースとか見てると以外に "true"以外という考え方ができてないがゆえに、思わぬデータに弱い判定になってしまっているのを見受けられたので書いてみました。