本章所說的條件運算子,並非 if-else 這類條件陳述,而是三元運算子與空值合併運算子。
兩種條件運算子
Dart 提供兩種精簡型條件運算子,用來取代冗長的 if-else 分支,單行完成條件判斷、指派或回傳數值。
- 三元條件運算子:
condition ? expr1 : expr2 - 空值合併運算子:
expr1 ?? expr2
三元運算子 condition ? expr1 : expr2
語法格式
布林條件 ? 條件成立執行的運算式 : 條件不成立執行的運算式
當 condition 判斷結果為 true 時回傳 expr1;若為 false 則回傳 expr2
condition 必須是布林結果,依據布林值二選一進行指派或回傳。
實作範例:
void main() {
bool isRain = true;
// 三元運算式指派數值
var result = isRain ? '下雨' : '沒有下雨';
print(result); // 下雨
isRain = false;
result = isRain ? '下雨' : '沒有下雨';
print(result); // 沒有下雨
}Code language: Dart (dart)
執行輸出
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
下雨
沒有下雨Code language: CSS (css)
若已經學過 if – else,同等邏輯可改寫如下
void main() {
bool isRain = true;
String result;
if (isRain) {
result = '下雨';
} else {
result = '沒有下雨';
}
print(result);//下雨
}Code language: Dart (dart)
空值合併運算子
用來判斷變數是否為空,快速設定預設值
語法 expr1 ?? expr2
可空運算式 ?? 預設數值
expr1不為 null,直接回傳expr1;expr1為null,回傳expr2
官方示範程式
void main() {
// 參數為可空字串 String?
String playerName(String? name) => name ?? 'Guest';
print(playerName("Tom")); // Tom
print(playerName(null)); // Guest
}Code language: JavaScript (javascript)
定義取得玩家名稱的函式 playerName,參數為可空字串;透過 ?? 設定預設值,若傳入的 name 是 null,就回傳預設文字 Guest。
補充說明
範例中的 playerName 使用箭頭函式,是函式的簡寫語法,後續章節會詳細介紹,等同下方完整寫法:
String playerName(String? name) {
return name ?? 'Guest';
}Code language: Dart (dart)
同等寫法對照
使用三元運算子實作
String playerName(String? name) => name != null ? name : 'Guest';Code language: JavaScript (javascript)
完整 if-else 寫法
String playerName(String? name) {
if (name != null) {
return name;
} else {
return 'Guest';
}
}Code language: JavaScript (javascript)
Previous: Dart 位元運算子與移位運算子
Next: Dart 串聯運算子