1 变量(Variables)
var name = 'Bob';
Dart可自动推断变量的类型,也可以为变量指定类型,如果一个对象的引用不局限于单一的类型,可以将其指定为 Object(或 dynamic)类型。推荐通过 var 声明局部变量而非使用指定的类型
未初始化变量默认值为null,包括数字,因为在 Dart 中一切皆为对象,包括数字。
Final和Const
这两个关键字可以替代 var 关键字或者加在一个具体的类型前。一个 final 变量只可以被赋值一次;一个 const 变量是一个编译时常量(const 变量同时也是 final 的)。
如果使用 const 修饰类中的变量,则必须加上 static 关键字,即 static const
,在声明 const 变量时可以直接为其赋值,也可以使用其它的 const 变量为其赋值:
const bar = 1000000; // 直接赋值 [Unit of pressure (dynes/cm2)]
const double atm = 1.01325 * bar; // 利用其它 const 变量赋值 (Standard atmosphere)
const也可以用来创建 常量值,该常量值可以赋予给任何变量
var foo = const [];
final bar = const [];
如果使用初始化表达式为常量赋值可以省略掉关键字 const。
const baz = []; // 相当于 `const []`
2 内置类型
2.1 Numbers
int
整数值,不超过64位。DartVM 上其取值位于 -263 至 263 - 1 之间。在 Web 上,整型数值代表着 JavaScript 的数字(64 位无小数浮点型),其允许的取值范围在 -253 至 253 - 1 之间。
double
64位双精度浮点型,IEEE764。
num x = 1; // x can have both int and double values
Web中的int型为JavaScript int既可以是int型也可以是double型。
字符串和数字转换方式
// 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');
位操作
assert((3 << 1) == 6); // 0011 << 1 == 0110
数字为编译时常量(compile-time constants),表达式结果也为编译时常量
const msPerSecond = 1000;
2.2 String
使用单引号创建字符串字面量,双引号也可以用于创建字符串字面量。使用单引号创建字符串时可以使用斜杠来转义那些与单引号冲突的字符串:’。而在双引号中则不需要使用转义与单引号冲突的字符串:’。
var s = 'Apple';
或
var s = "Apple";
在字符串中,用${表达式}
的形式使用表达式,如果表达式是一个标识符,可以省略掉 {}
。如果表达式的结果为一个对象,则 Dart 会调用该对象的 toString 方法来获取一个字符串。
var s = 'Dart';
assert('I love $s' == 'I love Dart');
assert('I love ${
s.substring(1,4)}.' == 'I love art.');
可以使用 + 运算符或并列放置多个字符串来连接字符串:
var s1 = 'I '
'love'
" Dart.";
assert(s1 ==
'I LOVE '
'Dart.');
输出结果:I love Dart.
或
var s2 = 'I love ' + 'Dart。';
assert(s2 == 'I love Dart.');
使用三个单引号或者三个双引号也能创建多行字符串:
var s1 = '''
I love Dart.
''';
var s2 = """I love Dart.""";
在字符串前加上 r 作为前缀创建 “raw” 字符串(即不会被做任何处理(比如转义)的字符串):
var s = r'/n';
输出结果:/n
2.3 Booleans
Dart不能使用 if (nonbooleanValue) 或者 assert (nonbooleanValue)来检查布尔型
显式检查布尔值方式:
// 检查是否为空字符串 (Check for an empty string).
var fullName = '';
assert(fullName.isEmpty);
// 检查是否小于等于零。
var hitPoints = 0;
assert(hitPoints <= 0);
// 检查是否为 null。
var unicorn;
assert(unicorn == null);
// 检查是否为 NaN。
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);
2.4 Lists
var list = [1, 2, 3];
此时Dart推断出list 的类型为List<int>
,如果传入非int类型会报错。
在 List 字面量前添加 const 关键字会创建一个编译时常量:
var constantList = const [1, 2, 3];
Dart 在 2.3 引入了 扩展操作符(…)和 空感知扩展操作符(…?)
使用扩展操作符(…)将一个 List 中的所有元素插入到另一个 List 中:
var list = [1, 2, 3];
var list2 = [0, ...list];
assert(list2.length == 4);
如果扩展操作符右边可能为 null ,可以使用 null-aware 扩展操作符(…?)来避免产生异常:
var list;
var list2 = [0, ...?list];
assert(list2.length == 1);
集合中的 if 来创建一个 List 的示例,它可能包含 3 个或 4 个元素:
var nav = [
'Home',
'Furniture',
'Plants',
if (promoActive) 'Outlet'
];
集合中的 for 将列表中的元素修改后添加到另一个列表中的示例:
var listOfInts = [1, 2, 3];
var listOfStrings = [
'#0',
for (var i in listOfInts) '#$i'//lisInts中第0个元素加入到listOfStrings数组中
assert(listOfStrings[1] == '#1');
2.5 Sets
使用 Set 字面量(literals)来创建一个 Set 集合的方法:
var fruits = {
'apple', 'banana', 'pear', 'orange'};
此时Dart推断fruits变量是一个Set类型的集合,如果传入非String类型的变量会报错。
可以使用在 {} 前加上类型参数的方式创建一个空的 Set,或者将 {} 赋值给一个 Set 类型的变量:
var names = <String>{
}; // 类型+{}的形式创建Set。
Set<String> names = {
}; // 声明类型变量的形式创建 Set
var names = {
}; // 这样的形式将创建一个 Map 而不是 Set
如果忘记在 {} 上注释类型或赋值到一个未声明类型的变量上,那么 Dart 会创建一个类型为 Map<dynamic, dynamic> 的对象。
Set编译时常量和扩展符操作与List相同
2.6 Maps
Dart 中 Map 提供了 Map 字面量以及 Map 类型两种形式的 Map。
下面是一对使用 Map 字面量创建 Map 的例子:
var gifts = {
// 键: 值
'first': 'partridge',
'second': 'turtledoves',
'fifth': 'golde