操作符总览(按优先级从高到低)
| 优先级 | 操作符 | 说明 | 示例 |
|---|---|---|---|
| 1 | (), [], ., ?. |
调用函数 / 访问集合 / 成员访问 / 空安全访问 | foo(), list[0], obj.name, obj?.name |
| 2 | -expr, !expr, ~expr, await |
单目负号 / 逻辑非 / 按位取反 / 异步等待 | -a, !isOk, ~x, await future |
| 3 | *, /, ~/, % |
乘 / 除 / 整除 / 取余 | a * b, a ~/ b |
| 4 | +, - |
加 / 减 | a + b, a - b |
| 5 | <<, >>, >>> |
位移(逻辑右移从 Dart 2.14 支持) | a << 2 |
| 6 | & |
按位与 | a & b |
| 7 | ^ |
按位异或 | a ^ b |
| 8 | ` | ` | 按位或 |
| 9 | <, >, <=, >=, as, is, is! |
比较 / 类型判断 / 类型转换 | a < b, obj is String |
| 10 | ==, != |
相等 / 不等 | a == b |
| 11 | ?? |
空合并(null 合并) | a ?? b |
| 12 | && |
逻辑与 | a && b |
| 13 | ` | ` | |
| 14 | ?:(条件运算符) |
三元运算 | cond ? a : b |
| 15 | =, +=, -=, *=, /=, ??= 等 |
赋值及复合赋值 | a = b, a += 1, a ??= 0 |
| 16 | .. |
级联运算符 | obj..method() |
空安全相关
?. → 空安全访问:如果前面是 null,直接返回 null,不报错
?? → 空合并:如果前面是 null,返回右边
??= → 空合并赋值:如果变量是 null,赋值右边的内容
String? name;
print(name?.isEmpty); // null 安全,name 可能为 null,所以使用 ?. 来调用 isEmpty 方法
print(name ?? "Guest"); // 输出 Guest
print(name ??= "Tom"); // name 是 null,所以赋值为 "Tom"
print(name); // 输出 Tom
类型判断与转换
is → 类型判断
is! → 不是该类型
as → 类型转换(可能抛异常)
int a = 123;
String b = 'ducafecat';
String c = 'abc';
print(a as Object); // 123
print(b is String); // true
print(c is! String); // false
条件表达式
| 操作符 | 解释 |
|---|---|
condition ? expr1 : expr2 |
如果 condition 是 true,执行 expr1 (并返回执行的结果); 否则执行 expr2 并返回其结果。 |
bool isFinish = true;
String txtVal = isFinish ? 'yes' : 'no';
print(txtVal); // 输出: yes