操作符
詳細的各個操作符的作用不再贅述,參考官網-操作符一覽表 。
操作符可以進行覆寫,參考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,否則返回expre2expr1 ?? 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 成員