萬物皆物件
在 Dart 中,萬物皆物件,包括函式。
所有的物件都繼承自 Object 類。
並且,所有物件的預設值都是 null。
void main() {
var test_var;
print("value = $test_var");
}
>>>
value = null
複製程式碼
如何宣告變數
使用
var
關鍵字var name = 'Bob'; 複製程式碼
使用
var
可以宣告一個不定型別的變數,但當該變數被第一次賦值時,該變數型別就被確定。從此,你不能再改變該變數的型別,任何錯誤的嘗試,你都會得到編譯器的報錯。
eg:
name = 1; >>> A value of type 'int' can't be assigned to a variable of type 'String'. 複製程式碼
使用
dynamic
或Object
這兩個傢伙具有同樣的效果!
它們都可以達到宣告一個可變型別的變數的效果,即你可以隨時使用該變數來指向任何一種型別的物件。
當然,編譯器是不會告訴你你犯了任何的錯誤,它只會讓你的程式碼被順利的編譯 ?
確切來說,
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,則仍然保持原值。