
2.2 Dart 的数据类型与操作符
接下来我们学习Dart 语言基础。我们知道,学习任何一门编程语言都要知道它的数据类型和操作符有哪些,有什么特点。本节我们将对Dart 的数据类型和操作符进行讲解。
2.2.1 Dart 中的数据类型
本节将主要介绍Dart 的数据类型。在介绍数据类型之前,我们先来介绍Dart 中变量的声明方法。
Dart 中变量的声明
Dart 中变量的声明方法和其他语言中的大同小异,不过也有一些自己的特点,常见的声明方法有以下三种。
1.使用var 关键字声明
在Dart 中,使用var 关键字声明变量与JavaScript 中的相似,var 可以接收任何类型的变量。但最大的不同是,Dart 中的var 变量一旦被赋值,其类型便会确定,不能再改变,示例如下。

Dart 中的任何变量都是有确定类型的,在使用var 关键字声明一个变量后,Dart 在编译时会根据第一次赋值的数据类型来推断变量类型,所以更改类型在Dart 中会报错。
2.使用dynamic 和Object 关键字声明
Object 是Dart 所有对象的基类,Dart 中的所有对象、类型都是Object 的子类,所以任何类型的数据都可以赋给由Object 声明的变量。dynamic 与var 一样,用它声明的变量可以由任意类型的对象赋值。dynamic、Object 与var 的区别是,用dynamic 和Object 关键字声明的变量的类型在后期可以改变,示例如下。

dynamic 与Object 的区别是,对于用dynamic 关键字声明的变量,编译器会明确需要执行的操作,无须进行类型检测。当我们调用这个变量中不存在的方法时,编译器不会报错。而用Object 关键字声明的变量只能使用Object 定义的属性与方法,否则编译器会报错,示例如下。

3.使用final 和const 关键字声明
Dart 中final 和const 关键字的用法和其他语言中的类似,主要用于定义常量。其实常量是特殊的变量,只不过这个变量不会被更改。由final 关键字声明的常量和由const 关键字声明的常量的区别在于,const 常量是一个编译时常量,而final 常量是一个运行时常量,会在第一次使用时被初始化。通过final 或者const 关键字声明的常量,其类型声明可以省略,示例如下。

Dart 数据类型
了解了声明方法,我们再来了解Dart 的数据类型。Dart 支持几种基本数据类型:Number类型、String 类型、Boolean 类型、List 类型、Map 类型、Runes 类型、Symbol 类型。
1.Number 类型
Number 类型表示数值型数据类型,包括int 类型和double 类型两种。num 是int 和double类型的父类。int 类型的数值范围是-253 ~ 253-1;double 表示64 位双精度浮点数。定义Number数据类型的示例如下。

执行以上代码,输出结果如下。

2.String 类型
大家应该都很熟悉String 类型,即字符串类型。Dart 中的String 类型具有如下特点。
字符串是 UTF-16 编码的字符序列,可以使用单引号或双引号来定义。
可以在字符串中使用表达式,比如${expression}。
可以使用“+”操作符把多个字符串连接为一个字符串,也可以将多个带引号的字符串挨着写以达到同样的效果,更推荐第二种方式。
使用3 个单引号或双引号可以定义多行字符串。
使用 r 前缀可以定义一个原始字符串。
以下是一个对String 类型数值进行操作的示例,大家可以在这个示例中学会很多操作方法。

执行以上代码,输出结果如下。

3.Boolean 类型
Boolean 类型即布尔类型,Dart 中用bool 定义true 或false 数据类型,用法很简单。需要注意的是,有些写法在Dart 里不被支持,将其他编程语言里Boolean 类型的用法直接用在Dart里是行不通的。以下是一个在JavaScript 里被支持,但在Dart 里不被支持的用法示例。

4.List 类型
Dart 里使用List 类型来表示数据集合结构。下面我们来看一下Dart 中List 类型的用法,示例如下。


5.Map 类型
Dart 中的Map 类型用于存储键/值对(key-value),键是唯一的,值允许重复。下面我们来看一下Dart 中Map 类型的具体用法。


6.Runes 类型
Runes 类型用于声明Unicode 编码字符串(UTF-32 code points 等)。下面我们通过一个示例来看一下Dart 中Runes 类型的常见操作方法。


通过上面这段代码,我们就可以声明Unicode 编码字符串,并转为正常的字符串打印输出。执行以上代码,结果如图2-2 所示。

图2-2 Runes 类型示例运行结果
7.Symbol 类型
Symbol 类型使用Symbol 字面量来获取标识符的symbol 对象,即在标识符前面添加一个“#”符号,示例如下。

2.2.2 Dart 中的操作符
Dart 中的操作符有很多,比如加、减、乘、除、位移等运算操作符。Dart 的运算操作符和其他语言的运算操作符用法基本一样,大家可以对比着学习。这里列出Dart 中的操作符,如表2-5 所示。
表2-5 Dart 中的操作符

续表
