一 . 運算子
以下列出 Dart 的運算子,從高到低按照優先級排列:
| 描述 | 運算子 |
|---|---|
| 一元運算子(后置) | expr++ expr-- () [] . ?. |
| 一元運算子(前置) | -expr !expr ~expr ++expr --expr |
| 乘法運算子 | * / % ~/ |
| 加法運算子 | + - |
| 按位運算子 | << >> |
| 按位與 | & |
| 按位異或 | ^ |
| 按位或 | | |
| 關系與型別檢測 | >= > <= < as is is! |
| 平等 | == != |
| 邏輯與 | && |
| 邏輯或 | || |
| 是否為null | ?? |
| 三目運算子 | expr1 ? expr2 : expr3 |
| 級聯運算子 | .. |
| 賦值運算子 | = *= /= ~/= %= += -= <<= >>= &= ^= |= ??= |
使用運算子時,可以創建運算式,以下是運算子運算式的一些示例:
a++
a + b
a = b
a == b
c ? a : b
a is T
1 . 算術運算子
| 運算子 | 描述 |
|---|---|
| + | 加 |
| - | 減 |
| -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
2 . 比較運算子
| 運算子 | 描述 |
|---|---|
| == | 等于 |
| != | 不等于 |
| > | 大于 |
| < | 小于 |
| >= | 大于或等于 |
| <= | 小于或等于 |
例子:
assert(2 == 2);
assert(2 != 3);
assert(3 > 2);
assert(2 < 3);
assert(3 >= 3);
assert(2 <= 3);
3 . ★★★★★型別檢查運算子★★★★★
使用 as ,is 和 is !運算子可以方便地在運行時檢查型別,
| 運算子 | 描述 |
|---|---|
| as | Typecast(也用于指定庫前綴) |
| is | 如果物件具有指定的型別,則為True |
| is! | 如果物件具有指定的型別,則回傳false |
案例1:下面案例用于檢測emp是否是Person型別:
if (emp is Person) {
// Type check
emp.firstName = 'Bob';
}
案例2:下面案例emp的型別設定為Person型別;
(emp as Person).firstName = 'Bob';
提示
如果emp為null或不是Person,則案例1不執行任何操作,案例2會拋出例外,
4 . 賦值運算子
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);
5 . 邏輯運算子
| 運算子 | 描述 |
|---|---|
! |
邏輯非 |
|| |
邏輯與 |
&& |
邏輯或 |
例如:
if (!done && (col == 0 || col == 3)) {
// ...Do something...
}
6 . 按位運算子合移位運算子
您可以在Dart中操縱數字的各個位,通常,您將使用這些按位和移位運算子和整數,
| 運算子 | 描述 |
|---|---|
& |
按位或 |
| |
按位與 |
^ |
按位異或 |
~expr |
按位取反 |
<< |
左移 |
>> |
右移 |
例如:
final value = https://www.cnblogs.com/cosecholand/p/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
7 . 條件運算式(三元運算式)
條件運算式 Dart有兩個運算子,條件運算式可以用來簡化 if-else陳述句,
- condition ? expr1 : expr2
如果condition為true,則計算expr1(并回傳其值); 否則,計算并回傳expr2的值,
- 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';
}
}
8 . 級聯運算子(鏈式編程)
級聯運算子( ..),允許您對同一物件進行多項操作,
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 = '[email protected]'
..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語法的一部分,
9 . 其他運算子
| 運算子 | 名稱 | 描述 |
|---|---|---|
() |
函式呼叫 | 表示函式呼叫 |
[] |
List訪問 | 參考串列中指定索引處的值 |
. |
成員訪問 | 訪問物件的成員屬性 |
?. |
條件的成員訪問 | 在不明確物件是否存在的情況下使用 ?. 訪問物件的成員 |
?. 運算子使用案例:
class Test {
num member = 1;
}
void main() {
var test = null;
print(test?.member); // 回傳null 不會拋出例外
test = new Test();
print(test?.member); // 回傳 1
}
二 . 流程控制
1 . 條件控制
A . if 和 else
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,
B . switch 和 case
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)塊,
2 . 回圈控制
回圈的分類

A . for 回圈和for…in回圈
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
B . while 和 do-while 回圈
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
C . break 和 continue
使用 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
3 . forEach()回圈
如果物件實作了 Iterable 介面的物件,可以使用 forEach()介面 (例如,list 或者 set)
main() {
List list = [123, '123', 'postbird'];
list.forEach((f)=> print(f));
}
輸出結果
123
123
postbird
4 . 斷言 Assert
如果 assert 陳述句中的布爾條件為 false , 那么正常的程式執行流程會被中斷, assert 陳述句只在開發環境中有效, 在生產環境是無效的;
// 確認變數值不為空,
assert(text != null);
// 確認變數值小于100,
assert(number < 100);
// 確認 URL 是否是 https 型別,
assert(urlString.startsWith('https'));
歡迎掃面下列二維碼關注“余弦的自留地”公眾微信號

萬物之中,希望至美
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/1880.html
標籤:Dart
