Dart 做爲 Flutter 欽定的語言,隨着 Flutter 的火熱走進了咱們的視線。網上有不少針對它的非議,其中就包括 空安全。好比這篇文章,文章中有這麼一段話。html
- 記住, Dart 沒有空安全,不要覺得不加問號的地方就必定不是 null
- 凡是你沒有初始化的地方全是 null !
不能說他錯,但這段話很容易讓人誤解,彷彿 Dart 跟 Java 同樣,沒有空安全這個語言特性。那 Dart 究竟是不是空安全的呢,應該說 Dart 在必定程度上是空安全的。究竟是不是,取決於怎麼定義空安全。安全
上面那篇文章是拿 dart 跟 kotlin 比較得出的結論,kotlin 咱們都比較熟悉了,的確是空安全的,這也是他與 Java 的主要區別和吸引人的特性。具體咱們能夠看官方文檔, 簡而言之kotlin的引用分可空和非空兩種類型,對於可空類型則提供安全的調用方法好比 a?.foo()
,從而消滅 The Billion Dollar Mistake。與 Kotlin 比較, Dart能夠說是 作了一半,其實 Dart 早在2015年8月的時候就在1.12版本中添加了一個針對空安全的語言特性——Null-aware operatorslua
??
: if null operator.expr1 ?? expr2
evaluates toexpr1
if notnull
, otherwiseexpr2
.??=
: null-aware assignment.v ??= expr
causesv
to be assignedexpr
only ifv
isnull
.x?.p
: null-aware access.x?.p
evaluates tox.p
ifx
is notnull
, otherwise evaluates tonull
.x?.m()
: null-aware method invocation.x?.m()
invokesm
only ifx
is notnull
.
我嘗試着解釋下:code
??
是判空操做符,表示若是??
左邊的表達式不爲空則是左邊的值不然是右邊的。好比 int a = b ?? 1;
,若是 b 是空的,則 a=1,不然a=b。 是否是看着很眼熟?沒錯,這至關於 kotlin 中的 Elvis操做符?:
。??=
空感知賦值,被賦值的變量爲空的時候纔對他賦值。這個操做符其實至關於上一個的語法糖,a ??= b
等於 a = a?? b
。可見,Dart 雖然缺少嚴格的空安全類型系統,可是在使用側利用空感知操做符這種語法糖相比 Java 簡化了判空操做,空感知賦值操做符甚至是 kotlin 都缺少的(雖然能夠用 Elvis 間接實現),某種意義上是靈活地實現了空安全。cdn
Dart 究竟是不是空安全的,你們如今應該內心有數了。其實Dart做爲Google在2011年開源的現代語言,確定是有從其餘語言上吸收不少教訓,解決了不少痛點的,畢竟Google當初還想用他來取代 JS 成爲下一代Web開發語言來着(雖然失敗了:) 。我剛開始接觸這門語言的時候,也以爲沒 Kotlin 用着舒服,但在深刻的使用後發現 Dart 也是很優秀的。Dart 同時也在茁壯成長(看 Dart 的 Github 就知道),Google對他傾注了不少精力,咱們要對它有信心哈。htm