运算符
级联符号
级联
级联( .. , ?.. ) 可以在同一个对象上进行一系列操作 。
仅支持返回对象自身的对象实例。
好处:可以节省创建临时变量的步骤。
dart
var paint = Paint()
..color = Colors.black
..strokeCap = StrokeCap.round
..strokeWidth = 5.0;以上示例等同于此代码:
dart
var paint = Paint();
paint.color = Colors.black;
paint.strokeCap = StrokeCap.round;
paint.strokeWidth = 5.0;空值短接级联( ?.. )
对可空对象进行级联操作。
dart
document.querySelector('#confirm') // Get an object.
?..textContent =
'Confirm' // Use its members.
..classList.add('important')
..onClick.listen((e) => window.alert('Confirmed!'))
..scrollIntoView();以上示例等于此代码:
dart
final button = document.querySelector('#confirm');
button?.textContent = 'Confirm';
button?.classList.add('important');
button?.onClick.listen((e) => window.alert('Confirmed!'));
button?.scrollIntoView();扩展运算符
| 语法 | 作用 |
|---|---|
... | 展开非空集合 |
...? | 安全展开,null 不抛错 |
用于展开list类型(也就是dart的数组)[1, 2]或set类型{1, 2 }或哈希表{'a': 1}。
dart
void main() {
var list1 = [1, 2, 3];
var list2 = [0, ...list1, 4];
print(list2); // 输出: [0, 1, 2, 3, 4]
}...list1 把 [1, 2, 3] 中的元素展开插入到 list2 中。
不加 ...,会嵌套成二维数组。
dart
void main() {
List<int>? list1 = null;
var list2 = [0, ...?list1, 4];
print(list2); // 输出: [0, 4]
}...?list1检查 list1 是否为 null,如果是,就什么都不做,程序继续正常运行。如果用
...list1,list1 为 null 时会抛出异常。
其他运算符
| 操作员 | w姓名 | 意义 |
|---|---|---|
() | 功能应用 | 表示函数调用 |
[] | 下标访问 | 表示对可覆盖的 [] 运算符;例如: fooList[1] 传递 int 1 到 fooList 访问索引处的元素 1 |
?[] | 条件下标访问 | 类似 [] ,但最左边的操作数可以为空;例如: fooList?[1] 传递 int 1 到 fooList 访问索引处的元素 1 除非 fooList 为空(这种情况下表达式计算结果为空) |
. | 会员访问 | 指表达式的属性;例如: foo.bar 选择属性 bar 从表达 foo |
?. | 条件成员访问 | 类似 . ,但最左边的操作数可以为空;例如: foo?.bar 选择属性 bar 从表达 foo 除非 foo 为空(在这种情况下 foo?.bar 为空) |
! | 非空断言运算符 | 将表达式转换为其底层不可空类型,如果转换失败则抛出运行时异常;例如: foo!.bar 断言 foo 为非空并选择属性 bar , 除非 foo 为空(在这种情况下会引发运行时异常) |
一览表(优先级排序)
不用太在意,跟Clang差不多的。
| 描述 | 运算符 | 结合性(Associativity) |
|---|---|---|
| 一元后缀运算符 | expr++、expr--、() 、[]、?[]、.、?.、! | 无(None) |
| 一元前缀运算符 | -expr、!expr、~expr、++expr、--expr、await expr | 无(None) |
| 乘法运算符 | *、/、%、~/ | 左结合(Left) |
| 加法运算符 | +、- | 左结合(Left) |
| 位移运算符 | <<、>>、>>> | 左结合(Left) |
| 按位与运算符 | & | 左结合(Left) |
| 按位异或运算符 | ^ | 左结合(Left) |
| 按位或运算符 | ` | ` |
| 关系和类型测试运算符 | >=、>、<=、<、as、is、is! | 无(None) |
| 相等比较运算符 | ==、!= | 无(None) |
| 逻辑与运算符 | && | 左结合(Left) |
| 逻辑或运算符 | ` | |
| 空值合并运算符 | ?? | 左结合(Left) |
| 条件(三元)运算符 | expr1 ? expr2 : expr3 | 右结合(Right) |
| 级联运算符 | ..、?.. | 左结合(Left) |
| 赋值运算符 | =、+=、-=、*=、/=、%=、~/=、&=、^= 等等 | 右结合(Right) |
| 展开运算符(扩展操作) | ...、...? (用于集合的展开) | 无(None) |
- 左结合(Left associativity):多个相同优先级的运算符从左到右计算。
- 右结合(Right associativity):多个相同优先级的运算符从右到左计算。
- 无(None):这些运算符不能链式使用(或使用链式语法无意义),比如多个
++连用是不允许的。