内容

Dart 语言对以下内容提供特殊支持

此支持包括使用字面量创建对象的能力。例如,'this is a string' 是字符串字面量,而 true 是布尔字面量。

由于 Dart 中的每个变量都引用一个对象(的一个实例),因此通常可以使用构造函数来初始化变量。一些内置类型有自己的构造函数。例如,可以使用 Map() 构造函数创建映射。

其他一些类型在 Dart 语言中也具有特殊作用

  • Object:除 Null 之外所有 Dart 类的超类。
  • Enum:所有枚举的超类。
  • FutureStream:用于 异步支持
  • Iterable:用于 for-in 循环 和同步 生成器函数
  • Never:表示表达式永远无法成功完成求值。最常用于始终抛出异常的函数。
  • dynamic:表示要禁用静态检查。通常应改用 ObjectObject?
  • void:表示一个值永远不会被使用。通常用作返回类型。

ObjectObject?NullNever 类在类层次结构中具有特殊作用。在 了解空安全性 中了解这些作用。

数字

#

Dart 数字有两种类型

int
不超过 64 位的整数值,取决于平台。在原生平台上,值可以从 -263 到 263 - 1。在网络上,整数值表示为 JavaScript 数字(没有小数部分的 64 位浮点数),可以从 -253 到 253 - 1。
double
64 位(双精度)浮点数,由 IEEE 754 标准指定。

intdouble 都是 num 的子类型。num 类型包含基本运算符,如 +、-、/ 和 *,您还可以在其中找到 abs()ceil()floor() 等方法。(按位运算符,如 >>,在 int 类中定义。)如果 num 及其子类型没有您要找的内容,dart:math 库可能会有。

整数是没有小数点的数字。以下是定义整数文字的一些示例

dart
var x = 1;
var hex = 0xDEADBEEF;

如果一个数字包含小数点,则它是一个双精度浮点数。以下是定义双精度浮点数文字的一些示例

dart
var y = 1.1;
var exponents = 1.42e5;

您还可以将变量声明为 num。如果您这样做,则变量可以同时具有整数和双精度浮点数值。

dart
num x = 1; // x can have both int and double values
x += 2.5;

必要时,整数文字会自动转换为双精度浮点数

dart
double z = 1; // Equivalent to double z = 1.0.

以下是如何将字符串转换为数字,反之亦然

dart
// 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 类型指定传统的按位移位 (<<>>>>>)、补码 (~)、AND (&)、OR (|) 和 XOR (^) 运算符,这些运算符可用于操作和屏蔽位字段中的标志。例如

dart
assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 | 4) == 7); // 0011 | 0100 == 0111
assert((3 & 4) == 0); // 0011 & 0100 == 0000

有关更多示例,请参阅 按位和移位运算符 部分。

数字文字是编译时常量。只要它们的运算数是求值为数字的编译时常量,许多算术表达式也是编译时常量。

dart
const msPerSecond = 1000;
const secondsUntilRetry = 5;
const msUntilRetry = secondsUntilRetry * msPerSecond;

有关更多信息,请参阅 Dart 中的数字

字符串

#

Dart 字符串 (String 对象) 保存 UTF-16 代码单元序列。您可以使用单引号或双引号创建字符串

dart
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() 方法。

dart
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!');

您可以使用相邻的字符串文字或 + 运算符连接字符串

dart
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.');

要创建多行字符串,请使用带有单引号或双引号的三重引号

dart
var s1 = '''
You can create
multi-line strings like this one.
''';

var s2 = """This is also a
multi-line string.""";

您可以通过在字符串前加上 r 来创建一个“原始”字符串

dart
var s = r'In a raw string, not even \n gets special treatment.';

有关如何在字符串中表示 Unicode 字符的详细信息,请参阅 Unicode 字符和音节簇

只要任何插值表达式是求值为 null 或数字、字符串或布尔值的编译时常量,文字字符串就是编译时常量。

dart
// 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 类型:布尔文字 truefalse,它们都是编译时常量。

Dart 的类型安全性意味着您不能使用诸如 if (nonbooleanValue)assert (nonbooleanValue) 的代码。相反,显式检查值,如下所示

dart
// 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);

符文和音节簇

#

在 Dart 中,runes 公开字符串的 Unicode 代码点。您可以使用 characters 包 来查看或操作用户感知的字符,也称为 Unicode(扩展)字形簇。

Unicode 为所有书写系统中使用的每个字母、数字和符号定义一个唯一的数字值。由于 Dart 字符串是 UTF-16 代码单元的序列,因此在字符串中表示 Unicode 代码点需要特殊语法。表示 Unicode 代码点的通常方法是 \uXXXX,其中 XXXX 是 4 位十六进制值。例如,心形字符(♥)是 \u2665。要指定多于或少于 4 位十六进制数字,请将值放在大括号中。例如,笑脸表情(😆)是 \u{1f606}

如果您需要读取或写入单个 Unicode 字符,请使用 characters 包在 String 上定义的 characters getter。返回的 Characters 对象是字符串作为字形簇的序列。以下是使用 characters API 的示例

dart
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 包操作字符串的详细信息,请参阅 characters 包的 示例API 参考

符号

#

Symbol 对象表示 Dart 程序中声明的操作符或标识符。您可能永远不需要使用符号,但对于通过名称引用标识符的 API 来说,它们非常有价值,因为缩小会更改标识符名称,但不会更改标识符符号。

要获取标识符的符号,请使用符号文字,即 # 后跟标识符

#radix
#bar

符号文字是编译时常量。