【Dart學習】-- Dart之操做符

一,概述

  • dart定義了下表所示的運算符。你能夠重寫許多這些運算符。
描述 運算符
一元后綴 expr++ expr-- () [] . ?.
一元前綴 -expr !expr ~expr ++expr --expr
乘法類型 * / % ~/
加法類型 + -
移動位運算 << >>
位運算 &
異或位運算 ^
位運算 |
關係和類型測試 >= <= > < as is is!
等式 == !=
邏輯與 &&
邏輯或 ||
條件 expr1 ? expr2 : expr3
級聯 ..
賦值 = *= /= ~/= %= += -= <<= >>= &= ^= |= ??=
  • 使用運算符時,能夠建立表達式。如下是運算符表達式的一些示例:
    a++
    a + b
    a = b
    a == b
    c ? a : b
    a is T
  • 在以前的操做符表中,操做符的優先級由其所在行定義,上面行內的操做符優先級大於下面行內的操做符。例如,乘法類型操做符%的優先級比等價操做符==要高,而==操做符的優先級又比邏輯與操做符&&要高。這些操做符的優先級順序將在下面的兩行代碼中體現出來:
    // 1.使用括號來提升可讀性
    if ((n % i == 0) && (d % i == 0))
    
    // 2.難以閱讀,可是和上面等價
    if (n % i == 0 && d % i == 0)

警告:對於二元運算符,其左邊的操做數將會決定使用的操做符的種類。例如,當你使用一個 Vector 對象以及一個 Point 對象時, aVector + aPoint 使用的 + 是由Vector 所定義的。函數


二,算術運算符

  • dart支持經常使用的算術運算符,以下表所示。
操做符 含義
+
-
-expr 一元減號,也被命名爲負號(使後面表達式的值反過來)
*
/
~/ 返回一個整數值的除法
% 取餘,除法剩下的餘數

  示例:測試

 

assert(2 + 3 == 5);
assert(2 - 3 == -1);
assert(2 * 3 == 6);
assert(5 / 2 == 2.5); // 結果是double類型
assert(5 ~/ 2 == 2); // 結果是一個整數
assert(5 % 2 == 1); // 餘數

assert('5/2 = ${5 ~/ 2} r ${5 % 2}' == '5/2 = 2 r 1');

 

  • dart還支持前綴和後綴遞增和遞減運算符。
運算符 含義
++var var=var+1表達式的值爲var+1
var++ var=var+1表達式的值爲var
--var var=var-1表達式的值爲var-1
var-- var=var-1表達式的值爲var

  示例:ui

var a, b;

a = 0;
b = ++a; // 在b得到其值以前自增a
assert(a == b); // 1 == 1

a = 0;
b = a++; //在b得到值後自增a
assert(a != b); // 1 != 0

a = 0;
b = --a; // 在b得到其值以前自減a
assert(a == b); // -1 == -1

a = 0;
b = a--; // 在b得到值後自減a
assert(a != b); // -1 != 0

 


三,等式和關係運算符

  • 下表列出了等式和關係(比較)運算符的含義。
運算符 含義
== 等於
!= 不等於
> 大於
< 小於
>= 大於等於
<= 小於等於
  • 要測試兩個對象x和y是相等,請使用==運算符。在極少數狀況下,您須要知道兩個對象是不是徹底相同的對象,請改用experation()函數。
    如下是==運算符的工做原理:
    1. 若是x或y爲空,若是二者都爲空,則返回true;若是隻有一個爲空,則返回false。
    2. 返回一個函數調用的結果:x.==(y)。(這個調用是正確的,像==這樣的運算符其實是由第一個操做數所調用的一個方法。你能夠重寫大部分運算符。
  • 下面是使用每一個等式和關係運算符的示例:
    assert(2 == 2);
    assert(2 != 3);
    assert(3 > 2);
    assert(2 < 3);
    assert(3 >= 3);
    assert(2 <= 3);

     


四,類型測試操做符

  • asis和 is!操做符在運行時用於檢查類型很是方便。
操做符 含義
as 類型轉換
is 當對象是相應類型時返回 true
is! 當對象不是相應類型時返回 true
  • 若是obj實現了T所定義的藉口,那麼obj is T將返回 true。好比,obj is Object必然返回 true。
  • 使用as操做符能夠把一個對象轉換爲特定類型。通常來講,若是在is測試以後還有一些關於對象的表達式,你能夠把as當作是is測試的一種簡寫。考慮下面這段代碼:
    if (emp is Person) {
      // Type check
      emp.firstName = '永動機';
    }

    你也能夠經過as來簡化代碼:spa

    (emp as Person).firstName = '永動機';

注意:上面兩段代碼並不相等。若是emp的值爲 null 或者不是一個 Person 對象,第一段代碼不會作任何事情,第二段代碼會報錯 。code


五,賦值操做符

  • 正如你已經看到的,你可使用=運算符賦值。要僅在變量爲null時賦值,請使用??=運算符。
    // 賦值給a
    a = value;
    // 若是b爲空,則將值分配給b;不然,b保持不變
    b ??= value;
  • 諸如+=之類的複合賦值運算符將操做賦值相結合
= -= /= %= >>= ^=
+= *= ~/= <<= &= |=
  • 如下是複合賦值運算符的工做方式:
  複合賦值 等式表達式
對於操做符op a op b a = a op b
具體例子1 a += b a = a + b
具體例子2 a -= b a = a - b

  下面的示例使用賦值運算符和複合賦值運算符:對象

var a = 2; //賦值使用 =
a *= 3; // 賦值且相乘 a = a * 3
assert(a == 6);

 


六,邏輯運算符

  • 可使用邏輯運算符反轉或組合布爾表達式。
操做符 含義
!expr 反轉如下表達式(將false更改成true,反之亦然)
|| 邏輯或
&& 邏輯與
  • 下面是使用邏輯運算符的示例:
    if (!done && (col == 0 || col == 3)) {
      // ...Do something...
    }

     


七,位運算

一般咱們指☞位運算爲<<>>移動位運算,經過操做位的移動來達到運算的目的,而&,|,^,~expr也是操做位來達到運算的目的。因此本文統稱這些運算都爲位運算blog

操做符 含義
&
|
^ 異或
~expr 一元位補碼( 0s變爲1s;1s變爲0s )
<< 左移
>> 右移
  • 下面是使用全部位運算符的示例:
    final value = 0x22;
    final bitmask = 0x0f;
    
    assert((value & bitmask)  == 0x02);  //
    assert((value & ~bitmask) == 0x20);  // 與非
    assert((value | bitmask)  == 0x2f);  //
    assert((value ^ bitmask)  == 0x2d);  // 異或
    assert((value << 4)       == 0x220); // 左移
    assert((value >> 4)       == 0x02);  // 右移

八,條件表達式

  • dart有兩個運算符,可以讓您簡明地評估可能須要if-else語句的表達式:
    • condition ? expr1 : expr2
      若是條件爲真,返回expr1,不然返回expr2
    • expr1 ?? expr2
      若是expr1爲非空,則返回其值expr1;不然,計算並返回expr2的值。
  • 當你須要根據布爾表達式賦值時,考慮使用?:
    var visibility = isPublic ? 'public' : 'private';

    若是布爾表達式測試爲空,考慮使用??
    索引

    String playerName(String name) => name ?? 'Guest';
  • 前面的例子至少能夠用另外兩種方式編寫,但不像之前那麼簡潔:
    // 稍微長一點的版本使用 ?: 操做符
    String playerName(String name) => name != null ? name : 'Guest';
    
    // 很是長的使用if - else語句的版本
    String playerName(String name) {
      if (name != null) {
        return name;
      } else {
        return 'Guest';
      }
    }

     


九,級聯符號(..)

  • 級聯(..)容許您對同一對象執行一系列操做。除了函數調用,您還能夠訪問同一對象上的字段。這一般會省去建立臨時變量的步驟,並容許您編寫更多的級聯代碼。

    示例代碼:it

    querySelector('#confirm') // 獲取一個對象
      ..text = 'Confirm' // 使用它的成員
      ..classes.add('important')
      ..onClick.listen((e) => window.alert('Confirmed!'));
  • 第一個方法調用querySelector(),返回一個selector對象。遵循級聯符號的代碼對這個selector對象進行操做,忽略任何可能返回的後續值。

    前面的例子至關於:io

    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'); // 錯誤:沒有爲「void」定義的方法「write」。

   sb.write()調用返回void,你不能在void上構建級聯。

注意:嚴格來講,級聯的「雙點」符號不是運算符。這只是Dart語法的一部分。


十,其餘操做符

  • 在其餘示例中,你已經看到了大多數剩餘的運算符:
操做符 名稱 含義
() 函數應用 表示函數調用
[] 列表訪問 指列表中指定索引處的值
. 成員訪問 指表達式的屬性;示例: foo.bar從表達式foo中選擇屬性foo。若是左邊的操做數爲null時,會崩潰,這個時候能夠用下面的(?.)
?. 條件成員訪問 .差很少,可是最左邊的操做數能夠爲空;例子:foo?.bar從表達式foo中選擇屬性bar,除非foo爲空(在這種狀況下,foo?.bar值爲空)
相關文章
相關標籤/搜索