先說下題外話哈,最近做了個(gè)領(lǐng)取電商平臺(tái)優(yōu)惠券的小程序,掃碼支持下哈~
image
操作符
詳細(xì)的各個(gè)操作符的作用不再贅述,參考官網(wǎng)-操作符一覽表 。
操作符可以進(jìn)行覆寫,參考Overridable operators
操作結(jié)果類型
操作符左右兩邊的操作對(duì)象不一致時(shí),操作結(jié)果以左側(cè)操作對(duì)象類型為準(zhǔn)。
下面介紹一些 dart中比較特殊的操作符。
相等操作符
== 操作符判斷兩個(gè)對(duì)象表示的東西是否一樣,如果兩個(gè)對(duì)象都是 null 返回true,如果有一個(gè)是 null ,返回 false。== 操作符其實(shí)就是返回 x.==(y) 的值,可以被覆寫。
如果需要嚴(yán)格的對(duì)比兩個(gè)對(duì)象,則使用 identical() 方法。
類型檢查操作符
- as:類型轉(zhuǎn)換(也用來作為 library 前綴)
- is:對(duì)象是定義類型則返回 true,當(dāng)對(duì)象是定義類型的子類或者實(shí)現(xiàn)類時(shí),也返回 true
- is!:對(duì)象是定義類型則返回 false
as 操作符可以將對(duì)象類型判斷和使用兩個(gè)行為進(jìn)行合并,如下:
//is 方式
if (emp is Person) {
// Type check
emp.firstName = 'Bob';
}
//as 方式,注意當(dāng) emp 為 null 或者不是 Person類型時(shí),會(huì)拋出異常
(emp as Person).firstName = 'Bob';
賦值操作符
一般結(jié)構(gòu)為 po= ,如 ??= 表示當(dāng)左邊變量為 null 時(shí),將右邊的值賦給左邊變量。
// Assign value to b if b is null; otherwise, b stays the same
b ??= value;
條件操作符
-
condition ? expr1 : expr2:滿足條件返回 expre1,否則返回expre2 -
expr1 ?? expr2:expre1 不為 null時(shí)返回 expre1,否則返回 expre2
var visibility = isPublic ? 'public' : 'private';
String playerName(String name) => name ?? 'Guest';
級(jí)聯(lián)操作符(..)
使用 .. 操作符可以對(duì)同一對(duì)象執(zhí)行一系列操作,能夠節(jié)省中間步驟和臨時(shí)變量,讓代碼更高效。
其實(shí)嚴(yán)格來說, .. 級(jí)聯(lián)語法不是一個(gè)操作符。 只是一個(gè) 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();
需要注意的是在方法上使用級(jí)聯(lián)操作符很容易出錯(cuò),例如下面代碼就會(huì)出錯(cuò)。
// Does not work
var sb = new StringBuffer();
//sb.write() 函數(shù)返回一個(gè) void, 無法在 void 上使用級(jí)聯(lián)操作符。
sb.write('foo')..write('bar');
條件成員訪問符(?.)
和 . 類似,但是左邊的操作對(duì)象不能為 null,例如 foo?.bar 如果 foo 為 null 則返回 null,否則返回 bar 成員