条件 (三項) 演算子

条件 (三項) 演算子は JavaScript では唯一の、3 つのオペランドをとる演算子です。この演算子は、 if 文のショートカットとしてよく用いられます。

構文

condition ? exprIfTrue : exprIfFalse

引数

condition
値が条件として使用される式です。
exprIfTrue
conditiontruthy の値 (true と等しいか、 true に変換できる値) と評価された場合に評価される式です。
exprIfFalse
conditionfalsy の値 (false と等しいか、 false に変換できる値) と評価された場合に評価される式です。

解説

false についていえば、 falsy になる可能性がある式は null, NaN, 0, 空文字列 (""), undefined です。 condition がこのうちの何れかであれば、条件演算子の結果は exprIfFalse になります。

単純な例です。

var age = 26;
var beverage = (age >= 21) ? "ビール" : "ジュース";
console.log(beverage); // "ビール"

よくある使い方の一つに、 null になる可能性がある値を扱うというものがあります。

function greeting(person) {
    var name = person ? person.name : "お客さん";
    return "やあ、" + name;
}

console.log(greeting({name: 'アリス'})); // "やあ、アリス"
console.log(greeting(null));             // "やあ、お客さん"

メモ: オプション連鎖演算子がこのような場面を扱うために設計されています。執筆時点 (2019年7月時点) で、これはまだ試験的であり、実装されていません。

条件の連鎖

三項演算子は右結合で、すなわち以下のような方法で if … else if … else if … else の連鎖と同様に「連鎖」させることができます。

function example(…) {
    return condition1 ? value1
         : condition2 ? value2
         : condition3 ? value3
         : value4;
}

// 以下のものと同等です。

function example(…) {
    if (condition1) { return value1; }
    else if (condition2) { return value2; }
    else if (condition3) { return value3; }
    else { return value4; }
}

仕様書

仕様書 状態 備考
ECMAScript Latest Draft (ECMA-262)
Conditional Operator の定義
ドラフト
ECMAScript 2015 (6th Edition, ECMA-262)
Conditional Operator の定義
標準
ECMAScript 5.1 (ECMA-262)
The conditional operator の定義
標準
ECMAScript 1st Edition (ECMA-262)
The conditional operator の定義
標準 初回定義。 JavaScript 1.0 で実装。

ブラウザーの互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
Conditional operator (c ? t : f)Chrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 3Opera 完全対応 ありSafari 完全対応 ありWebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 ありSafari iOS 完全対応 ありSamsung Internet Android 完全対応 1.0nodejs 完全対応 あり

凡例

完全対応  
完全対応

関連情報