内建类型
Dart 语言支持以下内建类型:
- Number
- String
- Boolean
- List (也被称为Array)
- Map
- Set
- Rune (用于在字符串中表示 Unicode 字符)
- Symbol
这些类型都可以被初始化为字面量。
因为在 Dart 所有的变量终究是一个对象(一个类的实例), 所以变量可以使用 构造涵数 进行初始化。 一些内建类型拥有自己的构造函数。
Number
Dart 中的Number有两种类型:
int类型: 整数值不大于64位,具体取决于平台。double类型: 64位(双精度)浮点数,依据IEEE 754标准。
以下是将字符串转换为数字的方法,反之亦然:
// String -> intvar one = int.parse('1');assert(one == 1);// String -> doublevar onePointOne = double.parse('1.1');assert(onePointOne == 1.1);// int -> StringString oneAsString = 1.toString();assert(oneAsString == '1');// double -> StringString 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 createmulti-line strings like this one.''';var s2 = """This is also amulti-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 操作。
