1 - Dart 的变量 & 常量

1,488 阅读2分钟

变量 & 常量

变量

变量分 不指定类型指定类型。前者就像你用 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);