内建类型
Dart 语言支持以下内建类型:
- Number
- String
- Boolean
- List (也被称为Array)
- Map
- Set
- Rune (用于在字符串中表示 Unicode 字符)
- Symbol
这些类型都可以被初始化为字面量。
因为在 Dart 所有的变量终究是一个对象(一个类的实例), 所以变量可以使用 构造涵数 进行初始化。 一些内建类型拥有自己的构造函数。
Number
Dart 中的Number有两种类型:
int
类型: 整数值不大于64位,具体取决于平台。double
类型: 64位(双精度)浮点数,依据IEEE 754标准。
以下是将字符串转换为数字的方法,反之亦然:
// String -> int
var one = int.parse('1');
assert(one == 1);
// String -> double
var onePointOne = double.parse('1.1');
assert(onePointOne == 1.1);
// int -> String
String oneAsString = 1.toString();
assert(oneAsString == '1');
// double -> String
String piAsString = 3.14159.toStringAsFixed(2);
assert(piAsString == '3.14');
String
Dart 字符串是一组 UTF-16 单元序列。 字符串通过单引号或者双引号创建。
var s1 = 'hello';
var s2 = "Dart";
var s3 = 'It\'s easy to escape the string delimiter.';
var s4 = "It's even easier to use the other delimiter.";
字符串可以通过 ${
expression
}
的方式内嵌表达式。 如果表达式是一个标识符,则 {} 可以省略。 在 Dart 中通过调用就对象的 toString()
方法来得到对象相应的字符串。
var s = 'lynn';
assert('my name is $s' == 'my name is' + 'lynn');
可以使用 +
运算符来把多个字符串连接为一个,也可以把多个字面量字符串写在一起来实现字符串连接:
var s1 = 'Dart '
'hello';
assert(s1 == 'Dart hello');
var s2 = 'The + operator ' + 'works, as well.';
assert(s2 == 'The + operator works, as well.');
使用连续三个单引号或者三个双引号实现多行字符串对象的创建:
var s1 = '''
You can create
multi-line strings like this one.
''';
var s2 = """This is also a
multi-line string.""";
使用 r
前缀,可以创建 “原始 raw” 字符串:
var s = r"In a raw string, even \n isn't special.";
一个编译时常量的字面量字符串中,如果存在插值表达式,表达式内容也是编译时常量, 那么该字符串依旧是编译时常量。 插入的常量值类型可以是 null,数值,字符串或布尔值。
// const 类型数据
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant string';
// 非 const 类型数据
var aNum = 0;
var aBool = true;
var aString = 'a string';
const aConstList = [1, 2, 3];
const validConstString = '$aConstNum $aConstBool $aConstString'; //const 类型数据
// const invalidConstString = '$aNum $aBool $aString $aConstList'; //非 const 类型数据
Boolean
Dart 使用 bool
类型表示布尔值。 Dart 只有字面量 true
and false
是布尔类型, 这两个对象都是编译时常量。
Dart 的类型安全意味着不能使用 if (nonbooleanValue)
或者 assert (nonbooleanValue)
。 而是应该像下面这样,明确的进行值检查:
// 检查空字符串。
var fullName = '';
assert(fullName.isEmpty);
// 检查 0 值。
var hitPoints = 0;
assert(hitPoints <= 0);
// 检查 null 值。
var unicorn;
assert(unicorn == null);
// 检查 NaN 。
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);
List
几乎每种编程语言中最常见的集合可能是 array 或有序的对象集合。 在 Dart 中的 Array 就是 List 对象, 通常称之为 List 。
Dart 中的 List 字面量非常像 JavaScript 中的 array 字面量。 下面是一个 Dart List 的示例:
var list = [1, 2, 3]; // Dart 类型推断 list 的类型为 List<int> , 如果尝试将非整数对象添加到此 List 中, 则分析器或运行时会引发错误。
List 的下标索引从 0 开始,第一个元素的索引是 0。 list.length
- 1 是最后一个元素的索引。 访问 List 的长度和元素与 JavaScript 中的用法一样:
var list = [1, 2, 3];
assert(list.length == 3);
assert(list[1] == 2);
list[1] = 1;
assert(list[1] == 1);
在 List 字面量之前添加 const
关键字,可以定义 List 类型的编译时常量:
var constantList = const [1, 2, 3];
// constantList[1] = 1; // 取消注释会引起错误。
扩展操作符(…)
// 扩展操作符(...)
var list = [1, 2, 3];
var list2 = [0, ...list];
assert(list2.length == 4);
空感知扩展操作符(…?)
var list;
var list2 = [0, ...?list];
assert(list2.length == 1);
集合中的 if 操作
var nav = [
'Home',
'Furniture',
'Plants',
if (promoActive) 'Outlet'
];
集合中的 for 操作
var listOfInts = [1, 2, 3];
var listOfStrings = [
'#0',
for (var i in listOfInts) '#$i'
];
assert(listOfStrings[1] == '#1');
Sets
Set 字面量来创建一个 Set 集合的方法:
var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
还可以这样创建:
var names = <String>{}; // 类型+{}的形式创建Set。
// Set<String> names = {}; // 声明类型变量的形式创建 Set (This works, too).
Set 的方法:
var elements = <String>{};
elements.add('fluorine'); // 添加一个
elements.addAll(halogens); // 添加全部
使用 .length
可以获取 Set 中元素的数量。
可以在 Set 字面量前添加 const
关键字创建一个 Set 编译时常量:
final constantSet = const {
'fluorine',
'chlorine',
'bromine',
'iodine',
'astatine',
};
// constantSet.add('helium'); // This line will cause an error.
从 Dart 2.3 开始,Set 可以像 List 一样支持使用扩展操作符(...
和 ...?
)以及 Collection If 和 Collection For 操作。
Maps
Map 是用来关联 keys 和 values 的对象。
keys 和 values 可以是任何类型的对象。
在一个 Map 对象中一个 key 只能出现一次,但是 value 可以出现多次。
Map 是一个键值对相关的对象。
其中键和值都可以是任何类型的对象。
每个 键 只能出现一次但是 值 可以重复出现多次。
Dart 中 Map 提供了 Map 字面量以及 Map 类型两种形式的 Map。
var gifts = {
// 键: 值
'first': 'partridge',
'second': 'turtledoves',
'fifth': 'golden rings'
};
var nobleGases = {
2: 'helium',
10: 'neon',
18: 'argon',
};
你也可以使用 Map 的构造器创建 Map:
var gifts = Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';
var nobleGases = Map();
nobleGases[2] = 'helium';
nobleGases[10] = 'neon';
nobleGases[18] = 'argon';
向现有的 Map 中添加键值对与 JavaScript 的操作类似:
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // 添加键值对 (Add a key-value pair)
从一个 Map 中获取一个值的操作也与 JavaScript 类似。
var gifts = {'first': 'partridge'};
assert(gifts['first'] == 'partridge');
如果检索的 Key 不存在于 Map 中则会返回一个 null:
var gifts = {'first': 'partridge'};
assert(gifts['fifth'] == null);
使用 .length
可以获取 Map 中键值对的数量:
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds';
assert(gifts.length == 2);
在一个 Map 字面量前添加 const
关键字可以创建一个 Map 编译时常量:
final constantMap = const {
2: 'helium',
10: 'neon',
18: 'argon',
};
// constantMap[2] = 'Helium'; // This line will cause an error.
Map 可以像 List 一样支持使用扩展操作符(...
和 ...?
)以及集合的 if 和 for 操作。