类型判定运算符

​as​​​, ​​is​​​, 和 ​​is!​​ 运算符用于在运行时处理类型检查:

Operator

Meaning

​as​

Typecast (也被用于​​指定库前缀​​)

​is​

True if the object has the specified type

​is!​

False if the object has the specified type

例如, ​​obj is Object​​​ 总是 true。 但是只有 ​​obj​​​ 实现了 ​​T​​​ 的接口时, ​​obj is T​​ 才是 true。

使用 ​​as​​​ 运算符将对象强制转换为特定类型。 通常,可以认为是 ​​is​​ 类型判定后,被判定对象调用函数的一种缩写形式。 请考虑以下代码:


if (emp is Person) { // Type check emp.firstName = 'Bob'; }


使用 ​​as​​ 运算符进行缩写:


(emp as Person).firstName = 'Bob';


 

条件表达式

Dart有两个运算符,有时可以替换 ​​if-else​​ 表达式, 让表达式更简洁:

condition ? expr1 : expr2

如果条件为 true, 执行 expr1 (并返回它的值): 否则, 执行并返回 expr2 的值。

expr1 ?? expr2

如果 expr1 是 non-null, 返回 expr1 的值; 否则, 执行并返回 expr2 的值。

如果赋值是根据布尔值, 考虑使用 ​​?:​​。


var visibility = isPublic ? 'public' : 'private';


如果赋值是基于判定是否为 null, 考虑使用 ​​??​​。


String playerName(String name) => name ?? 'Guest';


下面给出了其他两种实现方式, 但并不简洁:


// Slightly longer version uses ?: operator. String playerName(String name) => name != null ? name : 'Guest'; // Very long version uses if-else statement. String playerName(String name) { if (name != null) { return name; } else { return 'Guest'; } }



级联运算符 (..)

级联运算符 (​​..​​) 可以实现对同一个对像进行一系列的操作。 除了调用函数, 还可以访问同一对象上的字段属性。 这通常可以节省创建临时变量的步骤, 同时编写出更流畅的代码。

考虑一下代码:


querySelector('#confirm') // 获取对象。 ..text = 'Confirm' // 调用成员变量。 ..classes.add('important') ..onClick.listen((e) => window.alert('Confirmed!'));


第一句调用函数 ​​querySelector()​​ , 返回获取到的对象。 获取的对象依次执行级联运算符后面的代码, 代码执行后的返回值会被忽略。

上面的代码等价于:


var button = querySelector('#confirm'); button.text = 'Confirm'; button.classes.add('important'); button.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();


在返回对象的函数中谨慎使用级联操作符。 例如,下面的代码是错误的:


var sb = StringBuffer(); sb.write('foo') ..write('bar'); // Error: 'void' 没哟定义 'write' 函数。


​sb.write()​​​ 函数调用返回 void, 不能在 ​​void​​ 对象上创建级联操作。

提示: 严格的来讲, “两个点” 的级联语法不是一个运算符。 它只是一个 Dart 的特殊语法。