Dart 的变量与类型
在Dart中、我们可以使用 var 或者具体的类型来声明一个变量。当使用 var 定义变量时。表示类型是交由编辑器推断决定的。当然你也可以用静态类型去定义变量。更清楚的跟编译器表达你的意图。这样编辑器和编译器就能使用这些静态类型。向你提供代码补全或编译警告的提示了。
在默认情况下、未初始化的变量值都是null、因此我们不用担心无法判定一个传递过来的未定义变量到底是何类型。
Dart是类型安全的语言、并且是所有类型都是对象类型、都继承自顶层类型Object、因此一切变量的值都是类的实例(即对象)。甚至数字、布尔值、函数和null也都是继承自Object对象、
Dart内置了一些基本类型、比如num、bool、String、List和Map,在不引入其他库的情况下、可以使用他们去声明变量。
1、Dart的数值类型num、只有两个子类、即64位int和符合IEEE 754标准的64位double.前者代表整数类型、后者则是浮点数的抽象。正常情况下,他们的精度与取值
范围就足够满足我们的诉求了。
int x = 1;
int hex = OxEEADBEEF;
double y = 1.1;
double exponents = 1.13e5;
int roundY = y.round();
除常见基本运算符、比如+、-、*、/、以及位运算符外、你还能使用继承自num的abs()、round()等方法、来实现求绝对值、取整的功能。
2、为了表示布尔值、Dart使用了一种名为bool的类型。在Dart里。只有两个对象具有bool类型:true和false,他们都是编译时常量。
3、Dart是类型安全的、因此不能使用if(nonbooleanValue)或assert(nonbooleanValue)之类的在javaScript可以正常工作的代码。而应该显式的检查值
// 检查是否为0
var number = 0;
assert(number == 0);
// assert(number);错误
4、Dart的String是由UTF-16的字符串组成。构造字符串字面量时即能使用单引号也能使用双引号。还能在字符串中嵌入变量或表达式、可以使用$(express)把一个
表达式的值放进字符串、而如果是一个标识符、可以省略{}.
// 把单词cat转成大写放入到变量s1的声明中:
var s = 'cat';
var s1 = 'this is a uppercased string: $(s.toUpperCase())';
为了获得内嵌对象的字符串,Dart会调用对象的toString()方法、常见字符串的拼接,Dart则通过内置运算符”+“实现、
var s2 = ‘Hello’ + '' + 'World!';
对于多行字符串的构建、可以通过三个单引号或者三个双引号的方式声明、与Python是一致的。
var s3 = '''This is a
multi-line string.''';
5、List和 Map
其他编程语言常见的数组和字典类型,在Dart中对应实现是List 和 Map,统称为集合类型。他们的声明和使用很简单。和javaScript中的用法类似。
var arr1 = ["Tom","Andy","Jack"];
var arr2 = List.of([1,2,3]);
arr2.add(499);
arr2.forEach(v) => print('${v}'));
var map1 = {"name": "Tom", "sex": "male"};
var map2 = new Map();
map2['name'] = 'Tom';
map2['sex'] = 'male';
map2.forEach(k,v) => printf('${k}:$')
代码示例前半部分、声明并初始化了两个List变量、在第二个变量中添加了一个新的元素后、调用其迭代方法依次打印出其内部元素
代码示例后半部分、声明并初始化了两个Map变量、在第二个变量中添加了两个键值对后,同样调用其迭代方法依次打印出其内部元素。
容器的元素也需要由类型。比如上述代码中arr2的类型是List<int>,map2的类型则为Map<String,String>.Dart会自动根据上下文进行类型推断。所以
后续往容器内添加元素也需遵照这一类型。
6、常量定义、想定义不可变的变量;需要在定义变量前加上final或const关键字。const,表示变量在编译期间即能确定的值。final则不太一样。用它
定义的变量可以在运行时确定值。一旦确定后就不可再变。
final name = 'Andy';
const count = 3;
var x = 70;
var y = 30;
final z = x/y;
const适用于定义编译常量(字面量固定值)的场景、而final适用于定义运行时常量的场景。