第124期:Dart基本知识(内置类型01)

740 阅读2分钟

封面图

img_v2_af31be37-a86c-4321-81d8-1d8b9a3f689g.jpg

内置类型

Dart有自己的内置类型,和JS相似:

  • Numbers类型。如:int , double
  • Strings类型。如:String
  • Booleans类型。如:bool
  • Lists类型。如:List,就是我们熟知的Array数组
  • Sets类型。如:Set集合
  • Maps类型。如:Map映射
  • Runes类型。通常由characters(字符)API替换
  • Symbols类型。如:Symbol
  • NULL类型。

在Dart中,每个变量都是对象的实例,所以我们可以用构造器去初始化变量。

有些内置对象有自己的构造器,比如我们用Map()去创建一个map对象。

有些对象有自己的特殊角色,比如:

  • Object是除了NULL之外的所有类型的父类
  • Enum是枚举类型enums的父类
  • Future和 Stream: 用来做异步调用
  • Iterable用来做循环或者异步迭代器
  • Never表示表达式永远无法成功完成计算。最常用于总是引发异常的函数。
  • dynamic:要禁用静态检查
  • void: 通常用作返回类型

Numbers类型

数值有两种类型:

  • int

整数不大于64位,具体取决于平台。在原生平台上,值可以从263到263-1。在web上,整数值表示为跟JavaScript中一样类型的数字(64位浮点值,无小数部分),可以从-253到253-1。

  • double

EEE 754标准规定的64位(双精度)浮点数。

int和double都是num的子类型。num类型包括基本运算符,如+、-、/和*,并且在其他方法中还可以找到abs()、ceil()和floor()等方法。

int是整数,没有小数部分,如果有小数部分则是double类型。

// int
var x = 1;
var hex = 0xDEADBEEF;
// double
num x = 1; // x can have both int and double values
x += 2.5;

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

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

Strings 字符串类型

字符串(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.";

和JS一样,我们可以将字符串放在${}表达式中。如果表达式是标识符,则可以跳过花括号,为了获得与对象对应的字符串,Dart会调用对象的toString()方法。

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

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.""";

Booleans 布尔类型

为了表示布尔值,Dart有一个名为bool的类型。只有两个对象具有bool类型:布尔文本true和false,它们都是编译时常量。

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

// Check for an empty string.
var fullName = '';
assert(fullName.isEmpty);

// Check for zero.
var hitPoints = 0;
assert(hitPoints <= 0);

// Check for null.
var unicorn;
assert(unicorn == null);

// Check for NaN.
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);

都需要显示的调用对应方法或显示的做判断来做相应的检查。

Lists类型 JS中的数组

也许几乎每种编程语言中最常见的集合是数组或有序对象组。在Dart中,数组是List对象,所以大多数人只称它们为List。

var list = [1, 2, 3];

Dart推断List的类型为list<int>。如果尝试将非整数对象添加到此列表,分析器或运行时将引发错误。

要创建一个编译时常量的列表,请在列表文本之前添加const

var constantList = const [1, 2, 3];
// constantList[1] = 1; // This line will cause an error.

但是在JS中没有这种写法,这种写法在JS中会报错

var a = const 23;
// Uncaught SyntaxError: Unexpected token 'const'

支持扩展算子,(…)和空感知扩展算子(?),它们提供了将多个值插入集合的简洁方式。

在js中叫扩展运算符...,问号很多人不知道叫什么,这里统一给出标准答案:?空感知扩展运算符(空感知扩展算子)

Dart还提供了collection ifcollection for,可以使用它们使用条件(if)和重复(for)构建集合。

  • IF
var nav = ['Home', 'Furniture', 'Plants', if (promoActive) 'Outlet'];
  • FOR
var listOfInts = [1, 2, 3];
var listOfStrings = ['#0', for (var i in listOfInts) '#$i'];
assert(listOfStrings[1] == '#1');