Panda Noir

JavaScript の限界を究めるブログです。

プログラミング技法講座 その1 真偽値を利用してコードを削る

突然思いついた企画です。私が勝手に「これは初心者さんにとっては目からウロコな情報なのでは?」と思った情報を書いていきます。

無駄なifを省く

たとえば以下のような関数があったとします。

var doesExistArray=function(){
    var flag=false;
    for(var i=0;i<array.length;i++){
        if(array[i]=="hoge") flag=true;
    }
    if(flag==true) return true;
    else return false;
}

この関数はarrayという配列に"hoge"という値を持った要素があるかを調べる関数です。これでも動きます。しかし、ムダがとても多いです。

まず、if(flag==true)という部分。実はこれはif(flag)と書くだけでいいのです。なぜならifは中の真偽値を調べる = trueかどうかを調べて続くコードを実行します。flag==trueというよく見る構文もtrueかfalseを返しています。実際、console.log()でflag==trueを見ると真偽値が返されています。関係ありませんが返すといってもこれは関数ではなく演算子です。

今回は関係ありませんが、 0,null,false,NaN,undefined,空文字("")はfalse、それ以外はtrueとなります。試しにif("") document.write("true") else document.write("false")とするとfalseと表示されます。まあこれはdocument.write(""?"true":"false")というふうに三項演算子を使って書けます。

さて、話がそれました。次にけずるのはif(flag)です。書かないで return flag;で十分です。flagがtrueの時にtrue、flagがfalseの時にfalseを返していることに気がつけばすぐできます。ちなみにif(flag>3) return true;のようなときは先ほど言った ==のような比較演算子が真偽値を返すということを利用すると return flag>3 と書けます。

最後に、returnをするとそこから後ろを実行せずに関数を終了させるという特性を利用します。するとflag=trueではなくそこでtrueを返せばいいことに気が付きます。また、最後までいったのにtrueを返して終わってないということはつまりfalseだということなので関数の最後はreturn flagではなくreturn falseにします。さて、flagははじめの代入以外出てこなくなってしまったので削ってしまいます。まとめると以下のようになります。

var doesExistArray=function(){
    for(var i=0;i<array.length;i++){
        if(array[i]=="hoge") return true;
    }
    return false;
}

終わりに

javascript以外では使えない手法も若干出て来ましたが、最後の関数へは大体の言語でできると思います。みなさんもムダを減らしてスッキリしましょう(この企画は思いつきで作ったため次のネタもなにも思いついていません。打ち切りになる可能性があります)。