封面图
内置类型
Dart有自己的内置类型,和JS相似:
- Numbers类型。如:int , double
- Strings类型。如:String
- Booleans类型。如:bool
- Lists类型。如:List,就是我们熟知的Array数组
- Sets类型。如:Set集合
- Maps类型。如:Map映射
- Runes类型。通常由characters(字符)API替换
- Symbols类型。如:Symbol
- NULL类型。
在Dart中,每个变量都是对象的实例,所以我们可以用构造器去初始化变量。
有些内置对象有自己的构造器,比如我们用Map()去创建一个map对象。
有些对象有自己的特殊角色,比如:
Object是除了NULL之外的所有类型的父类Enum是枚举类型enums的父类Future和Stream: 用来做异步调用Iterable用来做循环或者异步迭代器Never表示表达式永远无法成功完成计算。最常用于总是引发异常的函数。dynamic:要禁用静态检查void: 通常用作返回类型
Numbers类型
数值有两种类型:
- int
整数不大于64位,具体取决于平台。在原生平台上,值可以从263到263-1。在web上,整数值表示为跟JavaScript中一样类型的数字(64位浮点值,无小数部分),可以从-253到253-1。
- double
EEE 754标准规定的64位(双精度)浮点数。
int和double都是num的子类型。num类型包括基本运算符,如+、-、/和*,并且在其他方法中还可以找到abs()、ceil()和floor()等方法。
int是整数,没有小数部分,如果有小数部分则是double类型。
// int
var x = 1;
var hex = 0xDEADBEEF;
// double
num x = 1; // x can have both int and double values
x += 2.5;
必要时,整数文字会自动转换为双精度:
double z = 1; // Equivalent to double z = 1.0
类型转化
以下是如何将字符串转换为数字,反之亦然:
// 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');
Strings 字符串类型
字符串(string对象)包含一系列UTF-16代码单元。您可以使用单引号或双引号创建字符串:
var s1 = 'Single quotes work well for string literals.';
var s2 = "Double quotes work just as well.";
var s3 = 'It's easy to escape the string delimiter.';
var s4 = "It's even easier to use the other delimiter.";
和JS一样,我们可以将字符串放在${}表达式中。如果表达式是标识符,则可以跳过花括号,为了获得与对象对应的字符串,Dart会调用对象的toString()方法。
可以使用相邻的字符串文字或+运算符连接字符串:
var s1 = 'String '
'concatenation'
" works even over line breaks.";
assert(s1 ==
'String concatenation works even over '
'line breaks.');
var s2 = 'The + operator ' + 'works, as well.';
assert(s2 == 'The + operator works, as well.');
创建多行字符串的另一种方法:使用带单引号或双引号的三引号。
var s1 = '''
You can create
multi-line strings like this one.
''';
var s2 = """This is also a
multi-line string.""";
Booleans 布尔类型
为了表示布尔值,Dart有一个名为bool的类型。只有两个对象具有bool类型:布尔文本true和false,它们都是编译时常量。
Dart的类型安全性意味着您不能使用if(nonbooleanValue)或assert(nonbouleanValue)之类的代码。相反,需要显式检查值,如下所示:
// Check for an empty string.
var fullName = '';
assert(fullName.isEmpty);
// Check for zero.
var hitPoints = 0;
assert(hitPoints <= 0);
// Check for null.
var unicorn;
assert(unicorn == null);
// Check for NaN.
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);
都需要显示的调用对应方法或显示的做判断来做相应的检查。
Lists类型 JS中的数组
也许几乎每种编程语言中最常见的集合是数组或有序对象组。在Dart中,数组是List对象,所以大多数人只称它们为List。
var list = [1, 2, 3];
Dart推断List的类型为list<int>。如果尝试将非整数对象添加到此列表,分析器或运行时将引发错误。
要创建一个编译时常量的列表,请在列表文本之前添加const:
var constantList = const [1, 2, 3];
// constantList[1] = 1; // This line will cause an error.
但是在JS中没有这种写法,这种写法在JS中会报错:
var a = const 23;
// Uncaught SyntaxError: Unexpected token 'const'
支持扩展算子,(…)和空感知扩展算子(?),它们提供了将多个值插入集合的简洁方式。
在js中叫扩展运算符...,问号很多人不知道叫什么,这里统一给出标准答案:?空感知扩展运算符(空感知扩展算子)
Dart还提供了collection if和collection for,可以使用它们使用条件(if)和重复(for)构建集合。
- 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');