どんな言語にもある次の悩み、
- 少しでもコードを短く書きたい
- ムダな処理を1行でも減らしたい
- JavaScriptコードを短くしたい
そのためのJavaScriptテクニックを紹介します。
ただしスペース・空白の削除だったり、
変数名を短くする幼稚なテクではありません。
もっと本質的で汎用性の高い書き方です。
このページの目次
1.複数の返り値をまとめて受け取る
たとえば配列を返す関数があるとします。
▼ このようなコードを考えてみる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/** * aをbで割った商と余りを同時に返す **/ function divmod(a, b){ return [Math.floor(a/b), a%b]; } /// 71を11で割った商と余りは… const result = divmod(71,11); const div = result[0]; const mod = result[1]; console.log('商 : ', div); /// => 商 : 6 console.log('余 : ', mod); /// => 余 : 5 |
なんかムダに長ったらしい気がします。
複数の返り値を一度に受け取れたら、
分かりやすくてコードも短くできますね。
それにはつぎで紹介したテクニックが使えます。
▼ JavaScriptで関数から複数返り値を受け取る
▼ 上記コードを短く書き直すとこうなる
1 2 3 4 5 6 7 |
/// 71を11で割った商と余りは… const [div,mod] = divmod(71,11); console.log('商 : ', div); /// => 商 : 6 console.log('余 : ', mod); /// => 余 : 5 |
なんと3行だったコードが1行に。
これは割とよく使うテクなので汎用性が高いです。
あと可読性も少しだけ高まるかもしれません。
2.オブジェクトのキーに変数名を使用する
これもコード最適化に役立つ記法です。
- あるオブジェクトを作るとする
- そのキー名と変数名が同じなら
- 変数名だけでキー:値のセットができる
説明だとやはり分かりにくいと思うので…
具体的なコードを提示します。
▼ 初めに次のコードを考えてみる
1 2 3 4 5 6 7 8 |
/// 3次元座標の各要素 const x=1, y =2, z=3; /// 座標をオブジェクトとして表す const coord = {x:x, y:y, z:z}; console.log('coord : ', coord); /// => {x: 1, y: 2, z: 3} |
上記コードの
{x:x, y:y, z:z} の部分、
なんか冗長でムダが多い書き方になってます。
こういうキー名と変数名が一致してる場合、
変数名だけでキー・値の両方をセットできます。
▼ つまりは下記のような書き方ができる
1 2 3 4 5 6 7 8 |
/// 3次元座標の各要素 const x=1, y =2, z=3; /// 座標をオブジェクトとして表す const coord = {x, y, z}; console.log('coord : ', coord); /// => {x: 1, y: 2, z: 3} |
この書き方はとても便利ですね。
もちろんキー名と変数名が一致しない時は使えませんが、一致してるなら {x, y, z} のように記述可能です。変数名が長いほど効力発揮します。
これもコードを短くするのに役立つ
3.関数型プログラミングを意識する
世の中には2つのプログラミングがあります。
▼ この2つが存在している
- 関数型プログラミング
- 手続き型プログラミング
▼ 関数型には次の利点がある
関数型プログラミングは簡潔な関数の組み合わせでプログラミングします。個々の関数は独立しており、実行中の処理の影響を受けません。そのため、コード全体がシンプルで人が見て分かりやすく、保守性や再利用性に優れています。
JavaScriptでは両方が使えるんですが、
コードを短くする点でも関数型が推奨されます。
▼ 手続き型のコード例(長い)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/** * [赤、緑、青]の配列を引数にとる。 * それを16進数のコードに変換して返す。 **/ function rgbToHex(rgb){ let hex = '#'; for(let i=0; i<rgb.length; ++i){ const v = rgb[i]; hex += v.toString(16).padStart(2, '0'); } return hex; } const hex = rgbToHex([0, 172, 238]); console.log('hex : ', hex); /// => hex : #00acee |
このコードが手続き型です。
見てわかるように配列をforループで回し、各要素を1つの結果(ここでは #00acee のような色コード)にまとめるような処理をしてます。
読みにくく長くなるのが欠点です。
それを関数型で書くとこうなります。
▼ 手続き型のコード例(短い)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/** * [赤、緑、青]の配列を引数にとる。 * それを16進数のコードに変換して返す。 **/ function rgbToHex(rgb){ return rgb.reduce((p,c)=>{ return p+c.toString(16).padStart(2,'0'); }, '#'); } const hex = rgbToHex([0, 172, 238]); console.log('hex : ', hex); /// => hex : #00acee |
関数型はこういう感じ
このコードではArray.reduce()を使うことで、forループを使わないで同じ処理を実行できてます。簡素な関数の組み合わせでプログラミングすることを意識すべし。
ちなみにArray.reduce()の詳細は次からどうぞ
JavaScriptでは配列・オブジェクトから直呼びできる関数(例 : Array.reduce() , Array.map(), Object.entries() )があり、それを組み合わせるとコードを短くできます。
関数型に慣れていくことが大事です。
4.普通の関数をアロー関数に置き換える
JavaScriptでは関数定義に function を使います。
でもアロー関数を使う方が圧倒的に楽です。
例えば昔は次のような書き方が多かったです。
▼ ボタンにコールバック登録のコード例
1 2 3 4 5 |
const $btn = document.getElementById('hoge'); $btn.onclick = function(e){ console.log('clicked'); }; |
これでもいいけど、アロー関数はさらに短いです。
▼ アロー関数に置き換えたコード例
1 2 3 4 5 |
const $btn = document.getElementById('hoge'); $btn.onclick = (e)=>{ console.log('clicked'); }; |
▼ アロー関数とは何か?制約など
アロー関数式は、従来の 関数式の簡潔な代替構文ですが、制限があり、すべての場面で使用することができるわけではできません。アロー関数と従来の関数には違いがあり、また制限もあります。
引用元 : https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions
単純に ()=>{...} のような代替構文です。
ただし上記説明のように従来関数式とイコールではありません。例えば this、arguments、super への結びつけがないなど制約があることに注意です。
ただしコールバック関数などの処理なら、
アロー関数で問題なく置き換えができます。
使える場面なら積極的にアロー関数を使うべき
5.コードをobfuscatorなどで難読化
これはコードを短くするとは別ベクトルですが…
コードを難読化するのも1つの手です。
▼ 難読化によってコードはこうなる
- プロパティ・関数を配列などで冗長化
- 処理の複雑化あるいは記号化
- 数値を16進数表記に変換して読みにくく
▼ JavaScript難読化にはobfuscatorが便利
短く書くとは少し違うかもしれない。
でも一応関連性があるので紹介しておきます。
コードを短く書ける手法のまとめ
箇条書きしてまとめると次の通り
以上、JavaScriptでコードを短く書くテクでした。
ムダを省くと可読性もアップします。ではまた