三元運算子
可用於縮短 if / else 操作。這對於快速返回值(即將其分配給另一個變數)非常方便。
例如:
var animal = 'kitty';
var result = (animal === 'kitty') ? 'cute' : 'still nice';
在這種情況下,result
獲得’可愛’值,因為動物的價值是’小貓’。如果動物有另一個值,結果將獲得仍然很好的值。
將此與 if/else
條件的程式碼相比較。
var animal = 'kitty';
var result = '';
if (animal === 'kitty') {
result = 'cute';
} else {
result = 'still nice';
}
if
或 else
條件可能有幾個操作。在這種情況下,運算子返回最後一個表示式的結果。
var a = 0;
var str = 'not a';
var b = '';
b = a === 0 ? (a = 1, str += ' test') : (a = 2);
因為 a
等於 0,它變成 1
,而 str
變成’不是測試’。涉及 str
的操作是最後一個,所以 b
接收操作的結果,這是 str
中包含的值,即 not a test
。
三元運算子總是期望其他條件,否則你將得到語法錯誤。作為一種解決方法,你可以在 else 分支中返回類似零的東西 - 如果你沒有使用返回值而只是縮短(或試圖縮短)操作,這無關緊要。
var a = 1;
a === 1 ? alert('Hey, it is 1!') : 0;
如你所見,if (a === 1) alert('Hey, it is 1!');
會做同樣的事情。它只是一個更長的字元,因為它不需要強制性的 else
條件。如果涉及 else
條件,三元方法將更清潔。
a === 1 ? alert('Hey, it is 1!') : alert('Weird, what could it be?');
if (a === 1) alert('Hey, it is 1!') else alert('Weird, what could it be?');
三元組可以巢狀以封裝其他邏輯。例如
foo ? bar ? 1 : 2 : 3
// To be clear, this is evaluated left to right
// and can be more explicitly expressed as:
foo ? (bar ? 1 : 2) : 3
這與以下 if/else
相同
if (foo) {
if (bar) {
1
} else {
2
}
} else {
3
}
在風格上,這應該僅用於短變數名稱,因為多行三元組可能會大大降低可讀性。
唯一不能在三元組中使用的語句是控制語句。例如,你不能使用三元組的 return 或 break。以下表示式無效。
var animal = 'kitty';
for (var i = 0; i < 5; ++i) {
(animal === 'kitty') ? break:console.log(i);
}
對於 return 語句,以下內容也將無效:
var animal = 'kitty';
(animal === 'kitty') ? return 'meow' : return 'woof';
要正確執行上述操作,你將返回三元組,如下所示:
var animal = 'kitty';
return (animal === 'kitty') ? 'meow' : 'woof';