变量 & 常量
变量
变量分 不指定类型 和 指定类型。前者就像你用 javaScript
一样,后者则像你用 typeScript
一样。
-
不指定类型有两种方法。
// in 1.dart // 1. var 定义 并且 没有初始值 var a; a = 'a is string'; a = 123; print(a); // 2 (dynamic 或者 Object 定义) , 无所谓有没有初始值 dynamic b; b = 'test'; b = 123; print(b); Object c = 'test'; c = 123; print(c);
不指定类型的变量就只是一个容器,什么数据都可以往里面装,因此用于一些过渡的临时值非常方便。
-
指定类型也有两种方案,需要注意的是
var
定义变量,是否在初始化赋值,会导致你在后续能不能修改这个变量类型的。// in 1.dart // 1 类型 变量名字: 传统 java 定义方式 String d; d = "test"; // d = 1; // error: string 类型不能赋值 int print(d); // 2 var 定义 并且有初始值:自动推断类型 var e = "test"; // e = 1; // error: string 类型不能赋值 int print(d);
重点: 和其他语言的初始值不一样,Dart 的所有变量默认值都是 null
。比如一个 bool
,在其他语言初始值一般是 false
, 而在 dart
中,它是 null
。所幸的是,最新版本会有 non-nullable
功能,没赋值都使用的值都会告诉你需要去初始化。
常量
有人认为 const
, final
都应该是常量,其实这两个还是有点区别的:const
是需要在定义的时候就赋值,而 final
则是只能赋值一次。因此我更加偏认为 const
才是真正的常量,而 final
正如它的字面意思一样:最后一次赋值。
-
const
如果你之前是使用javascript
, 对于const
你还是有些需要注意的,因为它是真正的不变。// const String a; const String a = 'test'; // a = "test2"; // 常量不能再改变它的值了 print(a); const List list = [1, 2, 3]; // 和 javaScript 不一样,常量的数组也是不能修改的 // list[1] = 2; // 编辑器不会报错,但是运行会报错。 print(list); // 同值的常量指向同一块内存 const String b = "test"; print(identical(a, b)); // 是否指向同一块内存位置,true
总结
const
三个特征就是:- 定义的时候必须赋值,并且后续不能改
const
下的 数组,对象都是不可修改的- 同值的常量指向同一块内存
-
final
相对来说就比较简单的多,除了一个只能赋值一次的要求,它更像javascript
下的const
,而且比它还宽松(没有强制要求定义的时候赋值)final String c; c = "test"; // c = "test2"; print(c); // list 元素可以修改 final list2 = [1, 2, 3]; list2[1] = 2; print(list2);