25
2

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 1 year has passed since last update.

えっ!? &&で繋ぐだけで出し分けられるんじゃないんですか!?

Last updated at Posted at 2021-12-10

Ateam Lifestyle Inc. Advent Calendar 2021 10日目は株式会社エイチームライフスタイル デザイナーの @kmfj がお送りします!

概要

&&で繋いでもうまく出し分けられない時があったので、仕組みをまとめてみた備忘録です。
「とりあえず&&で繋げば出し分けられるんだな」と思っている人向けです。

出し分けられないパターン?

&&を使って表示・非表示を出し分ける処理を書いてみます。

const name = '山田太郎'
return (
  <div>
    <p>こんにちは</p>
    {name && <p>{name}さん</p>}
  </div>
)

結果はこちら
スクリーンショット 2021-12-08 22.29.57.png

変数に空文字を入れてみます。

const name = ''
return (
  <div>
    <p>こんにちは</p>
    {name && <p>{name}さん</p>}
  </div>
)

スクリーンショット 2021-12-08 22.30.14.png

表示されなくなりました!完全に理解しました。

変数を数字にしてみます。

const count = 1
return (
  <div>
    <p>こんにちは</p>
    {count && <p>あなたは{count}番です</p>}
  </div>
)

スクリーンショット 2021-12-08 22.43.10.png

同じように0を入れてみます。

const count = 0
return (
  <div>
    <p>こんにちは</p>
    {count && <p>あなたは{count}番です</p>}
  </div>
)

スクリーンショット 2021-12-08 22.30.28.png

なんかいる…

なんで?:thinking:

この&&という表記は論理演算子といい、JavaScriptには4つの論理演算子(||(OR) &&(AND) !(NOT) ??(Null合体))があります。

その中で、JavaScriptの&&(AND)は、次のように振舞います。 1

  • 左から右にデータを評価
  • それぞれのデータをbooleanに変換
  • データがfalseに変換できる(falsyな)とき、評価をやめ、そのデータ本来の値を返す
  • すべてのデータがtrueに変換できる(truthyな)とき、最後のデータを返す

console.log( 1 && 2 && 5 ) //5
console.log( 1 && null && 5 ) //null

ひとつでもfalsyが出てきた場合、式の真偽値がtrueになることはありません。
そのため、falsy以降の評価をしても無駄な処理になってしまいます。
そういった不要な処理をしないことによって、最小のコストで評価をする仕様を**「短絡評価」**と呼びます。
この短絡評価を利用して出し分けていたのです。

つまり?:thinking::thinking:

変数とコンポーネントなどを&&でつないだとき、
変数がtruthyなときは最後のデータであるコンポーネントを返し、
変数がfalsyなときは変数の値がそのまま返る、ということです。

変数がないときに非表示にしてくれる!というわけではなく
falseに変換できた値を返しているだけです。
空文字やnullundefinedは値が返ってきたところで見かけ上変化がないため
非表示になったように見えるのでした。

しかし、数字の0が返ってきた場合、そのまま数字が表示されてしまうため
上記のような結果になります。

解消したいよ:frowning2:

number型を使って出し分けがしたいときは、
!(NOT)を2つ重ねてboolean型に変換してあげるだけでOKです!

!(NOT)はデータをboolean型に変換し逆の値を返すので、
二重否定にすればそのデータのboolean型が取れます。

const count = 0
return (
  <div>
    <p>こんにちは</p>
    {!!count && <p>{count}人目です</p>}
  </div>
)

スクリーンショット 2021-12-08 22.39.15.png

無事に出し分けられました!

おわりに

&&についてざっくりまとめました。何らかの参考になれば幸いです。
間違いがあればコメントいただけると助かります…!

Ateam Lifestyle Inc. Advent Calendar 2021 明日は @ryosuketter さんの記事です。お楽しみに!

  1. 参考:https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_AND

25
2
0

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
25
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?