Javascript論理演算子「または」の応用

2076 ワード

Javascriptでは、論理演算子は主にブール型の論理演算に用いられ、式の演算結果に基づいてブール値を返します.パラメータは必ずしもtrueまたはfalseでなければならないとは限らないので、戻った結果はブール値ではなくてもよい.
この「または」演算子の役割を理解するには、まず比較的簡単な例を見ます.以下の例では、演算子は、新規に定義された変数のデフォルト値を提供するために使用されてもよい.
<!-- lang: js -->
    var bar = false,
    foobar = 5,
    foo = bar || foobar; // foo = 5
上記の例では、barがfalseを含んでいる時だけ、foobaarは自分の値をfooに伝えます.ここでは、0、false、undefined、null、NaN、空の文字列を含むと指摘したい.これらのタイプは全部うそを含んでいる.
jQueryプラグインを書いたことがあるならば、または$exted()を使ったことがあります.この方法はよく知っているかもしれません.optionsオブジェクトにデフォルト値を約束したり、正確な値を与えたりするために使われることが多いです.
<!-- lang: js -->
function( options ) {
    options = $.extend({}, defaults, options || {});
}
いくつかの開発者が意図的に使用したり、演算子が含まれています.
<!-- lang: js -->
var foo = bar || null;
普通、私たちはわざわざnullの値を必要としません.でも、本当に必要な時には、この値が欲しいのかどうか迷う必要はありません.あるいはこの値はnullの値でなければなりませんか?
いくつかの開発者がこの方法を使って名前空間を初期化することを選択します.伝統的にはnamespace=namespace|𞓜{}を使って先に名前空間の初期化を行い、その後この名前空間を拡張します.
<!-- lang: js -->
var namespace = namespace || {
    utils:{},
    core:{}
};
ここでは原理を簡単に紹介します.Javascriptの変数は厳密なタイプではないので、ブール演算子によって初期化された変数にも数値値が与えられます.
<!-- lang: js -->
console.log(null || NaN || undefined || false || 0 || 10);  // outputs: 10
ここで起こったことはそんなに不思議ではありません.実は表現を盗むだけです.解析器はまず式の第一の文を確認します.nullは、これが虚構の値であることを確定しました.虚構の値が含まれていないということになるまで、下の方に解析を続けます.これはJavascriptを含む各種の動的言語においてよく使われる解析技法です.しかし、この方法は静的言語には適用されません.もし静的言語においてこのようにすれば、システムは直接にタイプのエラーを投げます.
これはいったい何のために使われていますか?前に見たように、変数が空かもしれないなら、あるいは演算子は関数でデフォルトを提供してもいいです.
function foo( a, b ){
    a = a || 5;
    b = b || 6;
    console.log( 'Values:' + a + ',' +b );
}
もちろん、次のような方法でこの問題を解決することもできます.
if(a && a === 5){
    // do something
}else{
    // do something else
}
なぜこのように書くのですか?この問題を二つの面から分析することができます.まず可読性です.いくつかの開発者はif/else文の可読性がより強いと思っています.このコードを心の中で解読するのに時間がかかりません.好みの観点から考えると、if/else文を使って完全に同じ効果が得られると思います.次は性能の問題については、開発者はif文は𞓜𞓜演算子よりも優れていると考えていますが、テストによって、それらの表現力に大きな違いがないことが分かりました.