as
, is
, 和 is!
运算符用于在运行时处理类型检查:
as
Typecast (也被用于指定库前缀)is
True if the object has the specified typeis!
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 的特殊语法。