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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

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

JavaScript

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

Q&A

解決済

2回答

1619閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Node.js

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

JavaScript

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

0グッド

0クリップ

投稿2017/10/18 11:24

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の場合に返す値は、同じ型の値でないとダメみたいなことが書かれていたのを、ふと本日思い出しました。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

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

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

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

Java

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

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

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

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

JavaScript

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

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

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

TypeScript

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

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

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

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

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

投稿2017/10/18 12:45

編集2017/10/18 12:46
raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/10/18 13:42

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

2017/10/18 13:45

それが一体何の言語なのかです。それがわかれば、自ずとわかるかと思います。
退会済みユーザー

退会済みユーザー

2017/10/18 13:47

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

2017/10/18 13:49

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

0

【条件 (三項) 演算子 - 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

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

投稿2017/10/18 11:28

kei344

総合スコア69398

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問