JavaScriptのショートコーディング
プログラムを短くするための覚え書き。
- 文字列を数値にする
var str = "123"; var num = parseInt( str, 10 ); //10は、10進数にするため var num = Number( str ); var num = str - 0; var num = +str;
- 整数にする
var num = 123.456789; num = Math.floor( num ); num = num | 0; num = ~~num;
- 少数部分を取り出す
num = num % 1; // %演算子は、余りを求めるが、整数を返すとは限らない
- カンマ演算子を使う
var a = 0; var b = 0; var c = 0; //カンマ演算子を使うと var a = 0, b = 0, c = 0; //ただし、下の例はダメ!bとcがグローバル変数扱いになる var a = b = c = 0; //やるなら var a, b, c = a = b = 0; a = 1; b = 2; c = 3; c = ( a = 1, b = 2, 3 ); //短くなるわけではないけど //3個の代入文を1行で行える。if文と組み合わせたり //()のなかを、カンマで区切ると、最後の値が利用される
- if文の{ }は、省く
if( a == 6 ) { b = c; } if(a==6)b=c;//ただし、1命令だけ。 if( a != 6 ) { b = c; d = e; } if(a-6)b=c,d=e;2つ以上ならカンマ
- if文は式に
if( a != 0 ) { alert( "OK!" ); } a && alert("OK!"); // 代入式なら()でくくる。 if( a == 0 ) { alert( "OK!" ); } !a && alert("OK!"); a || alert("OK!"); if( flag ) { err = 'out!'; alert('Error'); } flag && (err=(alert('Error'),'out!')); flag && (err='out!')&&alert('Error');
- if文は3項演算子にする
if( x == 0 ) { alert( "OK!" ); } else { alert( "NO." ); } if(! x ) alert( "OK!" ); else alert( "NO." ); if( x ) alert( "NO." ); else alert( "OK!" ); //3項演算子を使うと alert(x?"NO.":"OK!");
- !!を二回連続で使う意味
var f = 1; if( f ) alert("実行される"); if( !!f ) alert("これも実行される"); alert( !!f) //これは trurを返す //上は一見無駄な用だけど、ある関数がtrueもしくはfalseしか受け付けない場合に有効 (function( f ) { f === true && alert( "true" ); })(!!1); //つまり、falseを設定したいとき(0ではない) f = !1; //trueを設定したいとき f = !0;
- 配列に値を代入する
var ary = new Array(); ary[0] = 0; ary[1] = 1; ary[2] = 2; ary[3] = 3; ary[4] = 4; var ary = new Array( 0,1,2,3,4 ); var ary = [0,1,2,3,4]; //これをaからzまでなら var ary = 'a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z'.split(','); var ary = 'abcdefghijklmnopqrstuvwxyz'.split(''); //一度きりなら配列にしなくても alert('abcdefghijklmnopqrstuvwxyz'.split('')[25]);
- 正規表現でマッチしたn番目の文字を得る
var str = "abcdefghijklmnopqrstuvwxyz"; var buf = str.match( /(.{3})/g ); //三文字ずつ区切る var rst; if( buf ) rst = buf[4]; //もし仮にマッチしなければ、配列にならないので.match()[4]のようにできない rst = (str.match( /(.{3})/g )||[])[4];
- for文を変形する
var ary = [1,2,3,4,5,6,7,8,9,10]; var cnt; var total = 0; for( cnt = 0; cnt < ary.length; cnt++ ) { total = total + ary[ cnt ]; } alert( total ); //ループでまわして合計を求める for( var ary=[1,2,3,4,5,6,7,8,9,10], total = 0, cnt = 0; cnt < ary.length; cnt++ ) total += ary[ cnt ]; for( var ary=[1,2,3,4,5,6,7,8,9,10], total, cnt = total = 0, n; n = ary[ cnt++ ]; ) total += n; //lengthを使わない。ただし配列の中に0やnullや''があるとダメ。 for(var a=[1,2,3,4,5,6,7,8,9,10],t,c=t=0,n;n=a[c++];)t+=n; //変数名は、やっぱり短く var a=[1,2,3,4,5,6,7,8,9,10],t,c=t=0,n;while(n=a[c++])t=+n; //forをwhileに変形。 var t=0,c=10;while(c)t+=c--;
- 配列をランダムに並び替える
alert([1,2,3,4,5,6,7,8,9].sort( function () { return Math.rand()<.5; } ) ); //ただし、均等にバラけるわけではない。とくに後半は偏る var ary = [1,2,3,4,5,6,7,8,9]; var func = function () { return Math.rand()<.5; }; alert( ary.sort( func ).sort( func ) ); //二回くらい混ぜたらいけるかもしれない?
- 文字列の中に、指定した文字が含まれているかの判断
var str ="abcdefghijklmnopqrstuvwxyz"; if( -1 < str.indexOf( "xy" ) ) alert( "含まれています" ); if( /xy/.test( str ) ) alert( "含まれています" ); //もし検索する文字列が、複数ある場合は、正規表現を利用 if( /xy|mn|ab/.test( str ) ) alert( "含まれています" ); //
- 数値によって文字列を返す。またはその逆。
var x = 0, txt; if( 0 == x ) txt = "abc"; if( 1 == x ) txt = "aiueo"; if( 2 == x ) txt = "123"; if( 2 == x ) txt = "一二三"; txt = [ 'abc', 'aiueo', '123', '一二三' ][x]; //一行で書ける //もしくは 'abc aiueo 123 一二三'.split(' ')[x]; //もしこれが逆の場合。(文字列から数値を返す) var x; if( "abc" == txt ) x = 0; if( "aiueo" == txt ) x = 1; if( "123" == txt ) x = 2; if( "一二三"== txt ) x = 3; var x = { 'abc':0, 'aiueo':1, '123':2, '一二三':3 }[ txt ]; //一行で書ける
応用編(ってこれが?!)
- 月末の末日を返す関数
//最初はこんなのだったんだけど、t_netbug様 の参戦で、どんどん短くなっていきました。 function getMatubi(y, m) { m--; return (m^m<7|30)-(m==1)*(1+(y%4>0^y%100>0^y%400>0)); } return (--m^m<7|30)-(m==1)*(1+(y%4>0^y%100>0^y%400>0)); return (m^m>7|30)-(m==2)*(2-(y%(y%100>0?4:400)==0)); return (m^m>7|30)+(m==2)*~(y%(y%100>0?4:400)>0); //もう正直なところついていけません!凄すぎっ〜!
- ある範囲を繰り返す(例:角度361度を1度にする)
function kakudo( n ) { return n % 360; } //マイナスにも対応 return (n + 360) % 360;
- 押されたキーにより、X座標を変える
function move( evt ) { var kc = evt.keyCode; //[←]なら37、[→]なら39が代入される if( 37 == kc ) { x = x -2; if( x < 0 ) x = 0; } if( 39 == kc ) { x = x + 2; if( x > 511 ) x = 511; } //これは、以下のようにも書ける var t = x; t = x + ((37 == kc) - (39 == kc )) * 2; x = (t < 0) || (511 < t) ? x: t; //これは、以下のようにも書ける(試してないけど) x+=((1<x&&37==kc)-(x<510&&39==kc))*2; }