带你Dart带你Diao之操作符

笔者这次主要讲的是Dart 中定义的操作符,核心内容如下

  1. 操作符表
  2. 算术操作符
  3. 相等相关的操作符
  4. 赋值操作符
  5. 逻辑操作符
  6. 条件表达式
  7. 级联操作符
  8. 其余操作符

操作符一表览

带你Dart带你Diao之操作符_第1张图片
dart操作符.png

在上面的操作符表格中所列的操作符都是按照优先级顺序从左到右,从上到下的方式来列出的,上面和左边的操作符优先级要高于下面和右边的。例如%操作符优先级高于 ==,而等号高于 &&。

算术操作符

带你Dart带你Diao之操作符_第2张图片
算术操作符.png

这些都很简单,唯一需要注意的一个是'~/'和'/'一样也表示除号,但它除过的结果是整数。

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 成员

你可能感兴趣的:(带你Dart带你Diao之操作符)