文章目錄
- 前言:dart語言簡介
- 一、變量
- 1.1.類型推導
- 1.2.預設值
- 1.3.Final 和 const修飾符
- 二、内建類型
- 2.1.資料類型
- 2.2.集合的相關操作
- 三、函數
- 3.1.函數的定義
- 3.2.箭頭函數
- 3.3.可選函數
- 3.4.參數預設值
- 3.5.匿名函數
- 3.6.詞法作用域
- 3.7.詞法閉包
- 3.7.傳回值問題
- 四、運算符
- 4.1.除法、整除、取模運算
- 4.2.條件運算符
- 4.3.級聯文法
- 五、循環語句
- 六、類和對象
- 6.1.類型的定義
- 6.2.不支援重載
- 6.3.抽象類
- 6.4.繼承
- 6.5.隐式接口
- 6.6.Mixin混入
- 七、泛型
- 7.1.List泛型
- 7.2.Map泛型
- 7.3.泛型方法
- 八、異步
- 九、中繼資料
前言:dart語言簡介
Dart是谷歌開發的計算機程式設計語言,後來被Ecma認定為标準 。它被用于web、伺服器、移動應用 和物聯網等領域的開發。它是寬松開源許可證下的開源軟體。
Dart是面向對象的、類定義的、單繼承的語言。它的文法類似C語言,可以轉譯為JavaScript,支援接口、混入、抽象類、具體化泛型、可選類型和sound type system 。
一、變量
1.1.類型推導
建立一個變量并初始化
var name = ‘Bob’;
動态類型(會關閉類型檢查)
dynamic name = ’ Bob’;
void main() {
dynamic name = 'Ronin';
print(name.runtimeType);
var name2 = 'Ronin';
print(name2.runtimeType);
name = 12;
print(name.runtimeType);
}
1.2.預設值
var s; //預設為null
print(s);
1.3.Final 和 const修飾符
如果你從未打算改變一個變量,那麼可以使用final和const修飾它
final name = 'zsh';
name = 'zms'; // 錯誤做法
const age = 20;
age = 19; // 錯誤做法
final和const的差別?
const在指派時, 指派的内容必須是在編譯期間就确定下來的
final在指派時, 可以動态擷取, 比如指派一個函數
getName() {
return "zsh";
}
main() {
final name1 = getName(); //正确
const name2 = getName(); //錯誤->需要執行函數才能取到值
}
二、内建類型
2.1.資料類型
整數類型 int a = 1;
浮點類型 double = 1.23;
字元串類型 String s = ‘abc’;
布爾類型 bool flag = true;
List集合類型 List list = [‘a’,‘b’,‘c’,‘d’];
字典(Map)類型 Map<String,String> map2 = {‘name’:‘zsh’,‘age’:‘20’};
main() {
int a = 1; //整數類型
print(a);
double b = 1.23; //浮點類型
print(b);
String s = 'abc'; //字元串類型
print('$s');
bool flag = true; //布爾類型
print(flag);
var str1 = ['a','b','c','d']; //List集合類型,使用類型推導定義
print('$str1 ${str1.runtimeType}');
List<String> list = ['a','b','c','d']; //List定義
print('$list ${list.runtimeType}');
var map1 = {'name':'zsh','age':'20'}; //字典類型,使用類型推導定義
print('$map1 ${map1.runtimeType}');
Map<String,String> map2 = {'name':'zsh','age':'20'};
print('$map2 ${map2.runtimeType}');
}
2.2.集合的相關操作
2.2.1、是以集合都支援length屬性
main() {
//1.length屬性
List<String> list = ['a','b','c','d'];
Map<String,String> map = {'name':'zsh','age':'20'};
print('${list.length}');
print('${map.length}');
}
2.2.2、添加,删除,包含操作
main() {
//1.length屬性
List<String> list = ['a','b','c','d'];
Map<String,String> map = {'name':'zsh','age':'20'};
//list
list.add('e'); //添加
print('$list');
list.remove('a'); //删除
print('$list');
bool s = list.contains('b'); //是否包含
print('$s');
/**
* ------------------------------------------------
*/
//map
Map<String,String> map2 = {'height':'10','weight':'20'};
map.addAll(map2); //添加一個map集合
print('$map');
map.remove('name'); //删除
print('$map');
print('${map.containsKey('age')}'); //包含
}
三、函數
3.1.函數的定義
傳回值 函數的名稱(參數清單) {
函數體
return 傳回值
}
String getString() {
return "zsh";
}
void main() {
String s = getString();
print('$s');
}
3.2.箭頭函數
void main() {
List<String> list = ['a','b','c','d'];
list.forEach((value)=> print('$value'));
}
3.3.可選函數
void copy(String name,{int age,int num }) {
print('$name $age $num');
}
main() {
copy('zsh');
copy('zsh',age:20);
copy('zsh',age: 20,num: 10);
}
3.4.參數預設值
參數可以有預設值, 在不傳入的情況下, 使用預設值
隻有可選參數才可以有預設值
copy(String name, {int age = 20, double height=1.3}) {
print('name=$name age=$age height=$height');
}
3.5.匿名函數
(functio(){
```
})()
3.6.詞法作用域
dart中的詞法有自己明确的作用域範圍,它是根據代碼的結構({})來決定作用域範圍的
優先使用自己作用域中的變量,如果沒有找到,則一層層向外查找。
var s = 'zsh';
main() {
font() {
print('$s');
}
font();
}
3.7.詞法閉包
閉包可以通路其詞法範圍内的變量,即使函數在其他地方被使用,也可以正常的通路。
main() {
makeAdder(num addBy) {
return (num i) {
return i + addBy;
};
}
var adder2 = makeAdder(2);
print(adder2(10)); // 12
print(adder2(6)); // 8
var adder5 = makeAdder(5);
print(adder5(10)); // 15
print(adder5(6)); // 11
}
3.7.傳回值問題
所有函數都傳回一個值。如果沒有指定傳回值,則語句傳回null;隐式附加到函數體。
main(List<String> args) {
print(foo()); // null
}
foo() {
}
四、運算符
4.1.除法、整除、取模運算
var num = 7;
print(num / 3); // 除法操作, 結果2.3333..
print(num ~/ 3); // 整除操作, 結果2;
print(num % 3); // 取模操作, 結果1;
4.2.條件運算符
Dart中包含一直比較特殊的條件運算符:expr1 ?? expr2
如果expr1是null,則傳回expr2的結果;
如果expr1不是null,直接使用expr1的結果。
var str = 'zsh';
var str= null;
var str= str ?? 'kobe';
print(str);
4.3.級聯文法
對一個對象進行連續的操作,這個時候可以使用級聯文法
class Shop{
String name;
void add() {
print("${name} is add");
}
void update() {
print("${name} is update");
}
}
main(List<String> args) {
final p1 = Shop();
p1.name = 'zsh';
p1.add();
p1.update();
final p2 = Shop()
..name = "zsh"
..add()
..update()
}
五、循環語句
if 和 else
for循環
while和do-while循環
break和continue
switch和case
六、類和對象
6.1.類型的定義
class 類名 {
類型 成員名;
傳回值類型 方法名(參數清單) {
方法體
}
}
class Csrf{
String name;
test() {
print('${name}');
}
}
6.2.不支援重載
Dart本身不支援函數的重載
class Csrf{
String name;
int age;
Csrf(String name, int age) {
this.name = name;
this.age = age;
}
}
6.3.抽象類
抽象方法,必須存在于抽象類中。
抽象類是使用abstract聲明的類。
abstract class AbstractContainer {
void updateChildren();
6.4.繼承
Dart中的繼承使用extends關鍵字,子類中使用super來通路父類。
父類中的所有成員變量和方法都會被繼承,,但是構造方法除外。
class Animal {
String name;
}
class Cat extends Animal {
}
6.5.隐式接口
預設情況下,定義的每個類都相當于預設也聲明了一個接口,可以由其他的類來實作(因為Dart不支援多繼承)
abstract class Dog{
method1();
}
abstract class Cat{
method2();
}
class Person implements Dog, Cat{
@override
method1() {
}
@override
method2() {
}
}
6.6.Mixin混入
Mixin混入的方式實作多繼承
mixin Cat{
method1() {
}
}
mixin Dog{
method2() {
}
}
class Person implements Cat, Dog{
}
七、泛型
7.1.List泛型
List list = [‘zsh’, ‘zms’, ‘user’];
var list = [‘zsh’, ‘zms’, ‘user’];
7.2.Map泛型
Map<String, String> map= {‘name’: ‘zsh’, ‘age’: ‘20’};
var map2 = <String, String>{‘name’: ‘zsh’, ‘age’: ‘20’};
7.3.泛型方法
T first(List ts) {
T tmp = ts[0];
return tmp;
}
main() {
var names = ['zsh', 'ss'];
var first = getFirst(names);
print('$first ${first.runtimeType}');//zsh String
}
T getFirst<T>(List<T> ts) {
return ts[0];
}
八、異步
Dart是單線程模型
九、中繼資料
class Todo {
final String who;
final String what;
Todo(this.who, this.what);
}
import 'todo.dart';
@Todo('seth', 'make this do something')
void doSomething() {
print('do something');
}