Dart设计时应该是借鉴了Java和JavaScript,同时又引入了一些现代编程语言的特性,如空安全。
1.var关键字
类似于JavaScript中的var,它可以接收任何类型的变量,但最大的不同是Dart中var变量一旦赋值,类型便会确定,则不能改变其类型,和Swift一样。
var str = "hello world";
str = 1000;
//在dart中会报错,因为变量str的类型已经确定为String,类型一旦确定后则不能再改变其类型。
上面的代码在JavaScript是没有问题的,前端开发需要注意下。因为Dart本身是一个强类型语言,任何变量都有明确的类型,当用var声明一个变量后,dart在编译时会根据第一次赋值数据的类型来推断其类型,编译结束后其类型就已经被确定了,而JavaScript是纯粹的弱类型脚本语言,var只是变量的声明方式而已。
- dynamic和object
object是Dart所有对象的根基类,也就是在Dart中所有类型都是Object的子类(包裹Function和Null),所以任何类型的数据都可以赋值给Object声明的对象,dynamic与object声明的变量都可以赋值任意对象,且后期可以改变赋值的类型。
dynamic t;
object x;
t = "hello world";
x = "hello dart";
//下面代码没有问题
t = 1000;
x = 1000;
dynamic与Object不同的是dynamic声明的对象编译器会提供所有的可能得组合,而Object声明的对象只能使用Object的属性和方法,否则编译器会报错
dynamic a;
Object b = "";
main(){
a = "";
printLengths();
}
printLengths(){
//正常
print(a.length);
// 报错 The getter 'length' is not defined for the class 'Object'
print(b.length);
}
dynamic的这个特点使得我们在使用它时需要格外注意,这很容易引入一个运行时错误,比如下面代码在编译时不会报错,而在运行时会报错
print(a.xx);//a是字符串,没有“xx”属性,编译时不会报错,运行时会报错
3.final和const
如果您从未打算更改一个变量,那么使用final和const,不是var,也不是一个类型。一个final变量只能被设置一次,两者区别在于,
const变量是一个编译时常量(编译时直接替换为常量值),final变量在第一次使用时被初始化。被final或者const修饰的变量,变量类型可以省略。
final str = "hello wordld";
//final String str = "hello world";
const str1 = "hello dart";
//const String str1 = "hello dart";