一、概述

Dart 内置支持下面这些类型:

  • numbers
    • int 整数值,其取值通常位于 -253 和 253 之间。
    • double (64-bit 双精度) 浮点数,符合 IEEE 754 标准。
  • strings
  • booleans
  • lists (也被称之为 arrays)
  • maps
  • runes (用于在字符串中表示 Unicode 字符)
  • symbols

二、数字

参考 intdoublenum 的相关 API 文档。 也可参考 dart:math section

创建数字:

  1. // 整数
  2. var x = 1;
  3. var hex = 0xDEADBEEF;
  4. var bigInt = 34653465834652437659238476592374958739845729;
  5. // 浮点数
  6. var y = 1.1;
  7. var exponents = 1.42e5;

位移操作符

  1. assert((3 << 1) == 6); // 0011 << 1 == 0110
  2. assert((3 >> 1) == 1); // 0011 >> 1 == 0001
  3. assert((3 | 4) == 7); // 0011 | 0100 == 0111

字符串转换为数字

通过 parse 将字符串转换为数字:

  1. assert(int.parse('42') == 42);
  2. assert(int.parse('0x42') == 66);
  3. assert(double.parse('0.50') == 0.5);
  4. assert(num.parse('42') is int);
  5. assert(num.parse('0x42') is int);
  6. assert(num.parse('0.50') is double);

带进制转换:通过添加 radix 参数,指定整数的进制基数

  1. assert(int.parse('42', radix: 16) == 66);
  2. assert(int.parse('22', radix: 10) == 22);

数字转换为字符串

通过 toString 方法将数字转换为字符串。

  1. // 整型转换为字符串类型。
  2. assert(42.toString() == '42');
  3. // 双浮点型转换为字符串类型。
  4. assert(123.456.toString() == '123.456');
  5. // 指定小数点后的位数。
  6. assert(123.456.toStringAsFixed(2) == '123.46');
  7. // 指定有效数字的位数。
  8. assert(123.456.toStringAsPrecision(2) == '1.2e+2');
  9. assert(double.parse('1.2e+2') == 120.0);

三、字符串

参考 string。 另请参考 StringBuffer, Pattern, RegExp,Match 的 API 文档。

字符串是不可变的对象,也就是说字符串可以创建但是不能被修改。 所有针对字符串进行处理的方法都是返回一个新的字符串。

创建字符串

字符串可以使用单引号或双引号包裹

字符串插值

  1. var s = 'world';
  2. print('Hello $s'); // Hello world
  3. var num = 1;
  4. print('${num + 1}'); // 2

字符串拼接

  1. print('Hello' + 'world')

三引号字符串

  1. print(
  2. '''
  3. Hello
  4. world
  5. '''
  6. );

Raw字串

  1. print(r"In a raw string, even \n isn't special."); // \n 将不会触发换行

搜索

  1. // 检查一个字符串是否包含另一个字符串。
  2. assert('Never odd or even'.contains('odd'));
  3. // 一个字符串是否以另一个字符串为开头?
  4. assert('Never odd or even'.startsWith('Never'));
  5. // 一个字符串是否以另一个字符串为结尾?
  6. assert('Never odd or even'.endsWith('even'));
  7. // 查找一个字符串在另一个字符串中的位置。
  8. assert('Never odd or even'.indexOf('odd') == 6);

截取

  1. // 抓取一个子字符串。
  2. assert('Never odd or even'.substring(6, 9) == 'odd');

拆分

通过 split 将字符串拆分为列表

  1. // 使用字符串模式分割字符串。
  2. var parts = 'structured web apps'.split(' ');
  3. assert(parts.length == 3);
  4. assert(parts[0] == 'structured');

字符串本身也是可以通过下标索引的

  1. // 通过下标获取 UTF-16 编码单元(编码单元作为字符串)。
  2. assert('Never odd or even'[0] == 'N');

使用 split() 传入一个空字符串参数,得到一个所有字符的 list 集合

  1. for (var char in 'hello'.split('')) {
  2. print(char);
  3. }

获取一个字符串的所有 UTF-16 编码单元。

  1. var codeUnitList = 'Never odd or even'.codeUnits.toList();
  2. assert(codeUnitList[0] == 78);

转换

通过 toUpperCasetoLowerCase 进行大小写转换

  1. // 转换为首字母大写。
  2. assert('structured web apps'.toUpperCase() == 'STRUCTURED WEB APPS');
  3. // 转换为首字母小写。
  4. assert('STRUCTURED WEB APPS'.toLowerCase() == 'structured web apps');

去空串

通过 trim 去除字符串收尾的空字符串

  1. // Trim a string.
  2. assert(' hello '.trim() == 'hello');
  3. // 检查字符串是否为空。
  4. assert(''.isEmpty);
  5. // 空格字符串不是空字符串。
  6. assert(' '.isNotEmpty);

替换

字符串查找替换:

  1. var str = 'Hello, NAME! NAME!';
  2. var greeting = str.replaceAll('NAME', 'Xiaoyu'); // var str = 'Hello, NAME! NAME!';

正则查找替换:

  1. var str = 'Hello, NAME! NAME!';
  2. var greeting = str.replaceAll(RegExp('NAME'), 'Xiaoyu'); // var str = 'Hello, NAME! NAME!';

四、列表和数组

参考:List class

列表和数组,或称为有序集合,下标从0开始

  1. var list = [1, 2, 3];
  2. assert(list.length == 3);
  3. assert(list[1] == 2);
  4. list[1] = 1;
  5. assert(list[1] == 1);

在 list 字面量之前添加 const 关键字,可以 定义一个不变的 list 对象(编译时常量):

  1. var constantList = const [1, 2, 3];

相关内容:
📃 集合类

五、字典

参考:Map class

  1. var gifts = {
  2. 'first' : 'partridge',
  3. 'second': 'turtledoves',
  4. 'fifth' : 'golden rings'
  5. };
  6. var nobleGases = {
  7. 2 : 'helium',
  8. 10: 'neon',
  9. 18: 'argon',
  10. };
  11. var gifts = new Map();
  12. gifts['first'] = 'partridge';
  13. gifts['second'] = 'turtledoves';
  14. gifts['fifth'] = 'golden rings';
  15. var nobleGases = new Map();
  16. nobleGases[2] = 'helium';
  17. nobleGases[10] = 'neon';
  18. nobleGases[18] = 'argon';

如果所查找的键不存在,则返回 null:

  1. var gifts = {'first': 'partridge'};
  2. assert(gifts['fifth'] == null);

使用 .length 来获取 map 中键值对的数目:

  1. var gifts = {'first': 'partridge'};
  2. gifts['fourth'] = 'calling birds';
  3. assert(gifts.length == 2);

同样使用 const 可以创建一个 编译时常量的 map:

  1. final constantMap = const {
  2. 2: 'helium',
  3. 10: 'neon',
  4. 18: 'argon',
  5. };
  6. // constantMap[2] = 'Helium'; // Uncommenting this causes an error.

相关内容:
语雀内容

空值检测

针对不同类型的值,有不同的检测方法

  1. // Check for an empty string.
  2. var fullName = '';
  3. assert(fullName.isEmpty);
  4. // Check for zero.
  5. var hitPoints = 0;
  6. assert(hitPoints <= 0);
  7. // Check for null.
  8. var unicorn;
  9. assert(unicorn == null);
  10. // Check for NaN.
  11. var iMeantToDoThis = 0 / 0;
  12. assert(iMeantToDoThis.isNaN);

类型判断

通过 is 关键字可以判断变量属于什么类型(或属于某个类):

  1. var i = 0;
  2. print(i is int); // true
  3. print(i is num); // true
  4. print(i is List); // false
  5. print(i is Object); // true

参考资料