Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
14
Help us understand the problem. What is going on with this article?
@yakimeron

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

More than 3 years have passed since last update.

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

14
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
yakimeron
株式会社テックコネクト代表取締役兼エンジニアです。Scala/Swift/Kotlin/C#/Java/C++/Go/Ruby/PHP/Python/JavaScriptを書き、AWS/Firebaseを使います。現在はUnity+Go+Nuxt.js+AWS+Firebase+PhotonEngineを利用してVRサービスを開発しています。コードを書いて物を作り出すのが何よりも好き!!
techconnect
仮想世界の未来を創る VR SNS「TECO」を開発しています!日本のxR業界の発展に少しでも貢献できればと思い立ち上げました。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
14
Help us understand the problem. What is going on with this article?