如下列出 Dart 的運算符,從高到低按照優先級排列:html
描述 | 運算符 |
---|---|
一元運算符(後置) | expr++ expr-- () [] . ?. |
一元運算符(前置) | -expr !expr ~expr ++expr --expr |
乘法運算符 | * / % ~/ |
加法運算符 | + - |
按位運算符 | << >> |
按位與 | & |
按位異或 | ^ |
按位或 | | |
關係與類型檢測 | >= > <= < as is is! |
平等 | == != |
邏輯與 | && |
邏輯或 | || |
是否爲null | ?? |
三目運算符 | expr1 ? expr2 : expr3 |
級聯運算符 | .. |
賦值運算符 | = *= /= ~/= %= += -= <<= >>= &= ^= |= ??= |
使用運算符時,能夠建立表達式。如下是運算符表達式的一些示例:express
a++ a + b a = b a == b c ? a : b a is T
運算符 | 描述 |
---|---|
+ | 加 |
- | 減 |
-expr | 一元運算減 |
* | 乘 |
/ | 除 |
~/ | 除以,返回整數結果 |
% | 獲取整數除法的餘數(模數) |
Dart 也支持前置和後綴 遞增、遞減運算符。編程
例子:微信
assert(2 + 3 == 5); assert(2 - 3 == -1); assert(2 * 3 == 6); assert(5 / 2 == 2.5); // Result is a double assert(5 ~/ 2 == 2); // Result is an int assert(5 % 2 == 1); // Remainder assert('5/2 = ${5 ~/ 2} r ${5 % 2}' == '5/2 = 2 r 1');
運算符 | 描述 |
---|---|
++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; // Increment a before b gets its value. assert(a == b); // 1 == 1 a = 0; b = a++; // Increment a AFTER b gets its value. assert(a != b); // 1 != 0 a = 0; b = --a; // Decrement a before b gets its value. assert(a == b); // -1 == -1 a = 0; b = a--; // Decrement a AFTER b gets its value. assert(a != b); // -1 != 0
運算符 | 描述 |
---|---|
== | 等於 |
!= | 不等於 |
> | 大於 |
< | 小於 |
>= | 大於或等於 |
<= | 小於或等於 |
例子:oop
assert(2 == 2); assert(2 != 3); assert(3 > 2); assert(2 < 3); assert(3 >= 3); assert(2 <= 3);
使用 as ,is 和 is !運算符能夠方便地在運行時檢查類型。post
運算符 | 描述 |
---|---|
as | Typecast(也用於指定庫前綴) |
is | 若是對象具備指定的類型,則爲True |
is! | 若是對象具備指定的類型,則返回false |
案例1:下面案例用於檢測emp是不是Person類型:測試
if (emp is Person) { // Type check emp.firstName = 'Bob'; }
案例2:下面案例emp的類型設置爲Person類型;ui
(emp as Person).firstName = 'Bob';
提示url
若是emp爲null
或不是Person,則案例1不執行任何操做,案例2會拋出異常。
Dart 可使用 =
運算符賦值。
// 把value 賦值給a a = value; // 若是b 爲null 把 value 賦值給 b;不然b 保持不變。 b ??= value;
複合賦值運算符:
= |
–= |
/= |
%= |
>>= |
^= |
---|---|---|---|---|---|
+= |
*= |
~/= |
<<= |
&= |
|= |
如下是複合賦值運算符的工做原理:
- | 複合表達式 | 賦值表達式 |
---|---|---|
複合表達式 | a op= b |
a = a op b |
例子 | a += b |
a = a + b |
例如:
var a = 2; // Assign using = a *= 3; // Assign and multiply: a = a * 3 assert(a == 6);
運算符 | 描述 |
---|---|
! |
邏輯非 |
|| |
邏輯與 |
&& |
邏輯或 |
例如:
if (!done && (col == 0 || col == 3)) { // ...Do something... }
您能夠在Dart中操縱數字的各個位。一般,您將使用這些按位和移位運算符和整數。
運算符 | 描述 |
---|---|
& |
按位或 |
| |
按位與 |
^ |
按位異或 |
~expr |
按位取反 |
<< |
左移 |
>> |
右移 |
例如:
final value = 0x22; final bitmask = 0x0f; assert((value & bitmask) == 0x02); // AND assert((value & ~bitmask) == 0x20); // AND NOT assert((value | bitmask) == 0x2f); // OR assert((value ^ bitmask) == 0x2d); // XOR assert((value << 4) == 0x220); // Shift left assert((value >> 4) == 0x02); // Shift right
條件表達式 Dart有兩個運算符,條件表達式能夠用來簡化 if-else語句。
若是condition爲true,則計算expr1(並返回其值); 不然,計算並返回expr2的值。
若是expr1爲非null,則返回其值; 不然,計算並返回expr2的值。
當您須要根據布爾表達式賦值時,請考慮使用==?:== :
var visibility = isPublic ? 'public' : 'private';
若是布爾表達式測試爲null,請考慮使用==??== :
String playerName(String name) => name ?? 'Guest';
前面的例子至少能夠用其餘兩種方式編寫,但不能簡潔:
// Slightly longer version uses ?: operator. String playerName(String name) => name != null ? name : 'Guest'; // Very long version uses if-else statement. String playerName(String name) { if (name != null) { return name; } else { return 'Guest'; } }
級聯運算符( ..),容許您對同一對象進行多項操做。
querySelector('#confirm') // 獲取html元素對象 ..text = 'Confirm' // 訪問成員 ..classes.add('important') // 添加樣式 ..onClick.listen((e) => window.alert('Confirmed!')); // 監聽事件
上面的代碼等同於:
var button = querySelector('#confirm'); button.text = 'Confirm'; button.classes.add('important'); button.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();
當心在返回實際對象的函數上構造級聯。例如,如下代碼失敗:
var sb = StringBuffer(); sb.write('foo') ..write('bar'); // Error: method 'write' isn't defined for 'void'.
==sb.write()==方法沒有返回write成員方法。因此拋出異常,==sb.write()==必須也使用級聯訪問。
var sb = StringBuffer(); sb ..write('123') ..write('22'); print(sb); // 輸出 => 12322
提示
嚴格來講,級聯的「雙點」符號不是運算符。它只是Dart語法的一部分。
運算符 | 名稱 | 描述 |
---|---|---|
() |
函數調用 | 表示函數調用 |
[] |
List訪問 | 引用列表中指定索引處的值 |
. |
成員訪問 | 訪問對象的成員屬性 |
?. |
條件的成員訪問 | 在不明確對象是否存在的狀況下使用 ?. 訪問對象的成員 |
?. 運算符使用案例:
class Test { num member = 1; } void main() { var test = null; print(test?.member); // 返回null 不會拋出異常 test = new Test(); print(test?.member); // 返回 1 }
if...else
語句塊的語法
if(boolean_expression){ // statement(s) will execute if the Boolean expression is true. } else { // statement(s) will execute if the Boolean expression is false. }
流程圖
Dart 支持 帶有 if 和 else 的語句:
void main() { var num = 12; if (num % 2==0) { print("偶數"); } else { print("奇數"); } }
輸出結果
偶數
與JavaScript不一樣,條件必須使用布爾值。不能使用其餘類型,但可使用 null。
switch
語句計算表達式,並將表達式的值與case
子句指定的值匹配,而後執行與該case
相關的語句。
switch/case語句的語法
switch(variable_expression) { case constant_expr1: { // statements; } break; case constant_expr2: { //statements; } break; default: { //statements; } break; }
switch
中能夠有任意數量的case
語句。case
語句只能包含常量,它不能是變量或表達式。variable_expression
和常量表達式的數據類型必須匹配。break
語句,不然執行會流入下一個break
塊。case
表達式必須是惟一的。default
塊是可選的。流程圖
void main() { var grade = "A"; switch(grade) { case "A": { print("至關牛逼"); } break; case "B": { print("厲害"); } break; case "C": { print("通常"); } break; case "D": { print("二愣子"); } break; default: { print("Invalid choice"); } break; } }
結果輸出
至關牛逼
該示例根據常量集(A,B,C,D和E)驗證變量等級的值,並執行相應的塊。若是變量中的值與上面提到的任何常量都不匹配,則將執行默認(default
)塊。
循環的分類
for循環
for
循環是一個肯定循環的實現,用於執行代碼塊指定的次數。
for循環的語法
for (initial_count_value; termination-condition; step) { //statements }
示例
void main() { var num = 5; var factorial = 1; for( var i = num ; i >= 1; i-- ) { factorial *= i ; } print(factorial); }
輸出結果
120
for...in
循環
通常用於循環對象的屬性
for...in
循環的語法
for (variablename in object){ statement or block to execute }
示例
void main() { var obj = [12,13,14]; for (var prop in obj) { print(prop); } }
輸出結果
12 13 14
while循環
流程圖
while
循環的語法
while (expression) { Statement(s) to be executed if expression is true }
示例
void main() { var num = 5; var factorial = 1; while(num >=1) { factorial = factorial * num; num--; } print("The factorial is ${factorial}"); }
輸出結果
The factorial is 120
do...while循環
do...while
循環中至少執行代碼塊一次
流程圖
do-while
循環的語法
do { Statement(s) to be executed; } while (expression);
示例
void main() { var n = 10; do { print(n); n--; } while(n>=0); }
輸出結果
10 9 8 7 6 5 4 3 2 1 0
使用 break 中止程序循環
示例
void main() { var i = 1; while(i<=10) { if (i % 5 == 0) { print("The first multiple of 5 between 1 and 10 is : ${i}"); break ; //exit the loop if the first multiple is found } i++; } }
輸出結果
The first multiple of 5 between 1 and 10 is: 5
使用 continue 跳轉到下一次迭代
示例
void main() { var num = 0; var count = 0; for(num = 0;num<=20;num++) { if (num % 2==0) { continue; } count++; } print(" The count of odd values between 0 and 20 is: ${count}"); }
輸出結果
The count of odd values between 0 and 20 is: 10
若是對象實現了 Iterable 接口的對象,可使用 forEach()接口 (例如,list 或者 set)
main() { List list = [123, '123', 'postbird']; list.forEach((f)=> print(f)); }
輸出結果
123 123 postbird
若是 assert 語句中的布爾條件爲 false
, 那麼正常的程序執行流程會被中斷。 assert 語句只在開發環境中有效, 在生產環境是無效的;
// 確認變量值不爲空。 assert(text != null); // 確認變量值小於100。 assert(number < 100); // 確認 URL 是不是 https 類型。 assert(urlString.startsWith('https'));
歡迎掃面下列二維碼關注「餘弦的自留地」公衆微信號
萬物之中,但願至美