Sep 22, 2005

三項演算子の正しい書き方ってあるのだろうか

最近は、三項演算子を多用しているのだけれど、やっぱり人が使ってるのを見ると気持ち悪い。

http://d.hatena.ne.jp/brazil/20050921/1127314004
Test.Builder.globalScope = typeof JSAN != 'undefined'
  ? JSAN.globalScope
  :  typeof window != 'undefined'
    ? window
    : typeof _global != 'undefined'
      ? _global
      : null;

これは解読するのにやたら時間がかかる気がする。コロンの後が値なのか条件なのかわからないからだ。

俺ならこう書く。
Test.Builder.globalScope = 
 (typeof JSAN    != 'undefined') ? JSAN.globalScope :
 (typeof window  != 'undefined') ? window :
 (typeof _global != 'undefined') ? _global :
 null;

三項演算子を使うときは、条件はどんなに短くても必ずカッコで囲って、先頭に持ってくるようにしている。
条件をカッコで囲うだけでも、かなり読みやすくなる気がする。

このコードはこういう風に読み替えることができる。
if (typeof JSAN != 'undefined') { JSAN.globalScope }
else if (typeof window != 'undefined') { window }
else if (typeof _global != 'undefined') { _global }
else { null };

あるいはこういう風に。
switch(true){
 case (typeof JSAN != 'undefined')    : JSAN.globalScope 
 case (typeof window != 'undefined')  : window 
 case (typeof _global != 'undefined') : _global 
 default : null ;
}

脳内補完されるコードと近いので、動作が想像しやすいんじゃないかと思う。
実際はif else使う場合はTest.Builder.globalScope = windowみたいに全部代入文にしないといけないしswitch文の場合はbreakも必要になるので、三項演算子を使ったほうが、はるかに短く書ける。
しかし、三項演算子でif elseを全部置き換えられるかというとそうでもなくて、returnとかcontinueとかbreakとか、値を返さない制御文の類を使うことはできない。
あと、イコールの後に改行はOKなんだけどreturnの後に改行するとJavaScriptはセミコロンが省略されてると見なしてうまくいかない。
Posted at 02:21 | WriteBacks (51) | Edit
Edit this entry...

wikieditish message: Ready to edit this entry.
















A quick preview will be rendered here when you click "Preview" button.