在 Dart 中,萬物皆對象,包括函數。git
全部的對象都繼承自 Object 類。github
而且,全部對象的默認值都是 null。api
void main() {
var test_var;
print("value = $test_var");
}
>>>
value = null
複製代碼
使用 var
關鍵字數組
var name = 'Bob';
複製代碼
使用 var
能夠聲明一個不定類型的變量,但當該變量被第一次賦值時,該變量類型就被肯定。bash
今後,你不能再改變該變量的類型,任何錯誤的嘗試,你都會獲得編譯器的報錯。函數
eg:post
name = 1;
>>>
A value of type 'int' can't be assigned to a variable of type 'String'. 複製代碼
使用 dynamic
或 Object
ui
這兩個傢伙具備一樣的效果!spa
它們均可以達到聲明一個可變類型的變量的效果,即你能夠隨時使用該變量來指向任何一種類型的對象。
固然,編譯器是不會告訴你你犯了任何的錯誤,它只會讓你的代碼被順利的編譯 😄
確切來講,dynamic
其實是一個關鍵字,而 Object
之因此有一樣的效果,徹底是由於任何對象類型,都源自於它。
因此你看,它兩具備一樣的效果,但具備不一樣的原理。
eg:
void main() {
dynamic name = "Bob";
print("value = $name");
name = 1;
print("value = $name");
}
>>>
value = Bob
value = 1
複製代碼
換成 Object
也會獲得一樣的結果。
使用具體對象聲明
String name = 'Bob';
複製代碼
對此,我想我不用有太多的解釋。
使用 final
或 const
若是你但願一個對象被初始化後,不能再被修改,那麼你應該使用這兩個關鍵字。
final name = 'Bob';
final String nickname = 'Bobby';
const bar = 1000000;
const double atm = 1.01325 * bar;
複製代碼
到如今爲止,它兩看起來沒什麼差異。
const 厲害的地方在於,它是編譯時常量的關鍵字,你在編譯期就須要肯定它的初始值。
而 final 只會在運行時纔要求肯定初始值。
const
除了能夠聲明一個不可變的常量外,還能夠用來建立常量數組。
void main() {
var userInfo = const [];
final githuber = const ['CoorChice'];
const nums = [1, 2, 3];
userInfo = ['bob', 2];
print(userInfo);
}
>>>
[bob, 2]
複製代碼
第一項之所可以被改變,是由於咱們定一個是個 const []
常量數組。
而剩餘兩項初始化後不能被改變對象的值,final
和 const
都是被做爲常量關鍵字被使用的,而被它們修飾的變量,不能再修改其值。
??=
操做符
考慮如下例子:
b ??= value;
複製代碼
若是 b 爲 null,就會把 value 賦值給 b。
若是 b 不爲 null,則仍然保持原值。