内置类型
Dart 语言对以下类型有特殊支持
- 数字 (
int
,double
) - 字符串 (
String
) - 布尔值 (
bool
) - 记录 (
(value1, value2)
) - 函数 (
Function
) - 列表 (
List
, 也称为数组) - 集合 (
Set
) - 映射 (
Map
) - Runes (
Runes
;常被characters
API 替换) - Symbol (
Symbol
) - 值
null
(Null
)
这种支持包括使用字面量创建对象的能力。例如,'this is a string'
是一个字符串字面量,true
是一个布尔字面量。
因为 Dart 中的每个变量都指向一个对象——一个类的实例——你通常可以使用构造函数来初始化变量。一些内置类型有自己的构造函数。例如,你可以使用 Map()
构造函数创建一个映射。
还有一些其他类型在 Dart 语言中也扮演着特殊角色
Object
:除Null
外所有 Dart 类的超类。Enum
:所有枚举的超类。Future
和Stream
:用于异步编程。Iterable
:用于for-in 循环和同步生成器函数。Never
:表示表达式永远无法成功完成求值。最常用于总是抛出异常的函数。dynamic
:表示你希望禁用静态检查。通常你应该改用Object
或Object?
。void
:表示一个值永远不会被使用。常用于作为返回类型。
Object
、Object?
、Null
和 Never
类在类层级结构中扮演着特殊角色。在理解空安全中了解这些角色。
数字
#Dart 数字有两种类型
int
- 不大于 64 位的整数值,取决于平台。在原生平台,值的范围是 -263 到 263 - 1。在 Web 上,整数值表示为 JavaScript 数字(没有小数部分的 64 位浮点值),范围是 -253 到 253 - 1。
double
- 根据 IEEE 754 标准指定的 64 位(双精度)浮点数。
int
和 double
都是 num
的子类型。num 类型包含基本运算符,例如 +、-、/ 和 *,以及 abs()
、ceil()
和 floor()
等方法。(位运算符,如 >>,定义在 int
类中。)如果 num 及其子类型没有你想要的功能,dart:math
库可能会有。
整数是没有小数点的数字。以下是一些定义整数字面量的示例
var x = 1;
var hex = 0xDEADBEEF;
如果一个数字包含小数点,它就是一个 double。以下是一些定义 double 字面量的示例
var y = 1.1;
var exponents = 1.42e5;
你也可以将变量声明为 num 类型。如果这样做,该变量可以同时拥有整数和 double 值。
num x = 1; // x can have both int and double values
x += 2.5;
必要时,整数字面量会自动转换为 doubles
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');
int
类型指定了传统的位移(<<
、>>
、>>>
)、补码(~
)、按位与(&
)、按位或(|
)和按位异或(^
)运算符,这些运算符对于操作和屏蔽位字段中的标志非常有用。例如
assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 | 4) == 7); // 0011 | 0100 == 0111
assert((3 & 4) == 0); // 0011 & 0100 == 0000
更多示例,请参阅位运算符和移位运算符部分。
数字字面量是编译时常量。许多算术表达式也是编译时常量,只要它们的运算数是求值为数字的编译时常量。
const msPerSecond = 1000;
const secondsUntilRetry = 5;
const msUntilRetry = secondsUntilRetry * msPerSecond;
更多信息,请参阅Dart 中的数字。
你可以使用一个或多个下划线 (_
) 作为数字分隔符,使长数字字面量更易读。多个数字分隔符允许更高级别的分组。
var n1 = 1_000_000;
var n2 = 0.000_000_000_01;
var n3 = 0x00_14_22_01_23_45; // MAC address
var n4 = 555_123_4567; // US Phone number
var n5 = 100__000_000__000_000; // one hundred million million!
字符串
#Dart 字符串 (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.";
你可以使用 ${
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
来创建“原始”字符串
var s = r'In a raw string, not even \n gets special treatment.';
有关如何在字符串中表示 Unicode 字符的详细信息,请参阅Runes 和字素簇。
字符串字面量是编译时常量,只要任何内插表达式是求值为 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';
有关使用字符串的更多信息,请查看字符串和正则表达式。
布尔值
#为了表示布尔值,Dart 有一个名为 bool
的类型。只有两个对象属于 bool 类型:布尔字面量 true
和 false
,它们都是编译时常量。
Dart 的类型安全意味着你不能使用诸如 if (非布尔值)
或 assert (非布尔值)
这样的代码。而是要显式地检查值,像这样
// Check for an empty string.
var fullName = '';
assert(fullName.isEmpty);
// Check for zero.
var hitPoints = 0;
assert(hitPoints == 0);
// Check for null.
var unicorn = null;
assert(unicorn == null);
// Check for NaN.
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);
Runes 和字素簇
#在 Dart 中,runes 暴露字符串的 Unicode 码点。你可以使用 characters package 来查看或操作用户感知的字符,也称为Unicode(扩展)字素簇。
Unicode 为世界上所有书写系统中使用的每个字母、数字和符号定义了一个唯一的数值。由于 Dart 字符串是一系列 UTF-16 码元,因此在字符串中表达 Unicode 码点需要特殊语法。表达 Unicode 码点的通常方法是 \uXXXX
,其中 XXXX 是一个 4 位十六进制值。例如,心形字符 (♥) 是 \u2665
。要指定多于或少于 4 位十六进制数字,请将值放在花括号中。例如,笑脸表情符号 (😆) 是 \u{1f606}
。
如果你需要读取或写入单个 Unicode 字符,请使用 characters package 在 String 上定义的 characters
getter。返回的 Characters
对象是作为字素簇序列的字符串。以下是使用 characters API 的示例
import 'package:characters/characters.dart';
void main() {
var hi = 'Hi 🇩🇰';
print(hi);
print('The end of the string: ${hi.substring(hi.length - 1)}');
print('The last character: ${hi.characters.last}');
}
输出结果,取决于你的环境,看起来像这样
dart run bin/main.dart
Hi 🇩🇰
The end of the string: ???
The last character: 🇩🇰
有关使用 characters package 操作字符串的详细信息,请参阅 characters package 的示例和API 参考。
Symbol
#一个 Symbol
对象表示 Dart 程序中声明的运算符或标识符。你可能永远不需要使用 symbol,但对于按名称引用标识符的 API 来说,它们是无价的,因为代码混淆会改变标识符名称,但不会改变标识符 symbol。
要获取标识符的 symbol,请使用 symbol 字面量,它只是在标识符前面加上 #
#radix
#bar
Symbol 字面量是编译时常量。