時代背景
Dart是谷歌開發(fā)的計算機(jī)編程語言羹应,后來被Ecma (ECMA-408)認(rèn)定為標(biāo)準(zhǔn)橙数。它被用于web瘪吏、服務(wù)器蔑祟、移動應(yīng)用和物聯(lián)網(wǎng)等領(lǐng)域的開發(fā)晌区。它是寬松開源許可證(修改的BSD證書)下的開源軟件寞埠。
Dart是面向?qū)ο蟮钠ㄖ谩㈩惗x的、單繼承的語言仁连。它的語法類似C語言蓝角,可以轉(zhuǎn)譯為JavaScript,支持接口(interfaces)、混入(mixins)使鹅、抽象類(abstract classes)颇象、
具體化泛型(reified generics)、可選類型(optional typing)和sound type system.dart語言最早出現(xiàn)在2011年10月10至12日在丹麥奧爾胡斯舉行的GOTO大會上并徘,
剛發(fā)布時遣钳,并無多大波瀾,直到2015年5月Dart開發(fā)者峰會上麦乞,亮相了基于Dart語言的移動應(yīng)用程序開發(fā)框架Sky蕴茴,后更名為Flutter,那時正基于移動端開發(fā)由
應(yīng)用開發(fā)朝混合開發(fā)方向轉(zhuǎn)變時期,flutter開始慢慢發(fā)展姐直,在2018年2月27日在2018世界移動大會公布了flutter的Beta1版本以后倦淀,不到一年的時間,裂變到了1.0版本声畏,
并且github幾個月時間內(nèi)裂變到了50kstar+的成績撞叽,國內(nèi)大廠紛紛跟進(jìn)dart和flutter開發(fā),阿里的閑魚App在谷歌大會后不久插龄,率先大量使用flutter改造客戶端愿棋,
甚至在不久之前還開源了基于flutter的開源框架Fish Redux,而flutter的社區(qū)以及論壇均牢,以及github每天的活躍度快速增高糠雨,sdk更新的速度也相當(dāng)可觀,所以可以說現(xiàn)在已經(jīng)到了全民學(xué)習(xí)flutter的時代
Dart入坑前必須要知道的點(diǎn):
在Dart中所有的類都繼承于Object類徘跪,所有可以使用的變量引用的都是對象類型(即都為類的實(shí)例對象)甘邀,并且數(shù)值類型、方法以及null都是對象垮庐,真正意義上的完全面向?qū)ο蟮恼Z言
在開發(fā)過程中松邪,可以忽略對象的類型,默認(rèn)未指定類型的變量為dynamic(動態(tài)類型),并且可以使用靜態(tài)類型修飾更明確表達(dá)開發(fā)的意圖
Dart 在運(yùn)行之前會先解析你的代碼哨查,你可以通過使用 類型或者編譯時常量來幫助 Dart 去捕獲異常以及 讓代碼運(yùn)行的更高效
Dart 支持頂級方法 (例如
main()
)逗抑,同時還支持在類中定義函數(shù),(靜態(tài)函數(shù)和實(shí)例函數(shù))解恰。 你還可以在方法中定義方法 (嵌套方法或者局部方法)Dart 還支持頂級變量锋八,以及 在類中定義變量(靜態(tài)變量和實(shí)例變量)浙于。 實(shí)例變量有時候被稱之為域(Fields)或者屬性(Properties)
和 Java 不同的是护盈,Dart 沒有
public
、protected
羞酗、 和private
關(guān)鍵字腐宋。如果一個標(biāo)識符以 _ 開頭,則表示當(dāng)前對象(庫或者類)是私有的,無法被外部直接引用標(biāo)識符可以以字母或者 _ 下劃線開頭胸竞,后面可以是 其他字符和數(shù)字的組合
Dart 工具可以指出兩種問題:警告和錯誤欺嗤。 警告只是說你的代碼可能有問題, 但是并不會阻止你的代碼執(zhí)行卫枝。 錯誤可以是編譯時錯誤也可以是運(yùn)行時錯誤煎饼。遇到編譯時錯誤時,代碼將 無法執(zhí)行校赤;運(yùn)行時錯誤將會在運(yùn)行代碼的時候?qū)е乱粋€異常
表達(dá)式 expression 和 語句 statement 是有區(qū)別的,不是任何時候都是一樣的情況,應(yīng)當(dāng)注意區(qū)分情況對待
注:Dart語言在某種意義上是完全站在巨人的肩膀為時代背景冲簿,并且早期被谷歌寄予厚望拦焚,希望能借此挑戰(zhàn)js在web端的地位,所以Dart可以說是集百家之長浑测,
C++翅阵,Java,Kotlin迁央,Python以及Java Sripct五大語言的優(yōu)良特性于一身掷匠,但也因此失去了屬于Dart這門語言的個性和風(fēng)格,雖然僅僅是單線程運(yùn)行的語言岖圈,
限制了Dart崛起的勢頭槐雾,但是因為有了這些優(yōu)秀的特性支持,使得Dart依然是個值得推薦學(xué)習(xí)的面向?qū)ο笳Z言(接下來可能會從Dart關(guān)鍵字幅狮,類型募强,異常處理,
異步支持等常見特性和java或者js進(jìn)行比較學(xué)習(xí)Dart語言)
Dart中的關(guān)鍵字(截止至Dart 2.x版本)
Dart中的關(guān)鍵字非常多崇摄,可以說java擎值,js等常見的關(guān)鍵字都在其中,加起來足足有56個
abstract | continue | false | new | this |
---|---|---|---|---|
as | default | final | null | throw |
assert | deferred | finally | operator | true |
async | do | for | part | try |
async* | dynamic | get | rethrow | typedef |
await | else | if | return | var |
break | enum | implements | set | void |
case | export | import | static | while |
catch | external | in | super | with |
class | extends | is | switch | yield |
const | factory | library | sync | yield |
Dart的變量類型
dart中的變量與java的變量類型有些相似但是又不完全相同逐抑,java中的變量類型大概可以歸納為四種類型(常見通用類型):
數(shù)值類型:byte鸠儿、short、int厕氨、long
浮點(diǎn)類型:float进每、double
布爾類型:boolean
字符型:char、String
java中對類型劃分很細(xì)節(jié)化命斧, 區(qū)分的很明顯田晚,但是在dart中,依然可以大概分為這幾類国葬,但是dart中的容錯性提高了贤徒,細(xì)節(jié)化減少芹壕,dart的基本類型大概如下:
數(shù)值類型:int、double接奈、num
布爾類型:bool
字符型:String
可見dart中的數(shù)值類型基本就是根據(jù)是否浮點(diǎn)類型劃分出了兩個基本類型以及這兩個基本類型的父類型踢涌,但是有意思的點(diǎn)是,int和double類型的字節(jié)大小數(shù)居然和操作系統(tǒng)以及當(dāng)前輸入的位數(shù)有關(guān)系
int
在dart中序宦,int類型的取值范圍取決于當(dāng)前運(yùn)行的系統(tǒng)環(huán)境睁壁,比如dart初衷用來運(yùn)行在瀏覽器端,所以dart使用了javaScipct的取值范圍互捌,也就是- 2^(53) ~ 2^(53) - 1堡僻,
但是由于發(fā)展到現(xiàn)在dart不僅僅是用來瀏覽器方向開發(fā),還兼容跨平臺的app開發(fā)疫剃,所以dart又要兼容客戶端的取值范圍:- 2^(63) ~ 2^(63) - 1
舉例:
int a = 1钉疫;
double
dart的雙精度類型,取值范圍完全遵循的IEEE 754標(biāo)準(zhǔn)
舉例:
double a = 1巢价;
num
在dart中除了兩個通用的數(shù)值類型以外牲阁,還存在一個數(shù)值類型,即int和double的父類--num壤躲,這個類提供了轉(zhuǎn)換為int和double的api方法城菊,并且還有像abs()、
ceil()和floor()這些常見的操作方法碉克,需要注意的是在numbers中默認(rèn)的計算規(guī)則是按照取值范圍比較大的double類型來計算的凌唬,即初始化的值是int但是賦值
為numbers類型的話,依然是默認(rèn)按照double類型計算漏麦,所以最終需要取到int類型的值的話切記要num.toInt()方法轉(zhuǎn)換為int類型的值
舉例:
num a = 1.0客税;
print(a.toInt());
bool
在dart中有類似java/javaScripct的boolean類型的值,類型為bool撕贞,但是需要注意的是在dart中更耻,bool的值屬于編譯時常量,只有true或者false兩個取值
舉例:
bool flag = false;
String
在dart中不再有單個字符和多個字符的區(qū)別捏膨,只有一個統(tǒng)一的標(biāo)準(zhǔn)--字符串類型String秧均,這個類型與java中的String很相似,但是在dart中針對java的String新增了很多人性化的操作(尤其是字符串拼接方面),
在java中字符串拼接可能需要如下方式之一:
StringBuffer buffer = new StringBuffer();
buffer.append("aaa").append("aaa").toString();//或者使用StringBuilder創(chuàng)建字符串
//或者選擇字符串拼接号涯,例如:
String a = "aaa";
String b = a + "bbb";
但是可以看到j(luò)ava中的字符串拼接的方式很不方便目胡,必須要+連接,在dart中選擇很多链快,例如誉己,兩個都是String類型的字符串拼接的話,可以選擇直接+連接符連接久又,但是遇到拼接的變量中是數(shù)值類型或者其他類型的時候巫延,可以使用${name}的方式快速在字符串中拼接當(dāng)前的變量效五,例如:
num abc = 1.0;
print("哈哈哈${abc}");
java中字符串拼接還可以選擇StringBuffer或者StringBuilder的方式創(chuàng)建字符串地消,這兩種方式在java中的區(qū)別無非就是多線程環(huán)境下是否是安全的炉峰,在dart中,也保留了這個優(yōu)秀的設(shè)定脉执,但是dart是單線程語言疼阔,所以dart中只有一個StringBuffer,可以用來寫入字符串或者拼接字符串半夷,使用如下:
StringBuffer buffer = new StringBuffer();
buffer.write("aaa");
buffer.write("bvb");
print(buffer.toString());
除此之外婆廊,我們應(yīng)該知道在js中字符串可以是單引號或者雙引號,但是在java中字符串必須是""包裹巫橄,只有單個字符才可以''包裹淘邻,dart由于兩者的優(yōu)秀特性都有,并且js和dart都只有字符串一個類型湘换,所以在dart中單引號和雙引號都可以包裹字符串類型宾舅,并且單引號包裹下的字符串還可以用特殊的方式進(jìn)行數(shù)據(jù)拼接,例如:
var s1 = '字符串' '可以這樣' '來連接';
可以看出來我們可以直接將需要拼接的字符串用單引號包裹彩倚,并且并排排放筹我,就會自動進(jìn)行拼接操作,除了這點(diǎn)以外帆离,dart還吸收了新晉的熱門語言python和kothil的特點(diǎn)蔬蕊,加入了'''特性,在java或者js開發(fā)的過程中如果我們的字符串特別長哥谷,一行放不下的話我們只能選擇字符串拼接岸夯,不僅不美觀,并且對于開發(fā)的便捷性也很有影響们妥,但是dart的'''特性可以很輕松解決字符串太多換行的問題囱修,例如:
var s = '''
這是
多行
字符串
''';
只要用'''將輸入的文本包裹,中間的文本可以隨便換行王悍,是不是很方便呢?
另外在java開發(fā)中我們往往遇到了需要進(jìn)行文字轉(zhuǎn)義的方式破镰,我們一般的處理方案是將\改為\\或者/來處理,但是在dart中我們可以在字符串前加入一個r標(biāo)示压储,這樣的話我們的文本就是不會被強(qiáng)制轉(zhuǎn)義的了鲜漩,例如:
var s = r'這是原始字符串,\n不會被顯示為換行符集惋。';
如上就是dart的基本類型和常用開發(fā)語言的比較孕似,接下來的博客我們會對dart的集合,構(gòu)造刮刑,異常喉祭,繼承养渴,合并繼承以及可選參數(shù)的說明