flutter【4】dart語言--操作符

暱稱真難選發表於2019-08-09

操作符

詳細的各個操作符的作用不再贅述,參考官網-操作符一覽表

操作符可以進行覆寫,參考Overridable operators

操作結果型別

操作符左右兩邊的操作物件不一致時,操作結果以左側操作物件型別為準。

下面介紹一些 dart中比較特殊的操作符。

相等操作符

== 操作符判斷兩個物件表示的東西是否一樣,如果兩個物件都是 null 返回true,如果有一個是 null ,返回 false。== 操作符其實就是返回 x.==(y) 的值,可以被覆寫。

如果需要嚴格的對比兩個物件,則使用 identical() 方法。

型別檢查操作符

  • as:型別轉換(也用來作為 library 字首)
  • is:物件是定義型別則返回 true,當物件是定義型別的子類或者實現類時,也返回 true
  • is!:物件是定義型別則返回 false

as 操作符可以將物件型別判斷和使用兩個行為進行合併,如下:

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

//as 方式,注意當 emp 為 null 或者不是 Person型別時,會丟擲異常
(emp as Person).firstName = 'Bob';
複製程式碼

賦值操作符

一般結構為 po= ,如 ??= 表示當左邊變數為 null 時,將右邊的值賦給左邊變數。

// Assign value to b if b is null; otherwise, b stays the same
b ??= value;
複製程式碼

條件操作符

  • condition ? expr1 : expr2 :滿足條件返回 expre1,否則返回expre2
  • expr1 ?? expr2:expre1 不為 null時返回 expre1,否則返回 expre2
var visibility = isPublic ? 'public' : 'private';

String playerName(String name) => name ?? 'Guest';
複製程式碼

級聯操作符(..)

使用 .. 操作符可以對同一物件執行一系列操作,能夠節省中間步驟和臨時變數,讓程式碼更高效。

其實嚴格來說, .. 級聯語法不是一個操作符。 只是一個 Dart 特殊語法。

querySelector('#confirm') // Get an object.
  ..text = 'Confirm' // Use its members.
  ..classes.add('important')
  ..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();
複製程式碼

需要注意的是在方法上使用級聯操作符很容易出錯,例如下面程式碼就會出錯。

// Does not work
var sb = new StringBuffer();
//sb.write() 函式返回一個 void, 無法在 void 上使用級聯操作符。
sb.write('foo')..write('bar');
複製程式碼

條件成員訪問符(?.)

和 . 類似,但是左邊的操作物件不能為 null,例如 foo?.bar 如果 foo 為 null 則返回 null,否則返回 bar 成員

相關文章