Dart的变量与内置类型

时间:2021-11-16 16:58:58

一.Dart 简介

Dart是谷歌发布的一门面向对象的开源编程语言,诞生于2011年10月10日,Dart是一种“结构化的Web编程”语言,在所有现代的浏览器和环境中提供高性能。

Dart主要用途分为三种:

  •   Flutter开发移动应用
  •   Dart webdev 开发浏览器应用
  •   Dart VM开发脚本或者服务器应用

下面即将开启Dart学习之旅

二.Dart语法

重要概念(Important concepts)

在学习Dart的时候,请牢记下面的一下事实和概念:

  •   所有能够使用变量引用的都是对象,每个对象都是一个类的实例。在Dart中甚至连数字、方法和null都是对象。所有的对象都继承与Object类。
  •   虽然Dart是强类型,但由于Dart可以推断类型,所以类型注释是可选的,当您不需要明确的类型时,可以使用dynamic类型。
  •  Dart支持泛型类型,像List<int>(整数类型)或者List<dynamic>(任何类型的对象)
  •   支持顶层函数(例如main()),以及绑定到类或者对象的函数(分别是静态方法和实例方法)。您还可以在函数中创建函数(嵌套函数或本地函数)。
  •   类似地,Dart支持*变量,以及绑定到类或对象的变量(静态变量和实例变量)。实例变量有时称为字段或属性
  •   与Java不同,Dart没有关键字public、proteched、private。如果标识符以下划线(_)开头,则它是其库的私有标识符。
  •   标识符可以以字母或下划线开头,然后这些字符和数字的任意组合
  •   Dart同时具有表达式和语句。例如,条件表达式条件 ? expr1 : expr2 ; 最后得到的值为expr1 或expr2,将其与没有值得if-else 语句进行比较,语句通常包含一个或多个表达式,但表达式不能直接包含语句。
  •   Dart工具可以报告两种类型的问题:警告和错误,警告只表明您的代码可能无法工作,但它们不会阻止您的程序执行。错误可以是编译时的,也可以是运行时的。编译时的错误完全阻止了您的程序执行,运行时错误会导致在执行代码时引发异常。

1.  变量

变量是一个引用,根据Dart中“万物皆对象”原则,即变量存储的都是对象的引用,或者说它们都是指向对象

1)  声明变量

声明可以有两种方式,一种是不指定类型,即使用var关键字

 var name = "Bob";

另一种是明确指定类型(Optional types)

String name = "Bob";

因为有类型推导,所以两种实现效果一样,官方推荐在函数内的本地变量尽量使用var声明。

在变量类型并不明确的情况下,可以使用dynamic关键字

dynamic name = "Bob";

2 )  默认值

没有初始化的变量自动获取一个默认值为null。类型为数字的变量如果没有初始化其值也是null,不要忘记数字类型也是对象。

var name;
var age;
print(name); // null
print(age); // null

2.  Final与const

如果一个变量的值不再修改,则使用final或者const代替var。

一个final变量只能赋值一次;一个const变量是编译时常量,const变量默认为final变量。顶层final变量与类变量在首次访问时才执行初始化。需要注意的是,实例变量可以为final,但是不能是const

Dart的变量与内置类型

// 常量
const bar = 1000;
// 常量计算也是常量
const atm = 0.15 * bar;

const 关键字不仅仅只能用来定义常量,也可以用来创建不变的值,还能定义构造函数为const类型的,这中类型的构造函数创建的对象是不可改变的。任何变量都可以有一个不变的值。

var foo = const[1,2,3];
final baz = const[2,3,4];

3.  内置类型

Dart内置支持下面这些类型

  •   numbers
  •   string
  •   boleans
  •   lists(或称arrays)
  •   sets
  •   maps
  •   runes(用于在字符串中表示Unicade字符)
  •   symbols

1)   Numbers(数值)

Dart支持两种类型的数字

int 整数值、double (双精度) 浮点数,两者都是num的子类。Num类型定义了基本的操作符,例如+-*/,还定义了abs()、ceil()、和floor()等函数。

2) 字符串(String)

Dart字符串使用单引号或者双引号来创建字符串;

String s1 = 'Single quotes work well for string literals.';
String s2 = "Double quotes work just as well.";

可以使用+操作符来把多个字符串连接为一个,也可以把多个字符串放到一起实现同样的功能

String s3 = 'String ''concatenation'
    ' works even over line breaks.';
String s4 = 'The + operator ' + 'work,as well.';
print(s3);
print(s4);

输出结果:

Dart的变量与内置类型

其中官方不建议使用+操作符连接字符串。

使用三个单引号或者双引号也可以创建多行字符串对象

String s5 = '''
You can create
multi-line strings like this one.
''';
String s6 = """
This is alse a 
multi-line string.
""";
print(s5);
print(s6);

输出结果:

Dart的变量与内置类型

通过提供一个r前缀可以创建一个“原始raw”字符串

var s = r"In a raw string, even \n isn't special.";
var ss = "In a raw string, even \n isn't special.";
print(s);
print(ss);

输出结果:

Dart的变量与内置类型

可以在字符串中使用表达式,用法为:${expression}。如果表达式是一个标识符,可以省略{},如果表达式的结果为一个对象,则Dart会调用对象的toString()函数来获取一个字符串

var str = 'string interpolation';
if("Dart has $str ,which is very handy." ==
    "Dart has string interpolation ,which is very handy."){
  print("yes");
}
if('Dart has ${str.toUpperCase()} ,which is very handy.' ==
 'Dart has STRING INTERPOLATION ,which is very handy.'){
   print("upperCase is yes");
}

3)  Booleans(布尔值)

为了代表布尔值,Dart有个名为bool的类型。只有两个对象是布尔类型的:true和false所创建的对象,这两个对象也都是编译时常量。

当Dart需要一个布尔值的时候,只有true对象才被认为是true,所有其他的值都是false,这点和javascript不一样,像1,“aString”以及someObject等值都认为是false。

Dart的变量与内置类型

Dart的变量与内置类型

Dart的变量与内置类型

如果在javascript中运行,则会打印Bob,在javascript中name是非null对象,所以为true,但在Dart的生产模式下运行,则不打印任何内容,原因是name != true;  name被转换为false了。如果在Dart检查模式运行,代码会抛出异常,表示变量name不是一个布尔值。

4)  Lists(列表)

也称array(有序集合)是所有编程语言中最常见的集合类型。在Dart中数组就是List对象。所以通常称之为lists。

var list = [1,2,3];
print("list长度为:"+list.length.toString()); //list长度为:3
print("第二个数值为:"+list[1].toString()); //第二个数值为:2
list[1] = 1;
print("修改后,第二个数值为:"+list[1].toString()); //修改后,第二个数值为:1

list可以使用const关键字,可以定义一个不变的list对象(编译时常量)

var constantList = const[1,2,3];

定义一个空的可变的list,尽量使用[],如(var points = []),如果您想创建一个不可变的list,护着其他自定义类型的集合,可以使用构造函数。

如果有必要还可以提供泛型类型

 var points = <Point>[];

5 )  Maps

通常来说,Map是一个键值对相关的对象。键和值可以是任何类型的对象。每个键出现一次,而一个值则可以出现多次。

下面是一些简单实例 

var gifts = {
  'frist':'partridge',
  'second':'turtldoves',
  'fifth':'golden rings'
};
var nobleGases = {
  2 :   'helium',
  10:   'neon',
  18:   'argon',
};

使用map构造函数也可以实现同样的功能:

var gifts2 = new Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';

var nobleGases2 = new Map();
nobleGases[2] = 'helium';
nobleGases[10] = 'neon';
nobleGases[18] = 'argon'; 

往map中添加新的键值对和在javascript中用法一样

 gifts['fourth'] = "calling birds"; // 添加新的键值对

获取map中的对象

 print(gifts['fourth']); //calling birds

使用length来获取map中键值对的数目:

print("gifts中总数为:"+gifts.length.toString()); //gifts中总数为:4

同样使用const可以创建一个编译时常量的map 

final constantMap = const {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};