dart定義了下表所示的運(yùn)算符。你可以重寫許多這些運(yùn)算符。
描述 | 運(yùn)算符 |
---|---|
一元后綴 | expr++ expr-- () [] . ?. |
一元前綴 | -expr !expr ~expr ++expr --expr |
乘法類型 | * / % ~/ |
加法類型 | + - |
移動(dòng) 位運(yùn)算 |
<< >> |
與 位運(yùn)算 |
& |
異或 位運(yùn)算 |
^ |
或 位運(yùn)算 |
| |
關(guān)系和類型測(cè)試 | >= <= > < as is is! |
等式 | == != |
邏輯與 | && |
邏輯或 | || |
條件 | expr1 ? expr2 : expr3 |
級(jí)聯(lián) | .. |
賦值 | = *= /= ~/= %= += -= <<= >>= &= ^= |= ??= |
使用運(yùn)算符時(shí),可以創(chuàng)建表達(dá)式。以下是運(yùn)算符表達(dá)式的一些示例:
a++
a + b
a = b
a == b
c ? a : b
a is T
在之前的操作符表中,操作符的優(yōu)先級(jí)由其所在行定義,上面行內(nèi)的操作符優(yōu)先級(jí)大于下面行內(nèi)的操作符。例如,乘法類型操作符%的優(yōu)先級(jí)比等價(jià)操作符==
要高,而==
操作符的優(yōu)先級(jí)又比邏輯與操作符&&
要高。這些操作符的優(yōu)先級(jí)順序?qū)⒃谙旅娴膬尚写a中體現(xiàn)出來:
// 1.使用括號(hào)來提高可讀性
if ((n % i == 0) && (d % i == 0))
// 2.難以閱讀,但是和上面等價(jià)
if (n % i == 0 && d % i == 0)
警告:對(duì)于二元運(yùn)算符,其左邊的操作數(shù)將會(huì)決定使用的操作符的種類。例如,當(dāng)你使用一個(gè) Vector 對(duì)象以及一個(gè) Point 對(duì)象時(shí), aVector + aPoint 使用的 + 是由Vector 所定義的。
算術(shù)運(yùn)算符
dart支持常用的算術(shù)運(yùn)算符,如下表所示。
操作符 | 含義 |
---|---|
+ |
加 |
- |
減 |
-expr |
一元減號(hào),也被命名為負(fù)號(hào)(使后面表達(dá)式的值反過來) |
* |
乘 |
/ |
除 |
~/ |
返回一個(gè)整數(shù)值的除法 |
% |
取余,除法剩下的余數(shù) |
示例:
assert(2 + 3 == 5);
assert(2 - 3 == -1);
assert(2 * 3 == 6);
assert(5 / 2 == 2.5); // 結(jié)果是double類型
assert(5 ~/ 2 == 2); // 結(jié)果是一個(gè)整數(shù)
assert(5 % 2 == 1); // 余數(shù)
assert('5/2 = ${5 ~/ 2} r ${5 % 2}' == '5/2 = 2 r 1');
dart還支持前綴和后綴遞增和遞減運(yùn)算符。
運(yùn)算符 | 含義 |
---|---|
++var |
var=var+1 表達(dá)式的值為var+1
|
var++ |
var=var+1 表達(dá)式的值為var
|
--var |
var=var-1 表達(dá)式的值為var-1
|
var-- |
var=var-1 表達(dá)式的值為var
|
示例:
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
等式和關(guān)系運(yùn)算符
下表列出了等式和關(guān)系(比較)
運(yùn)算符的含義。
運(yùn)算符 | 含義 |
---|---|
== |
等于 |
!= |
不等于 |
> |
大于 |
< |
小于 |
>= |
大于等于 |
<= | 小于等于 |
要測(cè)試兩個(gè)對(duì)象x和y是相等,請(qǐng)使用= =
運(yùn)算符。在極少數(shù)情況下,您需要知道兩個(gè)對(duì)象是否是完全相同的對(duì)象,請(qǐng)改用experation()
函數(shù)。以下是==
運(yùn)算符的工作原理:
- 如果x或y為空,如果兩者都為空,則返回true;如果只有一個(gè)為空,則返回false。
- 返回一個(gè)函數(shù)調(diào)用的結(jié)果:
x.==(y)
。(這個(gè)調(diào)用是正確的,像==
這樣的運(yùn)算符實(shí)際上是由第一個(gè)操作數(shù)所調(diào)用的一個(gè)方法。你可以重寫大部分運(yùn)算符。
下面是使用每個(gè)等式和關(guān)系運(yùn)算符的示例:
assert(2 == 2);
assert(2 != 3);
assert(3 > 2);
assert(2 < 3);
assert(3 >= 3);
assert(2 <= 3);
類型測(cè)試操作符
as
、is
和 is!
操作符在運(yùn)行時(shí)用于檢查類型非常方便。
操作符 | 含義 |
---|---|
as |
類型轉(zhuǎn)換 |
is |
當(dāng)對(duì)象是相應(yīng)類型時(shí)返回 true |
is! |
當(dāng)對(duì)象不是相應(yīng)類型時(shí)返回 true |
如果obj
實(shí)現(xiàn)了T
所定義的借口,那么obj is T
將返回 true。比如,obj is Object
必然返回 true。
使用as
操作符可以把一個(gè)對(duì)象轉(zhuǎn)換為特定類型。一般來說,如果在is
測(cè)試之后還有一些關(guān)于對(duì)象的表達(dá)式,你可以把as
當(dāng)做是is
測(cè)試的一種簡(jiǎn)寫。考慮下面這段代碼:
if (emp is Person) {
// Type check
emp.firstName = '永動(dòng)機(jī)';
}
你也可以通過as
來簡(jiǎn)化代碼:
(emp as Person).firstName = '永動(dòng)機(jī)';
注意:上面兩段代碼并不相等。如果emp的值為 null 或者不是一個(gè) Person 對(duì)象,第一段代碼不會(huì)做任何事情,第二段代碼會(huì)報(bào)錯(cuò) 。
賦值操作符
正如你已經(jīng)看到的,你可以使用=
運(yùn)算符賦值。要僅在變量為null時(shí)賦值,請(qǐng)使用??=
運(yùn)算符。
// 賦值給a
a = value;
// 如果b為空,則將值分配給b;否則,b保持不變
b ??= value;
諸如+=
之類的復(fù)合賦值運(yùn)算符將操作與賦值相結(jié)合
= |
-= |
/= |
%= |
>>= |
^= |
---|---|---|---|---|---|
+= |
*= |
~/= |
<<= |
&= |
|= |
以下是復(fù)合賦值運(yùn)算符的工作方式:
復(fù)合賦值 | 等式表達(dá)式 | |
---|---|---|
對(duì)于操作符op | a op b |
a = a op b |
具體例子1 | a += b |
a = a + b |
具體例子2 | a -= b |
a = a - b |
下面的示例使用賦值運(yùn)算符和復(fù)合賦值運(yùn)算符:
var a = 2; //賦值使用 =
a *= 3; // 賦值且相乘 a = a * 3
assert(a == 6);
邏輯運(yùn)算符
可以使用邏輯運(yùn)算符反轉(zhuǎn)或組合布爾表達(dá)式。
操作符 | 含義 |
---|---|
!expr |
反轉(zhuǎn)以下表達(dá)式(將false更改為true,反之亦然) |
|| |
邏輯或 |
&& |
邏輯與 |
下面是使用邏輯運(yùn)算符的示例:
if (!done && (col == 0 || col == 3)) {
// ...Do something...
}
位運(yùn)算
通常我們指?位運(yùn)算為
<<
或>>
移動(dòng)位運(yùn)算,通過操作位的移動(dòng)來達(dá)到運(yùn)算的目的,而&
,|
,^
,~expr
也是操作位來達(dá)到運(yùn)算的目的。所以本文統(tǒng)稱這些運(yùn)算都為位運(yùn)算
操作符 | 含義 |
---|---|
& |
與 |
| |
或 |
^ |
異或 |
~expr |
一元位補(bǔ)碼( 0s變?yōu)?s;1s變?yōu)?s ) |
<< |
左移 |
>> |
右移 |
下面是使用所有位運(yùn)算符的示例:
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); // 右移
條件表達(dá)式
dart有兩個(gè)運(yùn)算符,可讓您簡(jiǎn)明地評(píng)估可能需要if-else
語句的表達(dá)式:
condition ? expr1 : expr2
如果條件為真,返回expr1,否則返回expr2
expr1 ?? expr2
如果expr1為非空,則返回其值;否則,計(jì)算并返回expr2的值。
當(dāng)你需要根據(jù)布爾表達(dá)式賦值時(shí),考慮使用?:
var visibility = isPublic ? 'public' : 'private';
如果布爾表達(dá)式測(cè)試為空,考慮使用??
String playerName(String name) => name ?? 'Guest';
前面的例子至少可以用另外兩種方式編寫,但不像以前那么簡(jiǎn)潔:
// 稍微長一點(diǎn)的版本使用 ?: 操作符
String playerName(String name) => name != null ? name : 'Guest';
// 非常長的使用if - else語句的版本
String playerName(String name) {
if (name != null) {
return name;
} else {
return 'Guest';
}
}
級(jí)聯(lián)符號(hào)(..)
級(jí)聯(lián)(..)允許您對(duì)同一對(duì)象執(zhí)行一系列操作。除了函數(shù)調(diào)用,您還可以訪問同一對(duì)象上的字段。這通常會(huì)省去創(chuàng)建臨時(shí)變量的步驟,并允許您編寫更多的級(jí)聯(lián)代碼。
示例代碼:
querySelector('#confirm') // 獲取一個(gè)對(duì)象
..text = 'Confirm' // 使用它的成員
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
第一個(gè)方法調(diào)用querySelector()
,返回一個(gè)selector對(duì)象。遵循級(jí)聯(lián)符號(hào)的代碼對(duì)這個(gè)selector對(duì)象進(jìn)行操作,忽略任何可能返回的后續(xù)值。
前面的例子相當(dāng)于:
var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
你也可以嵌套你的級(jí)聯(lián)。例如:
final addressBook = (AddressBookBuilder()
..name = 'jenny'
..email = 'jenny@example.com'
..phone = (PhoneNumberBuilder()
..number = '415-555-0100'
..label = 'home')
.build())
.build();
在返回實(shí)際對(duì)象的函數(shù)上構(gòu)造級(jí)聯(lián)要小心。例如,以下代碼失敗:
var sb = StringBuffer();
sb.write('foo')
..write('bar'); // 錯(cuò)誤:沒有為“void”定義的方法“write”。
sb.write()
調(diào)用返回void,你不能在void上構(gòu)建級(jí)聯(lián)。
注意:嚴(yán)格來說,級(jí)聯(lián)的“雙點(diǎn)”符號(hào)不是運(yùn)算符。這只是Dart語法的一部分。
其他操作符
在其他示例中,你已經(jīng)看到了大多數(shù)剩余的運(yùn)算符:
操作符 | 名稱 | 含義 |
---|---|---|
() |
函數(shù)應(yīng)用 | 表示函數(shù)調(diào)用 |
[] |
列表訪問 | 指列表中指定索引處的值 |
. |
成員訪問 | 指表達(dá)式的屬性;示例: foo.bar 從表達(dá)式foo 中選擇屬性bar
|
?. |
條件成員訪問 | 跟. 差不多,但是最左邊的操作數(shù)可以為空;例子:foo?.bar 從表達(dá)式foo 中選擇屬性bar ,除非foo 為空(在這種情況下,foo?.bar 值為空) |
PS:本文
整理
自官方文檔,若有發(fā)現(xiàn)問題請(qǐng)致郵 caoyanglee92@gmail.com