Dart
是谷歌在 2011 年推出的編程語言,是一種結構化Web
編程語言,容許用戶經過Chromium
中所整合的虛擬機(Dart VM
)直接運行Dart
語言編寫的程序,免去了單獨編譯的步驟Dart VM
更快的性能與較低的啓動延遲中受益Dart
從設計之初就爲配合現代web
總體運做而考慮,開發團隊也同時在持續改進Dart
向JavaScript
轉換的快速編譯器Dart VM
以及現代JavaScript
引擎(V8 等)都是Dart
語言的首選目標平臺Dart
語言和Swift
語言有不少的類似之處在學習Dart
語言以前, 先了解一些Dart
相關的一些概念:web
O-Objective
中有一切皆對象的說法, 這句話在Dart
中一樣適用
Dart
中 甚至連 數字、方法和null
都是對象Object
類Dart
動態類型語言, 儘可能給變量定義一個類型,會更安全,沒有顯示定義類型的變量在debug
模式下會類型會是dynamic
(動態的)Dart
會在運行以前解析你的全部代碼,指定數據類型和編譯時的常量,能夠提升運行速度Dart
中的類和接口是統一的,類即接口,你能夠繼承一個類,也能夠實現一個類(接口),天然也包含了良好的面向對象和併發編程的支持Dart
函數
main()
)Dart
支持頂級變量,以及依賴於類或對象(靜態變量和實例變量)變量。實例變量有時被稱爲域或屬性Dart
不具有關鍵字public
,protected
和private
。若是一個標識符如下劃線(_)
開始,那麼它和它的庫都是私有的以上只是大概說明了一些
Dart
中的重要概念, 具體的語法使用, 請看下文編程
Dart
的註釋分爲3種:單行註釋、多行註釋、文檔註釋安全
//
開頭/*
開頭,以*/
結尾///
或者/**
開頭Dart
語句Dart
中,用分號來結束語句是必須的, 不加分則會報錯Dart
的編程規範,使用2個空格來縮進print(Object)
使用var
、Object
或dynamic
關鍵字聲明變量bash
var name = 'name';
dynamic name1 = 'name1';
String name2 = 'name2';
// 變量的賦值
name = 'a';
name1 = 'a1';
name2 = 'a2';
複製代碼
未初始化的變量的初始值爲null
, 即便是數字也是如此,由於在Dart
中數字也是一個對象微信
var name;
dynamic name1;
String name2;
複製代碼
可選類型併發
在聲明變量的時候,你能夠選擇加上具體的類型:less
String name2 = 'name2';
複製代碼
var
而不是具體的類型來定義局部變量final
或者const
final
變量只能賦值一次const
變量是編譯時常量final
可是不能是const
final
修飾的變量(即常量2)編程語言
final age = 10;
final int age1 = 20;
// final修飾的變量不能從新賦值, 會報錯
age = 20;
age1 = 30;
複製代碼
const
變量爲編譯時常量const
定義常量,請定義爲static const
const
定義的常量, 能夠直接給定初始值,也可使用其餘const
變量的值來初始化其值// const
const m1 = 12;
const double m2 = 23;
const m3 = m1 + m2;
// final修飾的變量不能從新賦值, 會報錯
m1 = 10;
m2 = 1.02;
複製代碼
Dart
支持經常使用的算術操做符ide
操做符 | 解釋 |
---|---|
+ |
加號 |
– |
減號 |
-expr |
負號 |
* |
乘號 |
/ |
除號(值爲double 類型) |
~/ |
除號,可是返回值爲整數 |
% |
取模 |
示例:函數
assert(2 + 3 == 5);
assert(2 - 3 == -1);
assert(2 * 3 == 6);
assert(5 / 2 == 2.5); // 結果是double類型
assert(5 ~/ 2 == 2); // 結果是integer類型
assert(5 % 2 == 1); // 餘數
複製代碼
Dart
還支持自加自減操做
++var
: 先自加在使用var++
: 先使用在自加--var
: 先自減在使用var--
: 先使用在自減示例
var a = 0, b = 0;
b = a++;
print('a = $a, b = $b'); //a = 1, b = 0
b = ++a;
print('a = $a, b = $b'); //a = 2, b = 2
b = a--;
print('a = $a, b = $b'); //a = 1, b = 2
b = --a;
print('a = $a, b = $b'); //a = 0, b = 0
複製代碼
運算符 | 含義 |
---|---|
== |
等於 |
!= |
不等於 |
> |
大於 |
< |
小於 |
>= |
大於等於 |
<= |
小於等於 |
==
操做符identical()
方法external bool identical(Object a, Object b);
複製代碼
類型斷定操做符是在運行時斷定對象類型的操做符
操做符 | 解釋 |
---|---|
as |
類型轉換 |
is |
若是對象是指定的類型返回 True |
is! |
若是對象是指定的類型返回 False |
obj
實現了 T
的接口, obj is T
纔是true
。例如obj is Object
老是true
as
操做符把對象轉換爲特定的類型as
它當作用is
斷定類型而後調用 所斷定對象的函數的縮寫形式if (emp is Person) { // Type check
emp.firstName = 'Bob';
}
// 上面代碼可簡化爲
(emp as Person).firstName = 'Bob';
複製代碼
注意: 若是
emp
是null
或者不是Person
類型,則第一個示例使用is
則不會執行條件裏面的代碼,而第二個狀況使用as
則會拋出一個異常; 因此在不缺定emp
是否爲空的狀況下, 安全起見, 建議使用第一種方式
= |
–= |
/= |
%= |
>>= |
^= |
+= |
*= |
~/= |
<<= |
&= |
示例:
// 給 a 變量賦值
a = value;
// 複合賦值操做符
a += b; // 等價於a = a + b;
// 若是 b 是 null,則賦值給 b;
// 若是不是 null,則 b 的值保持不變
b ??= value;
// 以下所示:
var s;
print(s); // null
print(s ?? 'str'); // str
s ??= 'string';
print(s); // string
複製代碼
可使用邏輯操做符來 操做布爾值:
!expr
: 對錶達式結果取反(true 變爲 false ,false 變爲 true)||
: 邏輯 OR&&
: 邏輯 ANDcondition ? expr1 : expr2
// 若是 condition 是 true,執行 expr1 (並返回執行的結果); 不然執行 expr2 並返回其結果
expr1 ?? expr2
// 若是 expr1 是 non-null,返回其值; 不然執行 expr2 並返回其結果
複製代碼
示例:
String toString() => msg ?? super.toString();
// 上面的代碼等價於
String toString() => msg == null ? super.toString() : msg;
// 等價於
String toString() {
if (msg == null) {
return super.toString();
} else {
return msg;
}
}
複製代碼
級聯操做符 (..
) 能夠在同一個對象上 連續調用多個函數以及訪問成員變量。 使用級聯操做符能夠避免建立 臨時變量, 而且寫出來的代碼看起來 更加流暢
querySelector('#button') // Get an object.
..text = 'Confirm' // Use its members.
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
複製代碼
第一個方法querySelector()
返回了一個selector
對象。 後面的級聯操做符都是調用這個對象的成員, 並忽略每一個操做 所返回的值
// 上面代碼等價於
var button = querySelector('#button');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
複製代碼
級聯調用也能夠嵌套:
final addressBook = (new AddressBookBuilder()
..name = 'jenny'
..email = 'jenny@example.com'
..phone = (new PhoneNumberBuilder()
..number = '415-555-0100'
..label = 'home')
.build())
.build();
複製代碼
注意:嚴格來講,兩個點的級聯語法不是一個操做符, 只是一個Dart
特殊語法。
在Dart
中可使用下面的語句來控制Dart
代碼的流程:
if-else
for
和for-in
while
和do-while
switch
assert
break
和continue
try-catch
和throw
if-else
Dart
支持if
語句以及可選的else
if (a == 0) {
print('a = 0');
} else if (a == 1) {
print('a = 1');
} else {
print('a = 2');
}
複製代碼
注意點: 上述代碼中的條件控制語句的結果必須是布爾值
可使用標準的for
循環, List
和Set
等實現了Iterable
接口的類還支持for-in
形式的遍歷:
var arr = [0, 1, 2];
// for循環
for (var i = 0; i < arr.length; i++) {
print(arr[i]);
}
// for-in循環
for (var x in arr) {
print(x);
}
複製代碼
While
和do-while
// while 循環在執行循環以前先判斷條件是否知足:
while (c == 0) {
print('c = $c');
}
// 而do-while循環是先執行循環代碼再判斷條件:
do {
print('c = $c');
} while (c == 0);
複製代碼
Break
和continue
使用break
來終止循環:
while (true) {
if (shutDownRequested()) break;
processIncomingRequests();
}
複製代碼
使用continue
來開始下一次循環
for (int i = 0; i < candidates.length; i++) {
var candidate = candidates[i];
if (candidate.yearsExperience < 5) {
continue;
}
candidate.interview();
}
複製代碼
Switch
Dart
中的Switch
語句使用 ==
比較 integer
、string
、或者編譯時常量case
語句都必須有一個break
語句continue
、throw
或者return
來結束非空case
語句case
語句匹配的時候,可使用default
語句來匹配這種默認狀況case
語句能夠有局部變量,局部變量只有在這個語句內可見var command = 'OPEN';
switch (command) {
case 'CLOSED':
print('CLOSED');
break;
case 'APPROVED':
print('APPROVED');
// break;
// 這裏非空的case, 沒有break會報錯
case 'DENIED':
// 這裏空的case, 能夠不要break
case 'OPEN':
print('OPEN');
continue nowClosed;
//若是你須要實現這種繼續到下一個 case 語句中繼續執行,則能夠 使用 continue 語句跳轉到對應的標籤(label)處繼續執行:
nowClosed:
case 'PENDING':
print('PENDING');
break;
default:
print('default');
}
複製代碼
assert
語句中斷代碼的執行assert
方法的參數能夠爲任何返回布爾值的表達式或者方法。true
,斷言執行經過,執行結束false
,斷言執行失敗,會拋出一個異常// Make sure the variable has a non-null value
assert(text != null);
// Make sure the value is less than 100
assert(number < 100);
// Make sure this is an https URL
assert(urlString.startsWith('https'));
複製代碼
注意:斷言只在開發模式下運行有效,若是在生產模式 運行,則斷言不會執行
這篇文章的簡單介紹就到這裏了, 下一篇將會記錄
Dart
的基本數據類型
歡迎您掃一掃下面的微信公衆號,訂閱個人博客!