1. 程式人生 > >Dart2基礎-資料型別和變數

Dart2基礎-資料型別和變數

目錄

資料型別

變數

常量

  • 資料型別

  • 整型(int)

整型是不超過64位,不同的平臺位數不一樣。如果是DartVM, 整型的範圍是2^63-1到-2^63。如果需要編譯成js程式碼,那麼整型的範圍就是2^53-1到-2^53。

// 整型10進位制
int a = 1;
// 整型16進位制,以0x開頭
int hex = 0xEABDF;
  • 浮點型(double)

浮點型是64位的數字,包括小數位數,並符合IEEE754標準。一個數字只要有小數點,就是double型別。

整型和浮點型都是num型別的子型別。num型別包含基礎的操作 +(加)、-(減)、*(乘)和/(除),以及包含一些簡單的函式,比如: 取整函式abs()等等。一些負載的計算函式,可以在math包中找到。另外需要說明的是位移運算>>,是在int類中,所以僅支援整型運算。

// 普通定義
double a = 1.2;
// 指數定義
double exponents = 1.2e10;
  • 字串(String)

字串型別是使用Unicode-16儲存。定義字串型別可以用單引號,也可以用雙引號。定義多行字串可以使用三個單引號或者三個雙引號。

String s = "this is dart2";
String s2 = 'this is dart2';
// 使用==判斷字串是否相等
print(s == s2); // true
String s3 = '''
這是一個
多行
字串
''';

在字串內部可以是用${expression}來替換內容。

String s = "this is dart2";
String s2 = "It will say:'${s.toUpperCase()}'";

print(s2); // 顯示: It will say:'THIS IS DART2';

int n = 16;
print("age is ${n * 2}"); // 顯示:age is 32

如果不想字串裡面的轉義字元被表達,如:\n,\t等等,那麼需要在字串定義前新增‘r’,表示這是一個原始字串,不需要轉義。

String s1 = "Hello \n world";
print(s1); // \n將被顯示為換行
String s2 = r"Hello \n world";
print(s2); // 顯示: Hello \n world
print(s1 == s2); // false
  • 布林型(bool)

布林型別只有兩個值false和true。

bool b = true;
bool nb = false;
  • 型別轉換

所有的非字串型別,都可以用toString()轉為字串。數字(num)型別可以使用parse方法將字串轉為相對應的數字。l

String sd = "1.2";
String si = "2";
int i = 12;
double d = 1.5;
bool b = true;

print(double.parse(sd));
print(int.parse(si));
print(i.toString());
print(d.toString());
print(b.toString());
  • 變數

變數的宣告除了具體的型別int、double、String和bool以外,還可以用var宣告變數。var可以根據初始化的值判定是什麼型別的,但是,一旦型別確定,就無法更改型別。

變數如果沒有賦值,那麼變數的預設值就是null, 在Dart2中,所有型別都是物件,所以所有物件的預設值都是null。

var s = "this is dart2";
var n = 16;
var b = true;
var d = 3.14;
print(s is String); // true
print(n is int); // true
print(b is bool); // true;
print(d is double); // true;

s = 12; // 報錯,string型別無法指定為int型別

var nullVar;
print(nullVar == null); // true
int nullInt;
print(nullInt == null); // true
bool nullBool;
print(nullBool == null); // true

如果變數的型別是動態的變化的,可以用dynamic宣告。

dynamic d = "this is dart2";
print(d is String); // true
d = 12;
print(d is int); // true
  • 常量

常量可以用final和const的來宣告。final和const都可以做型別的推斷,與var的宣告方式一樣,也可以具體的賦予某個型別。但是不能和var混用。

final finalNum = 12;
final int finalNum2 = 13;
const constStr = "hello";
const String constStr2 = "world";
final var finalNum3 = 14; // 報錯,不能同時宣告final和var
const var constStr3 = "wrong"; // 報錯,不能同時宣告const和var

final和const的區別。

1. final的變數只初始化一次,可以是編譯時的常量,也可以不是。const必須是編譯時的常量。

2. final只是在第一次執行的時候確定常量值,const必須指定常量值。比如:final可以是一個函式的計算結果,但是const不行。

3. const可以修飾值,final不可以。const的值必須是const, final可以不是。

ps: 編譯時常量,是指在程式編譯時就可以確定的值。比如:一個確定的數值,或者可以獲得結果的數值表示式;一個確定的字串等等。

final finalNum = 10; // 正確
final finalNum2 = 10 * finalNum; // 正確
const constNum = 10;
const constNUm2 = 10 * constNum; // 正確

// const宣告必須是編譯時常量
final finalDate = new DateTime.now(); // 正確
const constDate = new DateTime.now(); // 報錯。不是一個常量表達式

var varNum = 12;
final finalVarNum = varNum; // 正確
const constVarNum = varNum; // 報錯。不是一個常量表達式

const constConstNum = constNum; // 正確

// const修飾的值,必須是常量
final finalConst = const [varNum, 1, 2]; // 錯誤。不是一個常量表達式
final finalConst = const [constNum, 1, 2]; // 正確
const constList = const [constNum]; // 正確

PS: 其他的型別: list, map, rune, symbol將在另外兩篇部落格中,詳細介紹。