笔者这次主要讲的是Dart 中定义的操作符,核心内容如下
- 操作符表
- 算术操作符
- 相等相关的操作符
- 赋值操作符
- 逻辑操作符
- 条件表达式
- 级联操作符
- 其余操作符
操作符一表览
在上面的操作符表格中所列的操作符都是按照优先级顺序从左到右,从上到下的方式来列出的,上面和左边的操作符优先级要高于下面和右边的。例如%操作符优先级高于 ==,而等号高于 &&。
算术操作符
这些都很简单,唯一需要注意的一个是'~/'和'/'一样也表示除号,但它除过的结果是整数。
Dart也是支持递增、递减前缀和后缀操作
++var var = var + 1 (该表达式的结果是var+1)
var++ var = var + 1 (该表达式的结果是var,下一次用到该变量时var的值是var+1)
--var var = var – 1 (该表达式的结果是var-1)
var-- var = var – 1 (该表达式的结果是var,下一次用到该变量时var的值是var-1)
关于递增递减这些操作的规则和其他大多数语言都是一样的。
相等相关的操作符
== 相等
!= 不等
> 大于
< 小于
>= 大于等于
<= 小于等于
要测试两个对象代表的是否为同样的内容,使用 == 操作符
在某些情况下,你需要知道两个对象是否是同一个对象,使用identical()方法。
类型判定操作符
as、 is、 和 is! 操作符是在运行时判定对象 类型的操作符
as 类型转换
is 如果对象是指定的类型返回 True
is! 如果对象是指定的类型返回 False
只有当obj实现了T的接口,obj is T才是 true。例如 obj is Object总是 true
举栗子
if (emp is Person) { // Type check
emp.firstName = 'Bob';
}
//上述代码简写
(emp as Person).firstName = 'Bob';
上面这两个代码效果是有区别的。如果emp是null或者不是Person 类型, 则第一个示例使用is则不会执行条件里面的代码,而第二个情况使用 as 则会抛出异常。
赋值操作符
使用 = 操作符来赋值。 但是还有一个 ??= 操作符用来指定 值为 null的变量的值。
a = value; // 给 a 变量赋值
b ??= value; // 如果 b 是 null,则赋值给 b;
// 如果不是 null,则 b 的值保持不变
逻辑操作符
!expr 对表达式结果取反(true 变为 false ,false 变为 true)
|| 逻辑 OR
&& 逻辑 AND
条件表达式
Dart 有两个特殊的操作符可以用来替代 if-else 语句:
condition ? expr1 : expr2
//栗子
var finalStatus = m.isFinal ? 'final' : 'not final';
如果 condition 是 true,执行 expr1 (并返回执行的结果),否则执行 expr2 并返回其结果。
expr1 ?? expr2
//栗子
String toString() => msg ?? super.toString();
如果 expr1 是 non-null,返回其值,否则执行 expr2 并返回其结果。
级联操作符
级联操作符 (..) 可以在同一个对象上连续调用多个函数以及访问成员变量。使用级联操作符可以避免创建临时变量, 并且写出来的代码看起来更加流畅
querySelector('#button') // Get an object.
..text = 'Confirm' // Use its members.
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
第一个方法 querySelector() 返回了一个 selector 对象。 后面的级联操作符都是调用这个对象的成员, 并忽略每个操作 所返回的值。
等价于这样写
var button = querySelector('#button');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
可以看出来用级联操作符可以避免创建了临时变量,代码看起来更简洁。它还可以嵌套使用
final addressBook = (new AddressBookBuilder()
..name = 'jenny'
..email = '[email protected]'
..phone = (new PhoneNumberBuilder()
..number = '415-555-0100'
..label = 'home')
.build())
.build();
严格来说, 两个点的级联语法不是一个操作符。 只是一个 Dart 特殊语法
其余操作符
() 代表调用一个方法
[] 访问 list 中特定位置的元素
. 访问元素,例如 foo.bar 代表访问 foo 的 bar 成员
?. 和 . 类似,但是左边的操作对象不能为 null,例如 foo?.bar 如果 foo 为 null 则返回 null,否则返回 bar 成员