Takazudo Clipping*

  • 文字サイズ小
  • 文字サイズ中
  • 文字サイズ大

||で条件分岐ショートハンド

ThickBoxの中で、以下に様に書かれてる部分があって、

function tb_getPageSize(){
    var de = document.documentElement;
    var w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;
    var h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight;
    arrayPageSize = [w,h];
    return arrayPageSize;
}

この、

var w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;

の部分、この書き方知らなかった。

この、

var a = b || c || d;

っていう部分、一番よく使われるのは、

if(a||b||c){ alert("hogehoge");}

みたいなものだと思うんだけれど、この場合、どれかがfalseじゃなかったらOKということなので、まず、aが判別される。aがダメだったら、bが判別される。bがダメだったらcが判別される。ということで、もし、aを判別した時点でOKだったら、そこで判別おわるんですね。

それと同じで、var = a || b || cも、aがokだったらaで判別終わるから、aが入って、だめだったらb、それもだめならcっていう風になるんですね。なるほど。

himajin100000 2008/2/11 (05:56)

ところで,気になったので一つ聞かせてもらってもいいかな?

0もundefinedもfalseだと思うので


20080211 TestCase 1

function hoge(){
var w = 0 || 1; // undefinedでないから0がほしいんだけどー
alert(w);
}




あああ


とか出来ないってことかな?


himajin100000 2008/2/11 (05:58)

あー、マークアップがシステムに全部消されたorz


Takazudo 2008/2/11 (05:34)

http://developer.mozilla.org/ja/docs/Core_JavaScript_1.5_Reference:Global_Objects:Boolean#.E8.AA.AC.E6.98.8E

によると、0はfalseとして見なされるみたいです。もちろんundefinedもfalseで。
そして、オライリーのjavascript本の||をみてみたところ、

論理地でないオペランドに論理和演算子(||)を適用した場合でも、その戻り値は、どのような型であっても論理値に変換できるので、論理OR演算子と見なすことができます。また、論理値ではないオペランドに対して論理和演算子を使った場合に、演算子が返す値は理論値ではなくオペランドそのものになることをうまく利用したコードも存在します。例えば、使用する値にいくつか候補があり、その候補の中から定義されていてnullでない値(つまりはfalseに変換されない値)を使いたい場合には、次のようなコードを使用します。

var max = max_width || preferences.max_width || 500;

とありました。「定義されていてnullでない値(つまりはfalseに変換されない値)」
なので||を使って候補を絞る時、その中に0があったら、やっぱりそれは0とみなされてスキップされちゃうのかもしんないです。

なので、0だったら0がほしいんだけどーというときは、

var hoge=0;
var w = (hoge!==undefined) ? hoge : 1;
alert(w);

ですかねぇ


  • コメントを書く
: 
: 
: 
TrackBack URL (この記事についてトラックバックしたい時は以下のURLを指定してください)
http://gyauza.egoism.jp/cgi/mt/mt-tb.cgi/1797



2007 © Takazduo Some Rights Reserved.