Dart 內建型別
Dart 內建基礎型別一覽表
| 分類名稱 | 型別標識 | 書寫 / 字面量範例 | 簡要說明 |
|---|---|---|---|
| Numbers(數字) | int、double | int a = 10; double b = 3.14; | 數字分兩大類:整數、雙精度浮點數,共同父類為 num |
| Strings(字串) | String | var str = "foxdevelop.com"; | 儲存 UTF-16 字元序列,支援插值、多行、原始字串 |
| Booleans(布林) | bool | bool flag = true; | 僅有兩種取值:true / false |
| Records(元組記錄) | 記錄字面量 (v1, v2) | var record = (10, "test"); | 長度固定的多值複合型別,支援解構指派 |
| Functions(函式) | Function | void fn() {} Function func = ()=>1; | 一級物件,可指派、傳入參數、作為回傳值 |
| Lists(串列 / 陣列) | List | var list = [1,2,3]; | 有序、允許重複元素的集合,等同陣列 |
| Sets(集合) | Set | var set = {1,2,3}; | 無序、元素不可重複的集合 |
| Maps(鍵值對映射) | Map | var map = {"name":"Tom"}; | 鍵值儲存結構,鍵具唯一性 |
| Runes(Unicode 碼點) | Runes | Runes("\u{1f600}") | 底層讀取 Unicode 碼點,官方建議改用 characters 套件 |
| Null(空值) | Null | Null n = null; | 唯一取值為 null,是空安全體系的底層基礎型別 |
Dart 所有變數本質都是物件(類別實體),可透過字面量快速建立,也能呼叫對應建構子初始化。
'hello' 是字串字面量、true 是布林字面量;Map() 則是透過建構子建立 Map 物件。
語言特殊輔助型別
不屬於基礎內建型別,但皆為 Dart 關鍵字。
這類型別負責型別體系、非同步、靜態檢查等特殊用途:
| 型別 | 用途說明 |
|---|---|
Object | 除 Null 以外所有 Dart 類別的父類 |
Enum | 所有列舉型別的父類 |
Future / Stream | 專用於非同步程式開發 |
Iterable | 搭配 for-in 迴圈、同步產生器使用 |
Never | 運算式永遠無法正常執行完畢(常用於標記一定會拋出例外的函式) |
dynamic | 關閉靜態型別檢查,優先使用 Object / Object? 替代 |
void | 無回傳值,多作為函式回傳型別 |
1 Numbers 數字型別
父類:num
數字分兩個子型別:int 整數、double 浮點數,兩者皆繼承自 num
1.1 int 整數
數值範圍區分(Dart 可開發前端,因此分 Web 與原生平台):
- 原生平台:
-2^63 ~ 2^63 - 1 - Web(底層 JS):
-2^53 ~ 2^53 - 1
無小數點,支援十進制、以 0x 開頭的十六進制
範例
void main() {
// 十進制整數
var pageCount = 123;
// 十六進制
var hex = 0xDEADBEEF;
// 數字底線分隔符(Dart 3.6+,提升可讀性)
var million = 1_000_000;
var mac = 0x00_14_22_01_23_45;
print(pageCount);
print(hex);
print(million);
print(mac);
}Code language: Dart (dart)
執行輸出
123
3735928559
1000000
86469845829
1.2 double 雙精度浮點數
包含小數點 / 科學記數法格式
void main() {
var pi = 3.14; // 一般小數
var raid = 1.61e5; // 1.61 * 10^5 科學記數
var tiny = 0.000_000_000_02; // 底線分隔小數
print(pi);
print(raid);
print(tiny);
}Code language: PHP (php)
3.14
161000.0
2e-11Code language: CSS (css)
1.3 父類 num
變數宣告為 num 可同時存放 int 與 double:
void main() {
num money = 5;
money += 2.5; // 自動轉型為 double,money = 7.5
// int 指派給 double 會自動轉為 1.0
double zoom = 1;
print(money);
print(zoom);
}Code language: PHP (php)
執行輸出
7.5
1.0Code language: CSS (css)
1.4 型別互相轉換
void main() {
// 字串轉 int
var one = int.parse('123');
// 字串轉 double
var pi = double.parse('3.14');
// int / double 轉字串
String intStr = 99.toString();
String pi2 = 3.14159.toStringAsFixed(2); // 保留2位小數 → "3.14"
print(one);
print(pi);
print(pi2);
}Code language: JavaScript (javascript)
執行輸出
123
3.14
3.14Code language: CSS (css)
1.5 int 專屬位元運算子
僅 int 支援移位、位元且/或/互斥或、位元取反,詳細可參考:Dart Bitwise and shift operators – FoxDevelop
void main() {
print(3 << 1); // 位元左移 0011 <<1 → 0110
print(3 | 4); // 位元或
print(3 & 4); // 位元且
print(~3); // 位元取反
}Code language: PHP (php)
6
7
0
-4
1.6 數字常數(編譯期常數)
純數字字面量、常數四則運算可標記 const
在程式編譯階段(尚未執行程式)就能直接算出固定數值、執行時永遠不會變動、不需臨時計算的值,稱為編譯期常數,以 const 修飾。
const msPerSec = 1000;
const waitSec = 5;
const waitMs = waitSec * msPerSec; // 編譯期常數Code language: JavaScript (javascript)
const:編譯期常數,程式尚未執行時編譯器就會算出固定值,直接寫入編譯後的二進制檔案;程式執行時直接讀取,不需額外運算。
final:執行期常數(執行時才指派數值,指派後不可修改),允許動態設定數值,一旦設定就無法二次變更。
1.7 內建數學方法
num 本身自帶基礎方法,複雜數學運算需匯入 dart:math
常見:abs()、ceil()、floor()、round() 等
num n = -3.6;
print(n.abs()); // 3.6
print(n.ceil()); // -3
print(n.floor()); // -4Code language: PHP (php)
2. String 字串型別
UTF-16 編碼字元序列,用來存放文字,有兩種定義方式:單引號或雙引號包覆。
2.1 定義方式:單引號 / 雙引號
var s1 = '單引號字串';
var s2 = "雙引號字串";
// 跳脫符號
var s3 = 'It\'s ok';
var s4 = "It's ok"; // 內外引號不同,不需跳脫
Code language: JavaScript (javascript)
字串內部分字元具特殊語法意義(例如雙引號 "、換行、反斜線 \),直接書寫會破壞字串結構,造成編譯器辨識錯誤。
跳脫符號 \ 用來取消字元的特殊作用,或是輸出無法直接看見的特殊符號。
像是鍵盤的換行、Tab 等不可見符號,都必須透過跳脫字元表示,例如 \t 代表 Tab,可執行下方範例觀察效果:
print("name\tage\tcountry");
print("Jack\t18\tUSA");
print("Lucy\t20\tEgypt");Code language: PHP (php)
2.2 字串插值 ${運算式}
- 單純變數可省略大括號,寫成
$變數 - 物件會自動呼叫
.toString()轉換為文字
void main() {
var word = "interpolation";
var str1 = "Dart has $word";
var str2 = "大寫:${word.toUpperCase()}";
print(str2); //大寫:INTERPOLATION
}Code language: JavaScript (javascript)
2.3 字串拼接
- 相鄰字面量自動拼接(支援換行分隔)
- 使用
+運算子拼接
var s1 = "第一行"
"第二行";
var s2 = "a" + "b";
assert(s1 == "第一行第二行");
assert(s2 == "ab");Code language: JavaScript (javascript)
2.4 多行字串:三引號 ”’ / “””
void main() {
var multi1 = '''
多行
文字
''';
var multi2 = """
雙三引號多行
hello foxdevelop.com
""";
print(multi1);
print(multi2);
}Code language: PHP (php)
多行
文字
雙三引號多行
hello foxdevelop.comCode language: CSS (css)
單三引號內可直接放雙引號、雙三引號內可直接放單引號,都不需要跳脫處理:
2.5 原始字串 r”” 不處理任何跳脫符號
var raw = r"換行符 \n 不會生效";
print(raw); // 完整原样輸出 \n
Code language: PHP (php)
2.6 const 常數字串限制
插值內的內容必須是編譯期常數(數字、布林、常數字串),不能是一般變數、集合
const num cNum = 10;
const bool cBool = true;
const String cStr = "const";
// 合法常數字串
const valid = "$cNum $cBool $cStr";
var normalNum = 10;
// 非法:插值包含非常數變數
// const invalid = "$normalNum";
Code language: JavaScript (javascript)
3. bool 布林型別
僅有兩種實體:true / false,兩者皆為編譯期常數
Dart 強型別規則:不可直接用數值判斷真假,必須明確比較
void main() {
var emptyStr = "";
print(emptyStr.isEmpty); // 判斷空字串
var zero = 0;
print(zero == 0); // 判斷數值0
var nil = null;
print(nil == null); // 判斷空值
var nan = 0 / 0;
print(nan.isNaN); // 判斷非數字
}Code language: PHP (php)
4. Runes & characters 處理 Unicode 字元
- Runes:取出字串底層 Unicode 碼點,屬於舊式方案
- 官方推薦
package:characters:處理視覺完整字元(字形簇,例如國旗 Emoji)
Unicode 跳脫語法
- 4位十六進制碼點:
\uXXXX - 超過4位的大型碼點:
\u{十六進制數字}
var heart = "\u2665"; // ♥
var laugh = "\u{1f606}"; // 😆
Code language: JavaScript (javascript)
characters 套件範例
import 'package:characters/characters.dart';
void main() {
var text = "Hi 🇩🇰";
print(text.characters.last); // 完整輸出丹麥國旗Emoji
}
Code language: JavaScript (javascript)
5. Symbol 符號
用於反射、程式混淆場景,字面量寫法 #識別名,屬於編譯期常數
程式混淆不會改變 Symbol 內容,適合透過名稱動態呼叫識別名
#userName
#getData
Code language: CSS (css)
6. Null 空值型別
唯一取值為 null,在空安全體系中 Null 是獨立的頂層型別,所有可空型別都相容 null。
String? name = null;
Null n = null;
Code language: JavaScript (javascript)