Dart内置有以下类型express
int 小于64bits 的整数值。这里须要注意的是,在Dart VM中支持从 -2^63 到 2^63 - 1,但编译成JavaScript后的取值范围为 -2^53 至 2^53 -1编程
double 64-bit(双精度)浮点数, 符合IEEE 754 标准数组
int
和 double
都是 num
的子类安全
整数是不带小数点的数字,Demo:app
var x = 1;
var hex = 0xDEADBEEF;
复制代码
若是有小数点,则是 double, Demo:编程语言
var y = 1.1;
var exponents = 1.42e5;
复制代码
Dart 2.1中,integer 会在须要的时候自动转换成 doubles函数
double z = 1; // 至关于 double z = 1.0
复制代码
须要注意的是:在Dart 2.1以前,上述写法会有类型转换错误测试
下面教你如何在 string 和 number 之间互相转换ui
// 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');
复制代码
int型定义了传统的位运算操做 shift(<<,>>),AND(&), OR(|),Demo:this
assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 >> 1) == 1); // 0011 >> 1 == 0001
assert((3 | 4) == 7); // 0011 | 0100 == 0111
复制代码
numbers是编译时的常量,许多算术表达式也是编译时的常量,只要是他们的操做也是编译时的常量,等同于 numbers, 举个例子
const msPerSecond = 1000;
const secondsUntilRetry = 5;
const msUntilRetry = secondsUntilRetry * msPerSecond;
复制代码
Dart string 是一系列UTF-16代码单元,你可使用单引号或双引号来建立字符串:
var s1 = '单引号定义';
var s2 = "双引号定义";
var s3 = '转译符使用\'';
var s4 = "...其余标点符号定义";
复制代码
你可使用${expression}
将表达式的值放在字符串中。 若是表达式是标识符,则能够跳过{}
。 为了得到对应于对象的字符串,Dart调用对象的toString()
方法。
var s = 'string interpolation';
assert('Dart has $s, which is very handy.' ==
'Dart has string interpolation, ' +
'which is very handy.');
assert('That deserves all caps. ' +
'${s.toUpperCase()} is very handy!' ==
'That deserves all caps. ' +
'STRING INTERPOLATION is very handy!');
复制代码
注意: == 运算符测试两个对象是否等效。 若是两个字符串包含相同的代码单元序列,则它们是等效的。
你可使用相邻的字符串或+
运算符来链接字符串:
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.""";
复制代码
你能够经过在其前面加上r来建立“raw”字符串:
var s = r'In a raw string, not even \n gets special treatment.';
复制代码
字符串是编译时常量,只要任何插值表达式是一个编译时常量,其值为null或数值,字符串或布尔值。
// These work in a const string.
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant string';
// These do NOT work in a const string.
var aNum = 0;
var aBool = true;
var aString = 'a string';
const aConstList = [1, 2, 3];
const validConstString = '$aConstNum $aConstBool $aConstString';
// const invalidConstString = '$aNum $aBool $aString $aConstList';
复制代码
为了从新定义boolean类型的值,Dart有一个名字叫 bool
的类型。只有两个对象有bool类型:true
和false
,这两个编译时常量。 Dart的类型安全(type-safe)意味着你不能使用if(nonbooleanValue)
或assert(nonbooleanValue)
之类的代码。 相反,明确检查值,以下所示:
// 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);
复制代码
也许几乎每种编程语言中最多见的集合是数组或有序的对象组。 在Dart中,数组是List
对象,所以大多数人只是将它们称为列表。
Dart列表文字看起来像JavaScript
数组文字。 这是一个简单的Dart列表:
var list = [1, 2, 3];
复制代码
注意:Dart推断列表的类型为List 时,若是尝试将非整数对象添加到此列表,则分析器或运行时会引起错误。
列表使用从零开始的索引,其中0
是第一个元素的索引,list.length - 1
是最后一个元素的索引。 你能够得到列表的长度并像在JavaScript中同样引用列表元素:
var list = [1, 2, 3];
assert(list.length == 3);
assert(list[1] == 2);
list[1] = 1;
assert(list[1] == 1);
复制代码
要建立一个编译时常量的列表,请在列表以前添加const:
var constantList = const [1, 2, 3];
// constantList[1] = 1; // Uncommenting this causes an error.
复制代码
Dart 2.3引入了展开运算符(...
)和空值感知展开运算符(...?
),它提供了一种将多个元素插入集合的简洁方法。
例如,你可使用展开运算符(...
)将列表的全部元素插入另外一个列表:
var list = [1, 2, 3];
var list2 = [0, ...list];
assert(list2.length == 4);
复制代码
若是展开运算符右侧的表达式可能为null,则能够经过使用支持null的展开运算符(...?
)来避免异常:
var list;
var list2 = [0, ...?list];
assert(list2.length == 1);
复制代码
Dart 2.3还引入了collection if 和 collection for,你可使用它来使用条件(if
)和循环(for
)来构建集合。
Demo:
//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');
复制代码
Dart中的set是一组无序惟一items的集合。
虽然Set 类型已经成为Dart核心部分之一,可是 set表达式是在 Dart2.2 中介绍
Demo:
var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
复制代码
注意:Dart会推断类型
Set<String>
中的元素,若是添加了一个错误的类型到set中,解析器或者运行时会出现错误。
建立一个空的set:
var names = <String>{};
// Set<String> names = {}; // 这样建立也能够
// var names = {}; // 可是这样建立的事一个map,而不是set
复制代码
set中添加item方法:
var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);
复制代码
用.length
获取set 长度
var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);
assert(elements.length == 5);
复制代码
建立一个set 做为编译时常量, 在 set 表达式前添加 const
final constantSet = const {
'fluorine',
'chlorine',
'bromine',
'iodine',
'astatine',
};
// constantSet.add('helium'); // Uncommenting this causes an error.
复制代码
在 Dart2.3中, sets 支持展开操做符( ...
和 ...?
) 还有集合的 ifs 和 fors, 就和 lists 同样。
一般来讲, map 是结合了 keys 和 values 的一个对象,keys 和values 均可以做为一个类型对象。每一个key只能出现一次,可是value能够出现屡次。 建立一个Demo:
var gifts = {
// Key: Value
'first': 'partridge',
'second': 'turtledoves',
'fifth': 'golden rings'
};
var nobleGases = {
2: 'helium',
10: 'neon',
18: 'argon',
};
复制代码
注意: Dart 会推断Map中的数据类型,例如:Map<String,String> 和 Map<int,String>, 若是添加错误的类型到Map中,解析器或者运行时会报错。
你可使用Map的构造函数建立相同的对象
var gifts = Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';
var nobleGases = Map();
nobleGases[2] = 'helium';
nobleGases[10] = 'neon';
nobleGases[18] = 'argon';
复制代码
也许你会指望用
new Map()
来代替Map()
, 在Dart2中,new
关键词是可选的。
添加一个新的键值对到已经存在的map中,就像JavaScript:
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // Add a key-value pair
复制代码
若是须要查询的key不在 map 中,就会返回一个 null:
var gifts = {'first': 'partridge'};
assert(gifts['fifth'] == null);
复制代码
用.length
获取键值对的数量
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds';
assert(gifts.length == 2);
复制代码
用const
建立一个编译时常量map:
final constantMap = const {
2: 'helium',
10: 'neon',
18: 'argon',
};
// constantMap[2] = 'Helium'; // Uncommenting this causes an error.
复制代码
Dart2.3中,maps支持展开操做符(...
和...?
)而且集合 if和 for
在Dart中,runes是string 的UTF-32代码点数
什么是 UTF-32,点我知道
Unicode为世界上全部书写系统中使用的每一个字母,数字和符号定义惟一的数值。 因为Dart字符串是UTF-16的代码单元序列,所以在字符串中表示32位Unicode值须要特殊语法。
什么是 UTF-16,点我知道
因此Runes
是为了补充 Dart String
中不支持的UTF-32
而存在的。
表达Unicode代码点的经常使用方法是\uXXXX
,其中XXXX
是4位十六进制值。 例如,爱心符号(♥)是\u2665
。 要指定多于或少于4个十六进制数字,请将值放在大括号中。 例如,笑的表情符号(😆)是\u{1f600}
。
String类有几个属性可用于提取rune信息。 codeUnitAt
和codeUnit
属性返回16位代码单元。 使用runes属性获取字符串的rune。
main() {
var clapping = '\u{1f44f}';
print(clapping);
print(clapping.codeUnits);
print(clapping.runes.toList());
Runes input = new Runes(
'\u2665 \u{1f605} \u{1f60e} \u{1f47b} \u{1f596} \u{1f44d}');
print(new String.fromCharCodes(input));
}
//输出
//👏
//[55357, 56399]
//[128079]
//♥ 😅 😎 👻 🖖 👍
复制代码
Symbol对象表明在Dart程序中声明的运算符或标识符。
你可能永远不须要使用符号,可是它们对于按名称引用标识符的API来讲是无价之宝,由于最小化会更改标识符名称,但不会更改标识符符号。
要获取标识符的符号,请使用符号文字,该符号文字是#
,后跟标识符:
#radix
#bar
复制代码
符号表达式是编译时的常量