31
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JavaScriptでifを式として扱いたい

Last updated at Posted at 2017-06-15

最近 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 を使って式っぽく扱う方法はなんとなく面倒に感じてしまうので、これよりも良い方法をご存知の方がいましたら是非教えて頂けると幸いです。

31
17
12

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?