Dart 內建型別

Dart 內建型別

Dart 內建基礎型別一覽表

分類名稱型別標識書寫 / 字面量範例簡要說明
Numbers(數字)int、doubleint a = 10; double b = 3.14;數字分兩大類:整數、雙精度浮點數,共同父類為 num
Strings(字串)Stringvar str = "foxdevelop.com";儲存 UTF-16 字元序列,支援插值、多行、原始字串
Booleans(布林)boolbool flag = true;僅有兩種取值:true / false
Records(元組記錄)記錄字面量 (v1, v2)var record = (10, "test");長度固定的多值複合型別,支援解構指派
Functions(函式)Functionvoid fn() {} Function func = ()=>1;一級物件,可指派、傳入參數、作為回傳值
Lists(串列 / 陣列)Listvar list = [1,2,3];有序、允許重複元素的集合,等同陣列
Sets(集合)Setvar set = {1,2,3};無序、元素不可重複的集合
Maps(鍵值對映射)Mapvar map = {"name":"Tom"};鍵值儲存結構,鍵具唯一性
Runes(Unicode 碼點)RunesRunes("\u{1f600}")底層讀取 Unicode 碼點,官方建議改用 characters 套件
Null(空值)NullNull n = null;唯一取值為 null,是空安全體系的底層基礎型別

Dart 所有變數本質都是物件(類別實體),可透過字面量快速建立,也能呼叫對應建構子初始化。

'hello' 是字串字面量、true 是布林字面量;Map() 則是透過建構子建立 Map 物件。

語言特殊輔助型別

不屬於基礎內建型別,但皆為 Dart 關鍵字。

這類型別負責型別體系、非同步、靜態檢查等特殊用途:

型別用途說明
ObjectNull 以外所有 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 字串拼接

  1. 相鄰字面量自動拼接(支援換行分隔)
  2. 使用 + 運算子拼接
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 字元

  1. Runes:取出字串底層 Unicode 碼點,屬於舊式方案
  2. 官方推薦 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)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *