目录
-
数据类型
- 整型(int)
整型是不超过64位,不同的平台位数不一样。如果是DartVM, 整型的范围是2^63-1到-2^63。如果需要编译成js代码,那么整型的范围就是2^53-1到-2^53。
// 整型10进制
int a = 1;
// 整型16进制,以0x开头
int hex = 0xEABDF;
- 浮点型(double)
浮点型是64位的数字,包括小数位数,并符合IEEE754标准。一个数字只要有小数点,就是double类型。
整型和浮点型都是num类型的子类型。num类型包含基础的操作 +(加)、-(减)、*(乘)和/(除),以及包含一些简单的函数,比如: 取整函数abs()等等。一些负载的计算函数,可以在math包中找到。另外需要说明的是位移运算>>,是在int类中,所以仅支持整型运算。
// 普通定义
double a = 1.2;
// 指数定义
double exponents = 1.2e10;
- 字符串(String)
字符串类型是使用Unicode-16存储。定义字符串类型可以用单引号,也可以用双引号。定义多行字符串可以使用三个单引号或者三个双引号。
String s = "this is dart2";
String s2 = 'this is dart2';
// 使用==判断字符串是否相等
print(s == s2); // true
String s3 = '''
这是一个
多行
字符串
''';
在字符串内部可以是用${expression}来替换内容。
String s = "this is dart2";
String s2 = "It will say:'${s.toUpperCase()}'";
print(s2); // 显示: It will say:'THIS IS DART2';
int n = 16;
print("age is ${n * 2}"); // 显示:age is 32
如果不想字符串里面的转义字符被表达,如:\n,\t等等,那么需要在字符串定义前添加‘r’,表示这是一个原始字符串,不需要转义。
String s1 = "Hello \n world";
print(s1); // \n将被显示为换行
String s2 = r"Hello \n world";
print(s2); // 显示: Hello \n world
print(s1 == s2); // false
- 布尔型(bool)
布尔类型只有两个值false和true。
bool b = true;
bool nb = false;
- 类型转换
所有的非字符串类型,都可以用toString()转为字符串。数字(num)类型可以使用parse方法将字符串转为相对应的数字。l
String sd = "1.2";
String si = "2";
int i = 12;
double d = 1.5;
bool b = true;
print(double.parse(sd));
print(int.parse(si));
print(i.toString());
print(d.toString());
print(b.toString());
-
变量
变量的声明除了具体的类型int、double、String和bool以外,还可以用var声明变量。var可以根据初始化的值判定是什么类型的,但是,一旦类型确定,就无法更改类型。
变量如果没有赋值,那么变量的默认值就是null, 在Dart2中,所有类型都是对象,所以所有对象的默认值都是null。
var s = "this is dart2";
var n = 16;
var b = true;
var d = 3.14;
print(s is String); // true
print(n is int); // true
print(b is bool); // true;
print(d is double); // true;
s = 12; // 报错,string类型无法指定为int类型
var nullVar;
print(nullVar == null); // true
int nullInt;
print(nullInt == null); // true
bool nullBool;
print(nullBool == null); // true
如果变量的类型是动态的变化的,可以用dynamic声明。
dynamic d = "this is dart2";
print(d is String); // true
d = 12;
print(d is int); // true
-
常量
常量可以用final和const的来声明。final和const都可以做类型的推断,与var的声明方式一样,也可以具体的赋予某个类型。但是不能和var混用。
final finalNum = 12;
final int finalNum2 = 13;
const constStr = "hello";
const String constStr2 = "world";
final var finalNum3 = 14; // 报错,不能同时声明final和var
const var constStr3 = "wrong"; // 报错,不能同时声明const和var
final和const的区别。
1. final的变量只初始化一次,可以是编译时的常量,也可以不是。const必须是编译时的常量。
2. final只是在第一次运行的时候确定常量值,const必须指定常量值。比如:final可以是一个函数的计算结果,但是const不行。
3. const可以修饰值,final不可以。const的值必须是const, final可以不是。
ps: 编译时常量,是指在程序编译时就可以确定的值。比如:一个确定的数值,或者可以获得结果的数值表达式;一个确定的字符串等等。
final finalNum = 10; // 正确
final finalNum2 = 10 * finalNum; // 正确
const constNum = 10;
const constNUm2 = 10 * constNum; // 正确
// const声明必须是编译时常量
final finalDate = new DateTime.now(); // 正确
const constDate = new DateTime.now(); // 报错。不是一个常量表达式
var varNum = 12;
final finalVarNum = varNum; // 正确
const constVarNum = varNum; // 报错。不是一个常量表达式
const constConstNum = constNum; // 正确
// const修饰的值,必须是常量
final finalConst = const [varNum, 1, 2]; // 错误。不是一个常量表达式
final finalConst = const [constNum, 1, 2]; // 正确
const constList = const [constNum]; // 正确
PS: 其他的类型: list, map, rune, symbol将在另外两篇博客中,详细介绍。