衆所周知,Dart是Flutter官方指定語言。
是一種適用於萬維網的開放源代碼編程語言,由Google主導開發,於2011年10月公開。它的開發團隊由Google Chrome瀏覽器V8引擎團隊的領導者拉爾斯·巴克主持,目標在於成爲下一代結構化Web開發語言。摘自Wiki算法
先拋出一段Dart代碼:express
// Define a function. printInteger(int aNumber) { print('The number is $aNumber.'); // Print to console. } // This is where the app starts executing. main() { var number = 42; // Declare and initialize a variable. printInteger(number); // Call a function. } 複製代碼
一個很是好用的Dart代碼測試平臺:
DartPad編程
Dart中也區分變量(var)和常量(const),以及final定義的只能設置一次的變量。瀏覽器
Dart中,萬物皆爲Object,在後面文章中,必定要注意這一點,把這一點刻在內心。
內置類型: markdown
int x = 1; var x = 0xFFF; var ps = int.parse('1') // var str = ps.toString() 複製代碼
double y = 1.1; var y = 2.3e10 var ps = double.parse('3.1415926') // var str = ps.toString() // var str = ps.toStringAsFixed(2) 複製代碼
Number類型的數值支持位運算(按位與/或/位移)app
var res = 2 << 1; // res is 4: 0010 << 1 = 0100 = 4 var res = 2 >> 1; // res is 1: 0010 >> 1 = 0001 = 1 var res = 3 | 8; // res is 11: 0011 | 1000 = 1011 = 11 var res = 3 & 8; // res is 0: 0011 & 1000 = 0000 = 0 複製代碼
var s1 = 'string1'; // s1 = string1 var s2 = "string2"; // s2 = string2 var s3 = '${s1.toUpperCase()} $s2'; // s3 = STRING1 string2 複製代碼
var str = ''; var res = str.isEmpty; // result is true var num = 0; var res = num < 0; //result is false var tmp; var res = tmp == null; // result is true var div = 0 / 0; var res = div.isNaN // result is true 複製代碼
(also known as arrays)
List能夠指定聲明類型,也能夠不聲明類型,不聲明的話其中存儲的數值爲varless
var list = [1, "1", true]; // or List list = [1, "1", true]; // or List<String> list = ["1", "1", "true"]; // 若是爲[1, "1", true]則會編譯報錯 // 另外一種類型聲明方式 List list = <String>[] // 固然也可使用const來定義常量,會覆蓋var的可變性 var list = const [1,2,3]; list.add(5); // 由於定義的List爲const常量,因此沒法賦值,運行報錯 // 能夠利用循環拼接array var list2 = [0, ...?list]; // list2 = [0, 1, "1", true] // or var list2 = [0, for(var i in list) '%i']; // list2 = [0, "1", "1", "true"] // 可使用判斷語句 bool flag = true; var list = [ 1,2,3, if (flag) 4 ]; // res is 1,2,3,4 複製代碼
Set:能夠認爲是去重的List,List是有序的,不惟一的,而Set是無序但惟一的。異步
// Set var country = {'China', 'USA', 'UK'} // 類型聲明 Set<String> country = {'China', 'USA', 'UK'} Set country = <String>{'China', 'USA', 'UK'} // 枚舉 for(var i in country) {} // Set中,i爲值 // 也可使用forEach country.forEach((val) { print('$val'); }); 複製代碼
Map:字典,由key value組成的數據,我的理解,List能夠簡單的理解爲key爲自增int的一個Map,一樣,Set能夠認爲是沒有Value只有Key的Mapasync
// Map var country = { 1: 'China', 2: 'USA' } // 類型聲明 Map<int, String> country = ...; Map country = <int, String>{}; // 枚舉 for(var i in country.keys) {print(country[i]);} // Map中,i爲key // 也可使用forEach country.forEach((key, val) { print('$key: $val'); }); 複製代碼
(for expressing Unicode characters in a string)
Dart中的特殊符號使用Runes來表示,是UTF-32編碼的字符串。編程語言
var input = new Runes('\u2665'); var input = '\u{1f44f}'; 複製代碼
// 待續
在Dart中,不存在private/public/protect的定義方式
若是須要使用私有變量,則在變量前增長_便可,如mine爲公共變量,而 _mine爲私有變量
var/const/final的區別:
// 帶返回值的方法 bool isTest() { return _isTest; } // override方法 isTest() { return true; } // 方法也能夠簡寫 bool isTest() => a == b; 複製代碼
Dart中的傳參有兩種形式,固定傳參和字典傳參
bool isSame(int a, [int b]) {return a == b;} bool isSame({@required int a, int b = 0}) {return a == b;} 複製代碼
區別:
// 調用方式 // bool isSame(int a, [int b]) {return a == b;} isSame(1, 2); // bool isSame({@required int a, int b = 0}) {return a == b;} isSame(b: 2, a: 1); 複製代碼
首先咱們要清楚的一點是:
Dart是單線程模型,相似於JavaScript,不包含主線程與子線程之分
那麼,Dart中如何實現異步呢?
Dart中使用了EventLoop的方式來進行異步操做
EventLoop讀取EventQueue,並進行處理,直到EventQueue爲空
而新增異步代碼時,則添加至EventQueue中
異步操做包含用戶輸入,點擊,Timer,文件IO,以及本身實現的異步事件。
Event和MicroTask:
這兩個應該說是借鑑了JavaScript中異步的實現方案
微任務永遠優先於Event執行,相似於:
setTimeout()的方法會放在宏觀任務中,相似於EventQueue
而Promise這種則會放在微觀任務中,相似於MicroTask
Dart中的異步任務可使用Future來插入EventQueue中
使用scheduleMicrotask函數來插入到MicrotaskQueue中
使用方法:
Future(() { // ...do sth }).then((res) => { // ...do sth }).then((res) => { // ...do sth }).whenComplete(() => { // finally }); async.scheduleMicrotask(() => { doTask() }); void doTask() { // ...do sth } 複製代碼
JIT(Just in time)爲實時編譯模式
AOT(Ahead of time)爲提早編譯模式
JIT通常在Debug中使用,用於實時調試與更新至最新代碼,但執行效率較低。
AOT通常用於發佈生產,編譯爲機器碼,執行效率高。
Dart的垃圾收集器是分代的,由兩個部分組成:新生代空間收集器、並行標記掃描收集器,還有一個重要的東西,就是調度器
Stateless
部件,雖然是會阻塞線程,但當與調度器結合使用,幾乎感知不到應用程序在運行期間的暫停,從本質上,新建的對象被分配給內存中的連續空間,在新建對象,會被分配到下一個可用空間,直到填充完分配的內存,但Dart使用的是一個凹凸的指針,因此這個過程很是快,分配新對象的空間由兩部分組成,任什麼時候候只用一半,當一半滿後,活動的對象將複製到另外一半空間中,一半就會所有清空,肯定對象是否活動,收集器以根對象開始,進行檢測他們引用的內容,這一部分相似於Java的可達性算法,有引用的對象將會被複制到另外一個空間中