数值
数值类型包括整形int
, BigInt
,以及浮点型double
,int
是64bit的,超出这个范围使用Bigint
。
数值类型的字面值在编译期可以确定,所以使用const
声明数值常量。
const A = 3;
const B = 9;
const C = A * B;
字符串
var str = "可以使用双引号字符串";
var str = '也可以向JS一样使用单引号字符串'
var str = "字符串可以" + "通过运算符链接";
var str = "像Kotlin一样 $exprName 使用字符串模板参数";
var str = """
像kotlin一样,
三个双引号或者单引号内的文字可以随意换行
也无需转义
""";
var str = '相邻字符串 '
'不使用加号'
" 也会连接成一个字符串";
布尔型
bool
表示布尔型,就像Java的Boolean
,但是如前所述bool
的默认值是null
,需在初始化时显式的设置初值
List
Dart中没有Array只有List,Java中经常会纠结于Array与List的选择,不让用户做选择才是好产品。
List的API与Java很相近,但是Dart允许List像Array或者Kotlin的listOf
一样使用字面值创建
// list的类型为List<Int>
final list = [1, 3, 5, 7, 9];
print(list[1]); // 3
Dart2.3开始,加入了spread
操作符进行list的展开,spread
借鉴了ES6的三点语法
final listA = [1, 2, 3, 4];
final listB = [...listA, 5, 6, 7, 8, 9];
print(listB); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
Dart2.3还加入Collection-If
功能,在list内可以写条件表达式;
final list = [
if (true) 1,
if (false) 2,
3
];
print(list); // [1, 3]
以及Collection-For
功能,list内写循环表达式
final listA = [1, 2, 3, 4];
final listB = [
for (var a in listA) a * 2,
];
print(listB); // [2, 4, 6, 8]
Map
Dart的Map的API与Java的几乎一样,但是允许字面值创建Map
var map = {
1:"壹",
2:"贰", // 允许尾逗号的存在,据说Kotlin 1.4 中也准备支持尾逗号
};
print(map[1]); // "壹"
print(map[3]); // null
Set
API几乎与Java的一样,同样可以字面值创建
final s = {1, 2, 1, 2, 1, 2};
print(s); // {1, 2}
符号文字(Rune)
Rune是UTF-32编码的字符串。它可以通过文字转换成符号表情或者代表特定的文字。
var clapping = '\u{1f44f}';
print(clapping); // 👏
Java中没有专用的Rune类型,通过\uXXXX
的String表示Unicode字符,例如
String s = "\u00X1";
符号(Symbol)
Symbol可以看作C中的宏,表示编译时的一个常量,使用#
后跟一个标识符表示。
在Java和Kotlin中没有对应的类型,在ruby中倒是有Symbol类型的存在。
main() {
print(i);
switch(i){
case #A: ///#A是一个Symbol
print("A");
break;
case #B:
print("B");
break;
}
var b = new Symbol("b");
print(#b == b); ///#b是一个Symbol
}
Symbol
和Rune
虽然在Java和Kotlin中不存在对应的类型,但在使用中也比较少,所以不会成为学习Dart的障碍。