一.Dart 簡介
Dart是谷歌發布的一門面向對象的開源編程語言,誕生於2011年10月10日,Dart是一種“結構化的Web編程”語言,在所有現代的瀏覽器和環境中提供高性能。
Dart主要用途分為三種:
- Flutter開發移動應用
- Dart webdev 開發瀏覽器應用
- Dart VM開發腳本或者服務器應用
下面即將開啟Dart學習之旅
二.Dart語法
重要概念(Important concepts)
在學習Dart的時候,請牢記下面的一下事實和概念:
- 所有能夠使用變量引用的都是對象,每個對象都是一個類的實例。在Dart中甚至連數字、方法和null都是對象。所有的對象都繼承與Object類。
- 雖然Dart是強類型,但由於Dart可以推斷類型,所以類型注釋是可選的,當您不需要明確的類型時,可以使用dynamic類型。
- Dart支持泛型類型,像List<int>(整數類型)或者List<dynamic>(任何類型的對象)
- 支持頂層函數(例如main()),以及綁定到類或者對象的函數(分別是靜態方法和實例方法)。您還可以在函數中創建函數(嵌套函數或本地函數)。
- 類似地,Dart支持頂級變量,以及綁定到類或對象的變量(靜態變量和實例變量)。實例變量有時稱為字段或屬性
- 與Java不同,Dart沒有關鍵字public、proteched、private。如果標識符以下划線(_)開頭,則它是其庫的私有標識符。
- 標識符可以以字母或下划線開頭,然后這些字符和數字的任意組合
- Dart同時具有表達式和語句。例如,條件表達式條件 ? expr1 : expr2 ; 最后得到的值為expr1 或expr2,將其與沒有值得if-else 語句進行比較,語句通常包含一個或多個表達式,但表達式不能直接包含語句。
- Dart工具可以報告兩種類型的問題:警告和錯誤,警告只表明您的代碼可能無法工作,但它們不會阻止您的程序執行。錯誤可以是編譯時的,也可以是運行時的。編譯時的錯誤完全阻止了您的程序執行,運行時錯誤會導致在執行代碼時引發異常。
1. 變量
變量是一個引用,根據Dart中“萬物皆對象”原則,即變量存儲的都是對象的引用,或者說它們都是指向對象
1) 聲明變量
聲明可以有兩種方式,一種是不指定類型,即使用var關鍵字
var name = "Bob";
另一種是明確指定類型(Optional types)
String name = "Bob";
因為有類型推導,所以兩種實現效果一樣,官方推薦在函數內的本地變量盡量使用var聲明。
在變量類型並不明確的情況下,可以使用dynamic關鍵字
dynamic name = "Bob";
2 ) 默認值
沒有初始化的變量自動獲取一個默認值為null。類型為數字的變量如果沒有初始化其值也是null,不要忘記數字類型也是對象。
var name; var age; print(name); // null print(age); // null
2. Final與const
如果一個變量的值不再修改,則使用final或者const代替var。
一個final變量只能賦值一次;一個const變量是編譯時常量,const變量默認為final變量。頂層final變量與類變量在首次訪問時才執行初始化。需要注意的是,實例變量可以為final,但是不能是const
// 常量 const bar = 1000; // 常量計算也是常量 const atm = 0.15 * bar;
const 關鍵字不僅僅只能用來定義常量,也可以用來創建不變的值,還能定義構造函數為const類型的,這中類型的構造函數創建的對象是不可改變的。任何變量都可以有一個不變的值。
var foo = const[1,2,3]; final baz = const[2,3,4];
3. 內置類型
Dart內置支持下面這些類型
- numbers
- string
- boleans
- lists(或稱arrays)
- sets
- maps
- runes(用於在字符串中表示Unicade字符)
- symbols
1) Numbers(數值)
Dart支持兩種類型的數字
int 整數值、double (雙精度) 浮點數,兩者都是num的子類。Num類型定義了基本的操作符,例如+-*/,還定義了abs()、ceil()、和floor()等函數。
2) 字符串(String)
Dart字符串使用單引號或者雙引號來創建字符串;
String s1 = 'Single quotes work well for string literals.'; String s2 = "Double quotes work just as well.";
可以使用+操作符來把多個字符串連接為一個,也可以把多個字符串放到一起實現同樣的功能
String s3 = 'String ''concatenation' ' works even over line breaks.'; String s4 = 'The + operator ' + 'work,as well.'; print(s3); print(s4);
輸出結果:
其中官方不建議使用+操作符連接字符串。
使用三個單引號或者雙引號也可以創建多行字符串對象
String s5 = ''' You can create multi-line strings like this one. '''; String s6 = """ This is alse a multi-line string. """; print(s5); print(s6);
輸出結果:
通過提供一個r前綴可以創建一個“原始raw”字符串
var s = r"In a raw string, even \n isn't special."; var ss = "In a raw string, even \n isn't special."; print(s); print(ss);
輸出結果:
可以在字符串中使用表達式,用法為:${expression}。如果表達式是一個標識符,可以省略{},如果表達式的結果為一個對象,則Dart會調用對象的toString()函數來獲取一個字符串
var str = 'string interpolation'; if("Dart has $str ,which is very handy." == "Dart has string interpolation ,which is very handy."){ print("yes"); } if('Dart has ${str.toUpperCase()} ,which is very handy.' == 'Dart has STRING INTERPOLATION ,which is very handy.'){ print("upperCase is yes"); }
3) Booleans(布爾值)
為了代表布爾值,Dart有個名為bool的類型。只有兩個對象是布爾類型的:true和false所創建的對象,這兩個對象也都是編譯時常量。
當Dart需要一個布爾值的時候,只有true對象才被認為是true,所有其他的值都是false,這點和javascript不一樣,像1,“aString”以及someObject等值都認為是false。
如果在javascript中運行,則會打印Bob,在javascript中name是非null對象,所以為true,但在Dart的生產模式下運行,則不打印任何內容,原因是name != true; name被轉換為false了。如果在Dart檢查模式運行,代碼會拋出異常,表示變量name不是一個布爾值。
4) Lists(列表)
也稱array(有序集合)是所有編程語言中最常見的集合類型。在Dart中數組就是List對象。所以通常稱之為lists。
var list = [1,2,3]; print("list長度為:"+list.length.toString()); //list長度為:3 print("第二個數值為:"+list[1].toString()); //第二個數值為:2 list[1] = 1; print("修改后,第二個數值為:"+list[1].toString()); //修改后,第二個數值為:1
list可以使用const關鍵字,可以定義一個不變的list對象(編譯時常量)
var constantList = const[1,2,3];
定義一個空的可變的list,盡量使用[],如(var points = []),如果您想創建一個不可變的list,護着其他自定義類型的集合,可以使用構造函數。
如果有必要還可以提供泛型類型
var points = <Point>[];
5 ) Maps
通常來說,Map是一個鍵值對相關的對象。鍵和值可以是任何類型的對象。每個鍵出現一次,而一個值則可以出現多次。
下面是一些簡單實例
var gifts = { 'frist':'partridge', 'second':'turtldoves', 'fifth':'golden rings' }; var nobleGases = { 2 : 'helium', 10: 'neon', 18: 'argon', };
使用map構造函數也可以實現同樣的功能:
var gifts2 = new Map(); gifts['first'] = 'partridge'; gifts['second'] = 'turtledoves'; gifts['fifth'] = 'golden rings'; var nobleGases2 = new Map(); nobleGases[2] = 'helium'; nobleGases[10] = 'neon'; nobleGases[18] = 'argon';
往map中添加新的鍵值對和在javascript中用法一樣
gifts['fourth'] = "calling birds"; // 添加新的鍵值對
獲取map中的對象
print(gifts['fourth']); //calling birds
使用length來獲取map中鍵值對的數目:
print("gifts中總數為:"+gifts.length.toString()); //gifts中總數為:4
同樣使用const可以創建一個編譯時常量的map
final constantMap = const { 2: 'helium', 10: 'neon', 18: 'argon', };