dart學(xué)習(xí)(和js比較):
在線dart環(huán)境: https://dartpad.cn/
聲明變量:
多了一個 final 和const幾乎一樣克懊。只是 const 要求不能不給初值铝穷,而final是可以不給初值的,沒給初值的final可以進行賦值嚎朽,賦值了之后就無法再改變。
沒有l(wèi)et鲤拿,var 替代了let蚂四。 但是一旦給變量賦值后 它的類型就是確定的了,不能再改變跨琳。
var ce = 1;
ce = 'ssss';
// ↑ 這里報錯: A value of type 'String' can't be assigned to a variable of type 'int'.
多了 一種 dynamic 動態(tài)的自点,如果是dynamic的就能 賦值成一種類型后 再改變。
dynamic ce = 1;
ce = 'ssss';
// 沒毛病
類型
1脉让、多了一種 Rune類型(表示Unicode字符)
2桂敛、Map Set多了幾種表示的方式。
Set:
var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
// 形同:
var halogens1 = Set<String>();
halogens1.add('fluorine')
// 形同:
var halogens2 = <String>{};
halogens2.add('ssss');
Map:
var nMap = {};
// 形同:
var nMap1 = new Map<dynamic,dynamic>();
// 假如
var mMap = { 1:'test' };
// 形同:
var mMap1 = Map<Number, String>();
值得注意的是溅潜,dart中沒有js里隱式的類型轉(zhuǎn)換埠啃,所以只有bool類型能作為是否判斷
函數(shù):
1、命名參數(shù):聲明函數(shù)的時候給參數(shù)加上大括號(類似于react組件參數(shù)的寫法)伟恶。在調(diào)用該函數(shù)時碴开,可以用 參數(shù)名稱:變量 的方式去指定參數(shù)。
(這樣就避免了要記第幾個參數(shù)是啥博秫,只要記得名字就好潦牛,更方便閱讀。當然這樣是不是也就意味著沒有像js函數(shù)參數(shù)上的解構(gòu)呢挡育?)
如果函數(shù)使用了命名參數(shù)巴碗,調(diào)用時必須加上參數(shù)名稱。
String add({String ce, String le} ){
return ce + le;
}
void main() {
// 輸出: bs
print(add(le:'s',ce:'b'));
}
2即寒、可選參數(shù): 如果把參數(shù)用[]中括號括起來 就能設(shè)為可選的參數(shù)橡淆。
沒法和命名參數(shù)合用
3、參數(shù)默認值和js一樣用 = 設(shè)置
4母赵、函數(shù)不再用 function 聲明逸爵,而是用返回值類型 來替代function的位置(和java一樣)
5、匿名函數(shù):和js一樣可以用箭頭函數(shù)凹嘲,同時甚至更進一步——箭頭都省略师倔。
var list = ['apples', 'bananas', 'oranges'];
list.forEach((item) {
print('${list.indexOf(item)}: $item');
});
list.forEach((item) => print('${list.indexOf(item)}: $item'));
6、函數(shù)內(nèi)是可以再聲明函數(shù)的周蹭,這點和js相同和java不同疲恢。
7、有閉包的概念瓷胧。
/// 返回一個函數(shù)显拳,返回的函數(shù)參數(shù)與 [addBy] 相加。
Function makeAdder(num addBy) {
return (num i) => addBy + i;
}
void main() {
// 創(chuàng)建一個加 2 的函數(shù)搓萧。
var add2 = makeAdder(2);
// 創(chuàng)建一個加 4 的函數(shù)萎攒。
var add4 = makeAdder(4);
assert(add2(3) == 5);
assert(add4(3) == 7);
}
8、函數(shù)返回值矛绘,js默認返回undefined耍休,而dart默認返回null。
運算符
1货矮、 ~/ 除以并取整羊精。
print(10 ~/ 2 ); // 5
print(11 ~/ 2 ); // 5
print(12 ~/ 2 ); // 6
2、只有== 沒有===
3囚玫、as is is!
用于類型判斷 is is! 類似于js typeof喧锦。(只是類似)
而 as 則類似于一個語法糖:如果 is 則做什么:
if (emp is Person) {
// Type check
emp.firstName = 'Bob';
}
// 形同:
(emp as Person).firstName = 'Bob';
4、-= += /= %= js中也有或者即將出現(xiàn)在ES標準中的運算
5抓督、三元運算符 燃少? : 和js中一樣。
6铃在、?? 用于表示 如果前面的為null 則給出后面的
String playerName(String name) => name ?? 'Guest';
// 形同
String playerName(String name) => name != null ? name : 'Guest';
// 形同
String playerName(String name) {
if (name != null) {
return name;
} else {
return 'Guest';
}
}
7阵具、級聯(lián)運算符 (..) 表示往上追溯到第一級 語句返回的對象。
querySelector('#confirm') // 獲取對象定铜。
..text = 'Confirm' // 調(diào)用成員變量阳液。
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
// 形同
var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
8、?. 和js一樣
控制語句
1揣炕、assert方法: 只在測試環(huán)境有效的斷言帘皿,如果第一個參數(shù)為false,那么會打印第二個參數(shù)(String)畸陡,并終止程序鹰溜,如果第一個參數(shù)為true,啥都不發(fā)生丁恭。
異常
1曹动、catch語句前可以用on XXX catch(e){} 來捕獲特定類型的錯誤。
try {
breedMoreLlamas();
} on OutOfLlamasException {
// 一個特殊的異常
buyMoreLlamas();
} on Exception catch (e) {
// 其他任何異常
print('Unknown exception: $e');
} catch (e) {
// 沒有指定的類型涩惑,處理所有異常
print('Something really unknown: $e');
}
類
1仁期、new 關(guān)鍵詞變成可選
2、注意空安全問題竭恬。 存在late關(guān)鍵字 表示延遲初始化跛蛋。
3、對象的runtimeType 可以在運行時獲取對象的類型
4痊硕、同樣存在super關(guān)鍵字赊级,但是使用上有所不同
5、私有屬性用下劃線表示岔绸,只能在同一文件(庫)中訪問 -- 和java prorect保護類型 類似但又不完全類似
6理逊、構(gòu)造參數(shù)后 會有一個初始化列表的位置來初始化