美文网首页带你Flutter带你Fly
带你Dart带你飞之操作符

带你Dart带你飞之操作符

作者: 树獭非懒 | 来源:发表于2018-11-11 15:39 被阅读0次

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

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

    操作符一表览

    dart操作符.png

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

    算术操作符

    算术操作符.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 = 'jenny@example.com'
          ..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带你飞之操作符

        本文链接:https://www.haomeiwen.com/subject/irgxfqtx.html