JavaScriptでconst
を意地でも使いたい方へ。
try-catch
等でもconst
を使って代入を行う方法です。
前提条件
ES2015(のconst
)が使用できる環境。
なお、IE11でもconstは使用できるみたいです!わーい!
ただしArrow functionsは使用できないので、function
文を使用してください。ひどいよー……。
まえがき
const
はES2015で追加された構文で、JavaScriptに定数という概念をもたらしました。
再代入を禁止したいので、できるだけconst
を使いたいですよね。
しかし、問題となるのがtry-catch
等での代入処理。
const
let
ではブロックスコープとなるため、try文の中で変数宣言をすると、ブロックの外では変数の参照ができません。
そういった場面でもconst
を使いたいと人向けの内容です。
ビフォーアフター
let fileContent;
try {
fileContent = fs.readFileSync("/path/to/file");
} catch (e) {
fileContent = "default value";
}
const fileContent = (() => {
try {
return fs.readFileSync("/path/to/file");
} catch (e) {
return "default value";
}
})();
解説
try-catch
を即時関数で包んであげているだけです。
記述の仕方によっては上記のように行数が増えますが、const
を使えるメリットと比べると些細なものですね。
その他
switch-case
文
return
を使用するため、break
を書く必要がなくなります。
そのため、Scalaのパターンマッチライクな記述になり、かなり見通しが良くなります。
let num = 0;
switch (flag) {
case "A":
num = 1;
break;
case "B":
num = 2;
break;
case "C":
num = 3;
break;
}
const num = (() => {
switch (flag) {
case "A": return 1;
case "B": return 2;
case "C": return 3;
default : return 0;
}
})();
if
文
三項演算子よりも見やすくなる……わけないですね。
今回の技を使わず、三項演算子を使ってください。
フレンズによって得意なこと違うから!
const bool = (() => {
if (str === "str") {
return "true";
} else {
return "false";
}
})();
const bool = (str === "str")
? "true"
: "false";
IE11
前述の通り、IE11ではArrow functionsが使えないため、IE向けにトランスパイルするか、function
式を使用してください。
const element = (function () {
try {
return document.getElementById("id");
} catch (e) {
return document.body;
}
})();
あとがき
軽くググっても出てこなかったので今回書いてみました。
これを使えば、ほとんどconst
でかけると思います。
もっといい方法などありましたら教えていただけると幸いです!
参考
- Can I use
- const https://caniuse.com/#feat=const
- Arrow functions https://caniuse.com/#feat=arrow-functions