質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.02%

  • JavaScript

    13820questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • Node.js

    1552questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

三項演算子の書き方について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 256
退会済みユーザー

退会済みユーザー

const list = [1, 2, 3];
const something = typeof list[5] === 'undefined' ? undefined : list[5];
const list = [1, 2, 3];
const something = typeof list[5] === 'undefined' ? [] : list[5];

三項演算子の書き方についてなのですが、以前、どこかのteratailとかいうQ&Aサイトのコメント欄で、三項演算子のtrueの場合とfalseの場合に返す値は、同じ型の値でないとダメみたいなことが書かれていたのを、ふと本日思い出しました。

もし、これが本当であれば、前者の書き方はアウトで後者の書き方が正しいのでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

三項演算子のtrueの場合とfalseの場合に返す値は、同じ型の値でないとダメ

その答えはYESでもあり、NOでもあります。なぜなら言語によるからです。

世の中には多くのプログラミング言語がありますが、それぞれを二分するものの一つに静的型付け動的型付けがあります。前者を採用する言語のほとんどは(後述するある型を持つ場合を除いて)同じ型である必要がありますが、後者を採用する言語のほとんどは同じ型である必要はありません。以下、細かく見ていきましょう。

静的型付けとは変数や関数の戻り値、式の評価値についての型が構文解析時にコンパイル時に、つまり、静的に決定されることをいいます。この型付けを採用している言語を静的型付き言語といいます。JavaScriptと名前だけが似ているJavaは静的型付き言語ですので、その例を見てみましょう。

public class Main {
    public static void main(String[] args) throws Exception {
        boolean flag = true;
        int x = flag ? 1 : "hello"; // エラー
    }
}

Javaでは変数を何かしらの型であると宣言する必要があります。上ではint型(32bit整数値)としましたが、"hello"は文字列ですので、コンパイル時にエラーになります。かといってString x = flag ? 1 : "hello";と書いても、今度は1String型(文字列)ではないので、やはりエラーになります。詳しく言うと、xint型であるとした時点で、flag ? 1 : "hello"flagが何であっても、int型ではなければならないということです。

大切なのは、この判断は静的に行っていると言うことです。上のプログラムを見ると三項演算子の結果が1であることは自明ですが、それはあくまで、実行して初めてわかることであり、静的な構文解釈ではわかりません。つまり、静的に三項演算子の結果が何の型であるかと言うことが決定されなければならないとも言えます。

対して、動的型付けでは違います。こちらは逆に、変数などが実行時、つまり、動的に決定されるものです。そのため、変数に対しては定まった型というものはなく、何でも入れることができます。JavaScriptは動的型付き言語ですので、その場合の例を見ましょう。

const flag = true;
const x = flag ? 1 : "hello";

上のコードはエラーになりません。xは数値でも文字列でも動的に決定されれば良いので、どれでも入る状態です。ですので、たとえ1になっても"hello"になっても問題ありません。三項演算子の結果が、状況によって型が異なっても問題にしないのが動的型付けなのです。これは、三項演算子だけでは無く、関数の戻り値などにも言えることです。

さて、静的型付き言語なら全て同じ型でなければならないのかというと、そうではありません。例えば、JavaScriptを静的型付けにしたTypeScriptでは、次のように書けます。

const flag : boolean = true;
const x : number | string = flag ? 1 : "hello";

これはコンパイルエラーにはなりません。型としては問題ないと判断されたのです。このときxnumber | stringという型です。これは、数値か文字列のどちらかという状態が混ざったような型になります。これをUnion型と言います。三項演算子もnumber | stringというUnion型を返すとなるため、型としては全て正しいとなるのです。Union型は比較的新しい静的型付き言語では多くで取り入れられていますが、Javaのような古い言語には存在しません。

と言うことで結論を言うと

  1. Union型が無い静的型付き言語ではほぼ正しい
  2. Union型がある静的型付き言語ではほぼ間違っている
  3. 動的型付き言語ではほぼ間違っている

となるとおもいます。なお、ほぼとしているのは、イレギュラーな動作する言語が存在する可能性があるからです。(プログラミング言語は非常にたくさんあるので、全てを調べ尽くすことは難しいです)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/18 22:42

    ご回答ありがとうございます。つまり、const something = typeof list[5] === 'undefined' ? [] : list[5];
    は、3に該当して「ほぼ間違い」となりますでしょうか?

    キャンセル

  • 2017/10/18 22:45

    それが一体何の言語なのかです。それがわかれば、自ずとわかるかと思います。

    キャンセル

  • 2017/10/18 22:47

    えっ、JSは動的型付け言語ですよね?

    キャンセル

  • 2017/10/18 22:49

    そうそう、答えは自分で見つられたでしょ。

    キャンセル

+3

【条件 (三項) 演算子 - JavaScript リダイレクト 1 | MDN】
https://developer.mozilla.org/ja/docs/JavaScript/Reference/Operators/Conditional_Operator

【式と演算子 - JavaScript | MDN】
https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Expressions_and_Operators#Conditional_(ternary)_operator

とくにそのような縛りは無いと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • JavaScript

    13820questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • Node.js

    1552questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。