Dart 语言数据类型详解(新手向)
一、基础数据类型
1. 数字类型
dart
int age = 25; // 整数(范围随平台变化)
double price = 19.99; // 双精度浮点数
num value = 3.14; // 可接收int/double的超类新手注意点:
- 在 Web 平台编译为 JS 时,int 范围缩小至 -2^53 ~ 2^53-1(网页3)
- 十六进制声明需加
0x前缀,如0xFF对应十进制 255(网页4) num.parse()可将字符串转为数字,需处理格式错误异常(网页4)
2. 字符串
dart
String s1 = '单引号';
String s2 = "双引号";
String s3 = '''多行
字符串'''; // 三引号支持换行易错陷阱:
- 转义字符需用
\,如I'm要写成'I\'m'(网页3) - 字符串拼接优先用
$变量插值法,而非+运算符(网页4) - UTF-16 编码可能导致某些特殊字符处理异常(网页4)
3. 布尔类型
dart
bool isActive = true; // 只有true/false两个值特殊说明:
- 非布尔值不能隐式转换:
if(1)会报错(网页3) - 空字符串的
isEmpty返回 true(网页3)
二、集合类型
1. List(列表)
dart
List<int> numbers = [1, 2, 3]; // 推荐类型声明
var dynamicList = [1, 'a']; // 默认List<dynamic>操作要点:
const创建编译时常量列表(完全不可变)- 预分配容量提升性能:
List.filled(1000, 0)(网页5) - 展开运算符
...可合并列表(网页5)
2. Set(集合)
dart
Set<String> fruits = {'apple', 'banana'};
var uniqueNumbers = {1, 2, 3}; // 字面量语法隐藏特性:
- 元素唯一性验证在运行时完成,重复添加不会报错但会被忽略(网页3)
- 空Set需显式声明类型:
Set<String> s = {}(否则会被识别为Map)(网页3)
3. Map(映射)
dart
Map<String, int> scores = {'Alice': 90};
var capitals = Map(); // 旧式构造函数注意事项:
- 键类型必须一致,
{1: 'a', 'b': 2}会导致后续操作异常(网页3) - 使用
??处理不存在的键:scores['Bob'] ?? 0(网页5) putIfAbsent()方法可安全添加新键值对(网页3)
三、类型系统特性
1. 类型推断
dart
var a = 10; // 推断为int
var b = [1, 2, 3]; // 推断为List<int>常见误区:
- 未初始化的
var变量默认是dynamic类型(网页6) - 动态列表需显式声明:
List<dynamic>(否则添加不同类型元素会污染列表)(网页6)
2. 动态类型
dart
dynamic value = 'text';
value = 42; // 允许改变类型风险提示:
- 绕过类型检查可能导致运行时错误(如对 null 调用方法)(网页6)
- 优先使用明确类型,仅在处理 JSON 等不确定结构数据时使用(网页6)
3. 空安全
dart
int? nullableInt; // 可空声明
String name = ''; // 非空必须初始化必须掌握:
!断言运算符:nullableInt!.abs()(需确保非空)- 安全调用链:
user?.profile?.age ?? 0(网页5)
四、新手进阶技巧
1. 类型检查
dart
if (value is String) {
print(value.length);
}2. 类型转换
dart
int.parse('42') // String转int
double.tryParse('3.14') // 安全转换3. 实用操作
dart
// 合并列表去重
var combined = [...list1, ...list2].toSet().toList();
// 条件添加元素
var list = [
'base',
if (isVIP) 'VIP',
for (var i=0; i<3; i++) 'item$i'
];4. 性能优化
- 优先使用
final声明不可变集合 - 大批量数据操作时使用
Uint8List等类型化数组(网页4)
实践建议:
尝试实现:将List<dynamic>转换为List<String>时,使用map((e) => e.toString())并处理可能的 null 值