2.1 变量与常量 – 《简单易懂的Dart》

2.1.1 变量声明

以前开发过javascript等脚本语言的开发者应该知道,大多数脚本语言都是弱类型的,这意味着一个变量它没有指定的类型,使用时需要进行检查.

弱类型的变量使许多强类型语言的使用者感到头疼,他们无法接受变量可以存储任何类型值的现实.

所以Dart的变量声明在此基础上作了改进,可以同时满足两种开发者的需求.

在Dart语言中,声明变量有两种方式:

1.使用var声明(弱类型)

2.使用类型声明(强类型)

2.1.2 var声明

var声明和JavaScript的var效果几乎是等同的,这个关键字可以在当前作用域声明一个变量,我们可以将其值改为任意类型.

例如下面的代码,是完全可行的:

void main() {  
  var a;
  a=1;
  a="1";
  a=true;
  a=[1];
  a={"1":1};
}

在编辑时DartEditor不会提示错误,按下Ctrl+R,也不会报错.

并且,上面这段内容在JavaScript中也可以执行,可谓是与JavaScript高度兼容.

2.1.3 类型声明

类型声明Dart中声明变量的另一个方法.它在声明变量时直接规定了该变量所能接受的值的类型,在一些数据类型要求严格的程序中很有用处.

类型声明的方式和var声明是类似的,只是把var修改成相对应的类型名称.

Dart的基础类型有这几种,请注意大小写:

1.String(字符串)

2.int(整数型)

3.double(双精度浮点数型)

4.bool(布尔值)

5.List(列表)

6.Map(地图)

由于Dart语言大小写敏感的关系,请记住相应的类型名称,以免声明变量时出错.

使用类型声明的变量,在运行时会检查赋值的类型,不是同种类型就会报错.

例如下面这段代码,会报错:

void main() {  
  int a;
  a="1";
}

抛出异常

Unhandled exception:
type ‘String’ is not a subtype of type ‘int’ of ‘a’.

左右值都是同一类型时就能正常执行:

void main() {  
  int a;
  a=1;
}

2.1.4 取舍

究竟应该用var声明变量还是用类型声明变量?

这个问题现在仍在讨论中,既然二者同时存在,那么必有其意义.

面向对象编程语言,其所有内容都是对象,包括每个变量.

var提供了一个灵活的方式让使用者们尽情的享受变量,但它不够严谨,往往需要浪费时间去检查数据类型.

类型让程序显得严谨有序,符合其他语言的习惯,但又丧失了灵活性,降低了开发效率.

我推荐的做法是在编写严格API时尽量使用类型声明(规定使用),编写独立应用时尽量使用var声明(快速开发).

2.1.5 常量

JavaScript缺少的用户自定义常量在Dart中被补充回来.

常量的关键字为final,意味着被它修饰的是一个最终的量.

final可以像这样方便的使用在程序中:

void main(){  
  final a="http://www.blackglory.me";
  print(a);
}

作为一个常量,常量a只能在声明时确定初始值,这个过程称之为初始化.

常量在定义之后就不能再做修改,像下面的代码是会报错的:

void main(){  
  final a="http://www.blackglory.me";
  a="Hello,World";//报错!
  print(a);
}

另外,我们可以在final后加上类型声明,虽然被final修饰的对象不可改变,但为了保持代码整体的规范我建议这么做(仅在整个应用都使用类型声明的情况下).

2.1.6 类型接口

2.1.3 类型声明小节中的int和double实际上为类型接口num的子接口.

类型接口是多个类型的父接口,通过类型接口可以定义子接口类型.

目前Dart中int和double是num的子接口,所以声明变量类型时可以使用num来替代int或double.

这样一个变量就可以同时容纳int或者double类型,避免赋值时的类型冲突.比如下面这个例子:

void main(){  
  int a=1;
  double b=2.0;
  num c;
  c=a;
  print(c);
  c=b;
  print(b);
}