美文网首页
Dart语法快速上手二 《Dart2之变量及基础类型》

Dart语法快速上手二 《Dart2之变量及基础类型》

作者: 凤天凌 | 来源:发表于2018-09-28 16:19 被阅读202次

    变量

    • 变量的定义:dart中万物皆对象,包括java中认为的基础数据类型也是对象,所以我们初始化任何对象的时候,只要没赋值,默认值都是null(null也是对象)

    • 变量的分类(根据声明方式,不再细说有哪些内置类型):

      String str = "Bob"; //显示声明
      var str = "Bob"; // 隐式声明
      Object str = "Bob"; //通用对象声明
      dynamic str = 'Bob'; //动态对象声明,这里dynamic和Object是等价的,二者可 被赋值为其他类型的对象
      final str = "Bob"; //不可变对象
      int value ;
      assert(value == null); 
      

    这里需要指出一个不同点,java中成员变量如果是int类型,默认情况下会赋值为0,但是dart中万物皆对象,int类型不赋值的话value的值依然跟其他对象一样是null。

    注意:生产代码中将忽略assert()调用。在开发期间,assert(condition)会抛出异常,除非条件为真

    常量和Final

    如果您从不打算更改变量,请使用final或const,而不是var或类型。最终变量只能设置一次;const变量是编译时常量。(Const变量是隐式最终的。)最终的顶级或类变量在第一次使用时被初始化,对于要成为编译时常量的变量,请使用const。如果const变量在类级别,则将其标记为static const。在声明变量的地方可以通过关键字const将值设置为编译时常量,例如int类型、String字符串类型、const变量以及通过其他变量常量通过算术运算之后的结果也可以作为常量

    注意:实例变量可以是final,但不能是const(cost只能表示常量),Final实例变量必须在构造函数体启动之前初始化最终实例变量 - 在变量声明,构造函数参数或构造函数的初始化列表中。

    Final变量和Cost常量的声明

     final name = 'Bob'; // Without a type annotation
     final String nickname = 'Bobby';
    
     const bar = 1000000; // Unit of pressure (dynes/cm2)
     const double atm = 1.01325 * bar; // 这是其他常量算术结果赋值为新的常量
    

    const关键字不仅用于声明常量变量。您还可以使用它来创建常量值,以及声明创建常量值的构造函数。任何变量都可以具有常量值。

    var foo = const [];
    final bar = const [];
    const baz = []; // Equivalent to `const []`
    

    部分情况下Dart是允许省略const关键字的,比如:


    image.png

    您可以更改非final,非const变量的值,即使它曾经有一个const值,但是你不能更改一个被声明成const的值,比如:

    baz = [2,3,4]; //you can't do like this
    

    内置类型

    Dart语言特别支持以下类型:

    • number
    • string
    • boolean
    • list
    • map
    • rune (用于在字符串中表示Unicode字符)
    • symbole

    您可以使用文字初始化任何这些特殊类型的对象。
    例如,'this is a string'是一个字符串文字,true是一个布尔文字。

    因为Dart中的每个变量都是一个对象 、 一个类的实例 -,您通常可以使用构造函数来初始化变量。一些内置类型有自己的构造函数。例如,您可以使Map()构造函数来创建Map

    Number

    Number类型只有两种形式:int 和 double,比java少多了。

    • int
      整数值不大于64位,具体取决于平台,在Dart VM上,值可以是-263到263 - 1.编译为JavaScript的Dart使用JavaScript编号,允许从-253到253 - 1的值。

    • double 64位(双精度)浮点数,由IEEE 754标准规定。

    int和double都是num的子类型。
    num类型包括基本运算符,如+, - ,/和*,也是你可以找到abs(),ceil()和floor()以及其他方法的地方。(按位运算符,如>>,在int类中定义。)如果num及其子类型没有您要查找的内容,则dart:math库可能提供你想要的

    int 和double可以跟String之间相互转换

    // String -> int
    var one = int.parse('1');
    assert(one == 1);
    
    // String -> double
    var onePointOne = double.parse('1.1');
    assert(onePointOne == 1.1);
    
    // int -> String
    String oneAsString = 1.toString();
    assert(oneAsString == '1');
    
    // double -> String
    String piAsString = 3.14159.toStringAsFixed(2);
    assert(piAsString == '3.14');
    

    int类型指定传统的按位移位(<<,>>),AND(&)和OR(|)运算符。例如:

    assert((3 << 1) == 6); // 0011 << 1 == 0110
    assert((3 >> 1) == 1); // 0011 >> 1 == 0001
    assert((3 | 4) == 7); // 0011 | 0100 == 0111
    

    String

    您可以使用$ {expression}将表达式的值放在字符串中。如果表达式是标识符,则可以跳过{}。要获取对应于对象的字符串,Dart调用对象的toString()方法。这点和Koltin很相似

    var a = "一"
    var b = "个"
    print("我是$a个小鸭子");
    print('我是${a+b}小鸭子')
    

    你也可以跟java一样中间用+号来连接两个字符串
    创建多行字符串的另一种方法:使用带有单引号或双引号的三重引号:

    var s1 = '''
    You can create
    multi-line strings like this one.
    ''';
    
    var s2 = """This is also a
    multi-line string.""";
    

    这点很赞~直接不用操作符可以换行
    你也可以通过前面加个r来输出原始字符串

      //字符串的格式化
        var s = r'In a raw string, not even \n gets special treatment.';
        print(s);
    

    输出结果是:In a raw string, not even \n gets special treatment.
    这种把\n换行符直接输出的方法比java中需要一些转换符才能完整输出特定的字符的方法好不少!👍

    List

    var list = [1, 2, 3]; //初始化的方式
    assert(list.length == 3);
    assert(list[1] == 2);
    
    list[1] = 1;
    assert(list[1] == 1);
    

    如果要创建一个常量集合(不可变),可以这样写

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

    可能有学过java的同学看到[]符号,下意识认为是数组,数组什么特性?长度定义好了就不可变,只能修改里面的元素值啊,但是Dart等于集合了数组和List集合的优势,可以通过一些方法来实现增删改查

         var list = [1,2,3];
        list.add(4);
        print(list.toString());
        list.removeAt(0);
        print(list.toString());
        print(list.contains(2).toString());
    
        /**
        上面表达式输出的结果为
        [1, 2, 3, 4]
        [2, 3, 4]
       true
      **/
    

    Map

    Dart中的map不仅仅跟常规map一样可以通过string类型来做key,他的key可以是任何一个object类型

    var gifts = {
      // Key:    Value
      'first': 'partridge',
      'second': 'turtledoves',
      'fifth': 'golden rings'
    };
    
    var nobleGases = {
      2: 'helium',
      10: 'neon',
      18: 'argon',
    };
    

    你也可以通过构造方法来构造map

    var gifts = Map();
    gifts['first'] = 'partridge';
    gifts['second'] = 'turtledoves';
    gifts['fifth'] = 'golden rings';
    
    var nobleGases = Map();
    nobleGases[2] = 'helium';
    nobleGases[10] = 'neon';
    nobleGases[18] = 'argon';
    nobleGases.remove(10); //根据key来移除键值对
    

    注意:您可能希望看到新的Map()而不仅仅是Map()。从Dart 2开始,new关键字是可选的
    如果需要创建一个编译期间的常量map,这样做

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

    Runes(符号文字)

    就是可以通过文字转换成符号表情或者代表特定的文字,截取一段官网代码自行了解


    image.png

    Symbols(不常用,翻译自官网)

    Symbol对象表示在Dart程序中声明的运算符或标识符。您可能永远不需要使用符号,但它们对于按名称引用标识符的API非常有用,因为缩小会更改标识符名称而不会更改标识符符号。要获取标识符的符号,请使用符号文字,它只是#后跟标识符:

    # radix
    #bar
    

    好了,所有关于变量基础数据类型的知识就介绍到这里了,打字打的😫~~有对下一章节需求的可以留言,再看是否可以快速更新

    相关文章

      网友评论

          本文标题:Dart语法快速上手二 《Dart2之变量及基础类型》

          本文链接:https://www.haomeiwen.com/subject/boneoftx.html