Dart - 内置类型(num、bool、String)
前面我们提到了Dart是静态类型语言,但它可以用var动态定义变量,然后由编译器进行推断,也可以用静态类型来精准地声明变量,这篇文章就是来介绍Dart内置的类型。
学前须知
-
默认情况下,未初始化的变量的值都是 null,无论是全局变量还是局部变量
-
前面我们支持Dart 的一个特性就是一切皆对象,它是类型安全的语言,所有类型都是对象类型,都继承自最顶层类型 Object,因此一切变量的值都是类的实例,数字、布尔值也是继承自 Object 的对象,甚至连
函数
、null
、操作符
都是类的实例。
Dart 语言的类型:
汇总如下:
- numbers
- strings
- booleans
- lists (也被称为 arrays)
- sets
- maps
- runes (用于在字符串中表示 Unicode 字符)
- symbols
概括基本含义:
Dart 内置类型简介详细介绍
1、numbers
Dart 的数值类型 是num,有两种子类:int
和double
。分别是 64 位 的int
和符合 IEEE 754 标准的 64 位 double
。前者代表整数类型,而后者则是浮点数类型。
定义
-
int
整数值;长度不超过 64位,具体取值范围依赖于不同的平台。在 DartVM 上其取值位于 -263 至 263 - 1 之间。编译成 JavaScript 的 Dart 使用 JavaScript 数字,其允许的取值范围在 -253 至 253 - 1 之间。 -
double
64位的双精度浮点数字,且符合 IEEE 754 标准。
num 中定义了一些基本的运算符比如 +、-、*、/ 等,还定义了 abs()
、ceil()
和 floor()
等方法(位运算符,比如 » 定义在 int 中)。如果 num 及其子类不满足你的要求,比如需要三角函数、指数、对数、平方根等高级函数,可以查看 dart:math 库中的 API。
具体使用
- 整数是不带小数点的数字,下面是一些定义整数字面量的例子:
var x = 1;
var hex = 0xDEADBEEF;
- ️如果一个数字包含了小数点,那么它就是浮点型的。下面是一些定义浮点数字面量的例子:
var y = 1.1;
var exponents = 1.42e5;
- 下面是字符串和数字之间转换的方式:
// String -> int
var one = int.parse('1');
assert(one == 1);
// String -> double
var onePointOne = double.parse('1.1');
assert(onePointOne == 1.1);
// int -> String
//️(由于一切皆变量,num变量可以直接调用方法,没有类似Java基本类型变量的装箱和拆箱)
String oneAsString = 1.toString();
assert(oneAsString == '1');
// double -> String
String piAsString = 3.14159.toStringAsFixed(2);
assert(piAsString == '3.14');
- 整型支持传统的位移操作,比如移位(<<、>>)、按位与(&)、按位或( ),例如:
assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 >> 1) == 1); // 0011 >> 1 == 0001
assert((3 | 4) == 7); // 0011 | 0100 == 0111
️ " 运算符也是一种类型,继承自 num"
- 数字字面量为编译时常量。很多算术表达式只要其操作数是常量,则表达式结果也是编译时常量。️
const msPerSecond = 1000;
const secondsUntilRetry = 5;
const msUntilRetry = secondsUntilRetry * msPerSecond;
2、boolean
Dart 使用 bool
关键字表示布尔类型,布尔类型只有两个对象 true
和 false
,两者都是编译时常量。
️Dart 的类型安全不允许你使用类似 if (nonbooleanValue)
或者 assert (nonbooleanValue)
这样的代码检查布尔值。相反,你应该总是显示地检查布尔值,比如像下面的代码这样:
// 检查是否为空字符串 (Check for an empty string).
var fullName = '';
assert(fullName.isEmpty);
// 检查是否小于等于零。
var hitPoints = 0;
assert(hitPoints <= 0);
// 检查是否为 null。
var unicorn;
assert(unicorn == null);
// 检查是否为 NaN。
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);
3、strings
Dart 字符串是 UTF-16 编码的字符序列。可以使用单引号或者双引号来创建字符串:
var s1 = '使用单引号创建字符串字面量。';
var s2 = "双引号也可以用于创建字符串字面量。";
var s3 = '使用单引号创建字符串时可以使用斜杠来转义那些与单引号冲突的字符串:\'。';//️
var s4 = "而在双引号中则不需要使用转义与单引号冲突的字符串:'";//️
- 可以在字符串中以
${表达式}
的形式使用表达式,如果表达式是一个标识符,可以省略掉{}
。如果表达式的结果为一个对象,则 Dart 会调用该对象的toString
方法来获取一个字符串。
var s = '字符串插值';
assert('Dart 有$s,使用起来非常方便。' == 'Dart 有字符串插值,使用起来非常方便。');
assert('使用${s.substring(3,5)}表达式也非常方便' == '使用插值表达式也非常方便。');
️"== 运算符判断两个对象的内容是否一样,如果两个字符串包含一样的字符编码序列,则表示相等。"
- 可以使用
+
运算符将两个字符串连接为一个,也可以将多个字符串挨着放一起变为一个:
var s1 = '可以拼接'
'字符串'
"即便它们不在同一行。";
assert(s1 == '可以拼接字符串即便它们不在同一行。');//️
var s2 = '使用加号 + 运算符' + '也可以达到相同的效果。';
assert(s2 == '使用加号 + 运算符也可以达到相同的效果。');
- 可以使用三个单引号或者三个双引号创建多行字符串:
var s1 = '''
你可以像这样创建多行字符串。
''';
var s2 = """这也是一个多行字符串。""";
- ️在字符串前加上
r
作为前缀创建 “raw” 字符串(即不会被做任何处理(比如转义)的字符串):
var s = r'在 raw 字符串中,转义字符串 \n 会直接输出 “\n” 而不是转义为换行。';
- 字符串字面量是一个编译时常量,只要是编译时常量都可以作为字符串字面量的插值表达式:
//可以将下面三个常量作为字符串插值拼接到字符串字面量中。
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant string';
// 而下面三个常量则不能作为字符串插值拼接到字符串字面量。
var aNum = 0;
var aBool = true;
var aString = 'a string';
const validConstString = '$aConstNum $aConstBool $aConstString';
// const invalidConstString = '$aNum $aBool $aString';