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