flutter【4】dart语言--操作符
2019-01-25 本文已影响0人
昵称真难选
操作符
详细的各个操作符的作用不再赘述,参考官网-操作符一览表 。
操作符可以进行覆写,参考Overridable operators
操作结果类型
操作符左右两边的操作对象不一致时,操作结果以左侧操作对象类型为准。
下面介绍一些 dart中比较特殊的操作符。
相等操作符
== 操作符判断两个对象表示的东西是否一样,如果两个对象都是 null 返回true,如果有一个是 null ,返回 false。== 操作符其实就是返回 x.==(y) 的值,可以被覆写。
如果需要严格的对比两个对象,则使用 identical() 方法。
类型检查操作符
- as:类型转换(也用来作为 library 前缀)
- is:对象是定义类型则返回 true,当对象是定义类型的子类或者实现类时,也返回 true
- is!:对象是定义类型则返回 false
as 操作符可以将对象类型判断和使用两个行为进行合并,如下:
//is 方式
if (emp is Person) {
// Type check
emp.firstName = 'Bob';
}
//as 方式,注意当 emp 为 null 或者不是 Person类型时,会抛出异常
(emp as Person).firstName = 'Bob';
赋值操作符
一般结构为 po=
,如 ??=
表示当左边变量为 null 时,将右边的值赋给左边变量。
// Assign value to b if b is null; otherwise, b stays the same
b ??= value;
条件操作符
-
condition ? expr1 : expr2
:满足条件返回 expre1,否则返回expre2 -
expr1 ?? expr2
:expre1 不为 null时返回 expre1,否则返回 expre2
var visibility = isPublic ? 'public' : 'private';
String playerName(String name) => name ?? 'Guest';
级联操作符(..)
使用 .. 操作符可以对同一对象执行一系列操作,能够节省中间步骤和临时变量,让代码更高效。
其实严格来说, .. 级联语法不是一个操作符。 只是一个 Dart 特殊语法。
querySelector('#confirm') // Get an object.
..text = 'Confirm' // Use its members.
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
另外 .. 操作符可以嵌套使用
final addressBook = (AddressBookBuilder()
..name = 'jenny'
..email = 'jenny@example.com'
..phone = (PhoneNumberBuilder()
..number = '415-555-0100'
..label = 'home')
.build())
.build();
需要注意的是在方法上使用级联操作符很容易出错,例如下面代码就会出错。
// Does not work
var sb = new StringBuffer();
//sb.write() 函数返回一个 void, 无法在 void 上使用级联操作符。
sb.write('foo')..write('bar');
条件成员访问符(?.)
和 . 类似,但是左边的操作对象不能为 null,例如 foo?.bar 如果 foo 为 null 则返回 null,否则返回 bar 成员