####前言: 1.Dart 語言在2011年10月由 Google 發佈,並在2012年10月發佈第一個里程碑版本 M1。Dart 做爲一種結構化的Web開發語言,既讓人感受熟悉,又足夠靈活。既適用於快速原型開發,又適用於組織大型的代碼庫。既能夠用在桌面版和移動版的瀏覽器中,也能夠在服務器端使用。整體上說,Dart 語言是感受熟悉的而且符合程序員的直覺,特別是你已經掌握了 Java、JavaScript 等語言的話。程序員
2.Dart 是一門很特別的語言,(1)特性是可選類型。(2)Dart中的類和接口是統一的,類即接口,你能夠繼承一個類,也能夠實現一個類(接口),天然也包含了良好的面向對象和併發編程的支持。shell
3.編程語言並非孤立存在的,Dart也是這樣,他由語言規範、虛擬機、類庫和工具等組成: SDK:SDK 包含 Dart VM、dart2js、Pub、庫和工具。 Dartium:內嵌 Dart VM 的 Chromium ,能夠在瀏覽器中直接執行 dart 代碼。 Dart2js:將 Dart 代碼編譯爲 JavaScript 的工具。 Dart Editor:基於 Eclipse 的全功能 IDE,幷包含以上全部工具。支持代碼補全、代碼導航、快速修正、重構、調試等功能。編程
4.Dart 程序是從頂層的 main() 函數開始執行的。test.dart數組
main() {
print('hello world!');
}
複製代碼
在命令行中運行代碼:瀏覽器
dart hello.dart
複製代碼
或者以檢查模式運行:bash
dart --checked hello.dart
複製代碼
更多請參考《Dart的資源彙總》服務器
####基本語法閉包
1.介紹:Dart中全部的都是對象,涵蓋數字,函數,他們都是繼承Object,默認的值都是null。 2.支持的類型: (1)Numbers,裏面包含了int ,double (2)Strings (3)Booleans (4)List(也就是數組) (5)Maps 3.簡單的栗子: (1)數值:併發
num a=5;
num b=6;
print(a+b);
複製代碼
(2)字符串:app
//字符串賦值的時候,可使用單引號,也可使用雙引號
var exam1 = "Ok?";
//若是使用的是雙引號,能夠內嵌單引號
//固然,若是使用的是單引號,能夠內嵌雙引號,不然須要「\」轉義
//String exam2 = ‘It\’s ok!’;
String exam2 = "It's ok!";
//使用三個單引號或者雙引號能夠多行字符串賦值
var exam3 = '''Dart Lang Hello,World!''';
//在Dart中,拼接字符串用「+」,是能夠的,可是不推薦這樣使用,應該使用${param};
var name = "nihao";
var sex = "dsf";
print("name: ${sex}");
複製代碼
(3)布爾值:
bool ishello=false;
if(ishello){
print("nihao");
}else{
print
複製代碼
(4)容器: I、StringBuffer 說明:StringBuffer並非容器,按照官方的說法,StringBuffer能夠特別高效的構建多個字符串,另外,之前的用的add方法已經改成write;
StringBuffer sb = new StringBuffer();
sb.write("hello StringBuffer ");
sb ..write('nihao')..write('linghit');
print(sb.toString());
sb.clear();
print(sb.toString());
複製代碼
II、List 列表,也就是常說的數組 常見的添加、索引、刪除等方法以下
// 使用List的構造函數,也能夠添加int參數,表示List固定長度
//var vegetables = new List();
var persons = ['小智', '明兄'];
// 添加元素
persons.add('小約妹');
// 添加多個元素
persons.addAll(['小莫', '小污']);
// 獲取List的長度
print(persons.length);
// 利用索引獲取元素
print(persons[0]);
// 查找某個元素的索引號
print(persons.indexOf('小莫'));
// 利用索引號刪除某個元素
var appleIndex = persons.indexOf('小莫');
persons.removeAt(appleIndex);
// 刪除全部的元素
persons.clear();
print(persons.length);
複製代碼
你可使用sort()對List的元素進行排序
而且必須制定比較兩個對象的函數,函數的返回值中
return <0 表示小於,0表示相同,>0表示大於
複製代碼
III、Set 集合在Dart中無序,而且每一個元素具備惟一性 由於它是無序的,所以你不能像List那樣用索引來訪問元素 這個就不細說了,吃瓜觀衆本身下去看看
IV、Map
映射,也有人稱之爲字典 Map是一個無序的鍵值對容器
// Map的聲明 (以往不一樣的點)
var initMap1 = {
'one' : 1,
'two' :2,
'three' : 3
};
var initMap2 = new Map();
// 指定鍵值對的參數類型
var initMap3 = new Map<int, String>();
print(initMap["one"]);
複製代碼
V、迭代:
//若是迭代的對象是容器,那麼可使用forEach或者for-in
var diedai = [0, 1, 2];
diedai.forEach((x) => print(x));//forEach的參數爲Function
for(var x in diedai) {
print(x);
}
複製代碼
介紹:首先,函數也是對象,當沒有指定返回值的時候,函數返回null I、簡單應用
String hello(String name)
{
return 'Hello $name!';
複製代碼
Dart語言中,參數類型也是可選的
String hello(name)
{
return 'Hello $name!';
複製代碼
建議仍是定義好,輸入的類型以及輸出的類型,方便後人閱讀和調用
若是函數只是簡單的返回一個表達式的值,可使用箭頭語法 =>expr; 它等價於{return expr;}
hello(name) => 'Hello $name!';
複製代碼
Dart中匿名函數的寫法 (name)=>’Hello $name!’;
因而能夠以下定義匿名函數
var hello = (name)=>'Hello $name!';
複製代碼
II、函數別名:
typedef int Add(int a, int b);
int Subtract(int a, int b) => a - b;
void main()
{
print(Substract is Function);
print(Substract is Add);
}
上面代碼的命名感受有點誤導人的感受
若是兩個函數的參數和返回值都同樣
那麼is操做符就會返回true
複製代碼
III、函數的閉包 下面的代碼有一點須要注意 初始化變量的時候,參數對應的是函數的參數num n 調用函數類型變量的時候,參數對應的是返回值中的參數num i
Function makeSubstract(num n)
{
return (num i) => n - i;
}
void main()
{
var x = makeSubstract(5);
print(x(2));
}
複製代碼
下面這段頗有意思的代碼 須要反應過來一件事:Dart中函數也是對象 下面的代碼應該看得明白,以後會講控制語句以及容器
var callbacks = [];
for (var i = 0; i < 3; i++) {
// 在列表 callbacks 中添加一個函數對象,這個函數會記住 for 循環中當前 i 的值。
callbacks.add(() => print('Save $i'));
}
callbacks.forEach((c) => c()); // 分別輸出 0 1 2
複製代碼
IV、可選參數: Dart中支持兩種可選參數:命名可選參數和位置可選參數 但兩種可選不能同時使用
命名可選參數使用大括號{},默認值用冒號: 位置可選參數使用方括號[],默認值用等號=
FunX(a, {b, c:3, d:4, e})
{
print('$a $b $c $d $e');
}
複製代碼
在命名可選參數的函數中,大括號外的a爲必填參數 大括號內的參數能夠指定0個或多個 而且與順序無關,在調用函數的時候須要指明參數名 沒有賦值的參數值爲null
FunY(a, [b, c=3, d=4, e])
{
print('$a $b $c $d $e');
}
複製代碼
在位置可選參數的函數中,大括號內的參數能夠指定0個或多個 在調用的時候參數值會依次按順序賦值
void main()
{
FunX(1, b:3, d:5);
FunY(1, 3, 5);
}
複製代碼
3、操做符和流程語句:(和其餘語言差很少) 一、取整:
int a = 3;
int b = 2;
print(a~/b);//輸出1
複製代碼
二、級聯: 當你要對一個單一的對象進行一系列的操做的時候 可使用級聯操做符 ..
class Person {
String name;
String sex;
int age;
setAge(num age) =>this.age=age;
String toString() => 'Name:$name\nSex:$sex\nage:$age';
}
void main() {
Person p = new Person();
p ..name = 'Xq'
..sex="nan"
..setAge(20);
print(p);
}
複製代碼
三、if語句沒有多大的區別: If語句的判斷條件爲bool值,用法和大多語言同樣
if(2){
print("true");
}else{
print("false");
}
複製代碼
switch:也差很少;swith的參數能夠是num,或者String
4.循環:
for(); while(); do{}while();沒太多變化
複製代碼
五、異常處理: 在Dart中能夠拋出非空對象(不只僅是Exception或Error)做爲異常
throw new ExpectException('值必須大於0!');
throw '值必須大於0!';
複製代碼