最近 Kotlin を触って、if を式として扱えることの美しさに気が付きました。
そこで、普段よく使う JavaScript でも if を式として扱えないか考えてみました。
if を式として扱うとは?
if の各ブロックで最後に評価された結果を返すことを言います。
下記リンクが参考になると思います。
Kotlinのif式とwhen式
Kotlin の場合の if 式は下記のようになります。
val x: Int = 1;
val value =
if ( x == 1 ) {
"true"
} else {
"false"
}
println(value) // "true"
また、Ruby も if を式として扱っているのですが、Ruby の場合は下記のようになります。
x = 1
value =
if ( x == 1 )
"true"
else
"false"
end
p value # "true"
メリット
冗長でなくなり、コードの美しさが増す。
if が式じゃないとどうなる?
JavaScript で普通に if を使うと、下記のように代入が2箇所で行われ冗長になります。
更に、変数宣言した後に値を代入をするため value
を定数に出来なくなってしまいます。
const x = 1;
var value;
if ( x == 1 ) {
value = "true";
} else {
value = "false";
}
console.log(value);
また、if ブロック内で定数定義をしてしまうと、ブロックスコープ になるので、if 文の外では参照できなくなります。
const x = 1;
if ( x == 1 ) {
const value = "true";
} else {
const value = "false";
}
console.log(value);
// ReferenceError: value is not defined
これで条件が更に増えた場合は更に冗長になってしまうので、if 式は是非欲しいところです。
JavaScript で if を式として扱う
ラムダ式の中に if を置いて、if ブロックの中で return することで if を式っぽく扱ってみました。
const x = 1;
const value = ((x) => {
if ( x === 1 ) {
return "true";
} else {
return "false";
}
})(x);
console.log(value); // true
コード量は通常よりも多くなってしまいますが、スマートさで言えばこちらのほうが良いのでは無いかと思います。
まとめ
ラムダ式の中で if を使って式っぽく扱う方法はなんとなく面倒に感じてしまうので、これよりも良い方法をご存知の方がいましたら是非教えて頂けると幸いです。