flutter【4】dart語言--操作符
操作符
詳細的各個操作符的作用不再贅述,參考官網-操作符一覽表 。
操作符可以進行覆寫,參考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 expr1 ?? expr2
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 = '[email protected]' ..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 成員