Skip to content

运算符

级联符号

级联

级联( ..?.. ) 可以在同一个对象上进行一系列操作 。

仅支持返回对象自身的对象实例。

好处:可以节省创建临时变量的步骤。

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 1fooList 访问索引处的元素 1
?[]条件下标访问类似 [] ,但最左边的操作数可以为空;例如: fooList?[1] 传递 int 1fooList 访问索引处的元素 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--exprawait expr无(None)
乘法运算符*/%~/左结合(Left)
加法运算符+-左结合(Left)
位移运算符<<>>>>>左结合(Left)
按位与运算符&左结合(Left)
按位异或运算符^左结合(Left)
按位或运算符``
关系和类型测试运算符>=><=<asisis!无(None)
相等比较运算符==!=无(None)
逻辑与运算符&&左结合(Left)
逻辑或运算符`
空值合并运算符??左结合(Left)
条件(三元)运算符expr1 ? expr2 : expr3右结合(Right)
级联运算符..?..左结合(Left)
赋值运算符=+=-=*=/=%=~/=&=^= 等等右结合(Right)
展开运算符(扩展操作)......? (用于集合的展开)无(None)
  • 左结合(Left associativity):多个相同优先级的运算符从左到右计算。
  • 右结合(Right associativity):多个相同优先级的运算符从右到左计算。
  • 无(None):这些运算符不能链式使用(或使用链式语法无意义),比如多个 ++ 连用是不允许的。