美文网首页
Built-in types (内置的类型) of Dart

Built-in types (内置的类型) of Dart

作者: Kidnight | 来源:发表于2019-08-13 20:03 被阅读0次
    /**
     * Built-in types (Dart内置的类型)
     */
    
    /**
     * Dart内置支持下面这些类型:
     * numbers;
     * strings;
     * booleans;
     * lists(也被称之为arrays);
     * maps;
     * runes(用于在字符串中表示Unicode字符);
     * symbols;
     * 由于Dart中每个变量引用的都是一个对象(一个类的实例),通常使用构造函数来初始化变量。
     * 
     */
    
    void main() {
    
      /**
      * Numbers(数值)
      * 
      * Dart支持两种类型的数字:
      * 
      * int:整数值,其取值通常位于-2^53和2^53之间。
      * double:64-bit(双精度)浮点数,符合IEEE754标准。
      * int和double都是num的子类。num类型定义了基本的操作符,例如+,-,/,*,还定义了abs(),ceil()和floor()等函数。
       * 
      * 注意:不在-2^53到2^53范围内的整数在Dart中的行为和JavaScript中表现不一样。原因在于Dart具有任意精度的整数,而JavaScript没有。
      */
      
      // 整数是不带小数点的数字,下面是一些定义整数的方式:
      var x = 1;
      var hex = 0xDEADBEEF;
      var bigInt = 123456789098765432;
    
      // 如果一个数带小数点,则其为double,下面是定义double的一些方式:
      var y = 1.1;
      var exponents = 1.42e5;
    
      // 下面是字符串和数字之间的转换方式:
      var one = int.parse('1'); // String -> int
      assert(one == 1);
    
      var onePointOne = double.parse('1.1'); // String -> double
      assert(onePointOne == 1.1);
    
      String oneAsString = 1.toString(); // int -> String
      assert(oneAsString == '1');
    
      String piAsString = 3.14159.toStringAsFixed(2); // double -> String
      assert(piAsString == '3.14');
    
      // 整数类型支持传统的位移操作符:<<, >>, AND(&), OR(1),例如:
      assert((3 << 1) == 6); // 0011 << 1 == 0110
      assert((3 >> 1) == 1); // 0011 >> 1 == 0001
      assert((3 | 4) == 7); // 0011 | 0100 == 0111
    
      // 数字字面量为编译时常量。很多算术表达式只要其操作数是常量,则表达式结果也是编译时常量
      const msPerSecond = 1000;
      const secondsUntilRetry = 5;
      const msUntilRetry = msPerSecond * secondsUntilRetry;
    
    
    
      /**
       * Strings(字符串)
       */
    
      // Dart字符串是UTF-16编码的字符序列。可以使用单引号,或者双引号来创建字符串
      var s1 = 'single quotes';
      var s2 = "double quotes";
      var s3 = 'It\'s easy to escape the string delimiter';
      var s4 = "It's even easier to use the other delimiter";
    
      // 可以在字符串中使用表达式,用法是这样的${expression},如果表达式是一个字符串,可以省略{}。
      // 如果表达式的结果作为一个对象,则Dart会自动调用对象的toString()函数来获取一个字符串。
      // ==操作符判断两个对象的内容是否一样。如果两个字符串包含一样的字符编码序列,则他们是相等的。
      var s = 'string interpolation';
      assert('Dart has $s,which is very handy.' == 'Dart has string interpolation,' + 'which is very handy');
      assert('That deserves all caps.' + '${s.toUpperCase()} is very handy!' == 'that deserves all caps.' + 'STRING INTERPOLATION is very handy!');
      
      // 可以使用 + 操作符来把多个字符串连接为一个,也可以把多个字符串放到一起来实现同样的功能
      var s5 = 'String''concatenation'"works even over line breaks.";
      assert(s5 == 'String concatenation works even over line breaks.');
      var s6 = 'The + operator' + 'works,as well.';
      assert(s2 == 'The + operator works,as well');
    
      // 使用三个单引号或者双引号也可以创建多行字符串对象
      var s7 = 
      '''
      You can create
      multi-line strings like this one.
      ''';
      var s8 = 
      """
      this is also a
      multi-line strings.
      """;
    
      // 通过提供一个r前缀可以创建一个“原始raw”字符串:
      var s9 = r"in a raw string,even \n isn't special.";
    
      // 字符串字面量是编译时常量,带有字符串插值的字符串定义,若干插值表达式引用的为编译时常量则其结果也是编译时常量。
      // these work in a const string.
      const aConstNum = 0;
      const aConstBool = true;
      const aConstString = 'a constant string';
    
      // these do NOT work in a const string.
      var aNum = 0;
      var aBool = true;
      var aString = 'a string';
      const aConstList = const[1,2,3];
    
      const validConstString = '$aConstNum $aConstBool $aConstString';  // this is a const string
      // const invalidConstString = '$aNum $aBool $aString $aConstList';  // this is NOT a const string
    
    
    
      /**
       * Booleans(布尔值)
       * 
       * 为了代表布尔值,Dart有一个名字为bool的类型。只有两个对象是布尔类型的:true和false所创建的对象,这两个对象也都是编译是常量。
       */
    
      // 当Dart需要一个布尔值的时候,只有true对象才被认为是true,所有其他的值都是false。
      // 比如:1,"aString",以及someObject等值都被认为是false。这点与JavaScript不一样。
      // 例如,下面代码在JavaScript中和Dart中都是合法的代码。如果在JavaScript中 name 是非 null 对象,所以被认为是 true。
      // 但是在Dart的生产模式下运行,这不会打印任何内容,原因是 name 被转换成 false 了。原因在于 name != true 。
      // 如果在Dart检查模式运行,下面的代码会抛出一个异常,标示 name 变量不是一个布尔值。
      // 注意:下面的两段代码只能在生产模式下运行,在检查模式下,会抛出异常:变量不是所期望的布尔类型。
    
      // var name = 'Bob';
      // if (name) {
        // Prints in JavaScript, not in Dart
        // print('You have a name!');
      // }
    
      // if (1) {
        // print('JS print this line.');
      // } else {
        // print('Dart in production mode prints this line');
      // }
    
      // Dart这样设计布尔值,是为了避免奇怪的行为。很多JavaScript代码都遇到这种问题。Dart环境中,在写代码的时候,
      // 不用再写这些代码了:if (nonbooleanValue),需要显示的判断变量是否为布尔值类型,例如:
      
      // check for an empty string.
      var fullName = '';
      assert(fullName.isEmpty);
    
      // check for zero
      var hitPoints = 0;
      assert(hitPoints <= 0);
    
      // check for null
      var unicorn;
      assert(unicorn == null);
    
      // check for NaN.
      var iMeantToDoThis = 0 / 0;
      assert(iMeantToDoThis.isNaN);
    
    
    
      /**
       * Lists(列表)
       * 
       * array(有序集合)是所有编程语言中最常见的集合类型。Dart中数组就是List对象,通常我们都称之为lists。
       */
    
      // Dart list字面量和JavaScript的数组字面量类似,如下:
      var list0 = [1,2,3];
    
      // list的下标索引从0开始,第一个元素索引下标是0。list.length - 1是最后一个元素。
      var list1 = [1,2,3];
      assert(list1.length == 3);
      assert(list1[1] == 2);
      list1[1] = 1;
      assert(list1[1] == 1);
    
      // 在list字面量之前添加const关键字,可以定义一个不变的list对象(编译是常量):
      var constantList = const [1,2,3];
      // constantList[1] = 1; // can NOT change it
    
    
    
      /**
       * Maps
       * Map是一个键值对相关的对象。键和值可以是任何类型的对象。每个键只出现一次,而一个值可以出现多次。类似 OC 的 NSDictionary。
       */
      // 以下是创建简单map的示例:
      var gifts = {
        // key  value
        'first' : 'partridge',
        'second'  : 'turtledoves',
        'fifth' : 'golden rigns'
      };
    
      var nobleGases = {
        // key  vaue
        2 : 'helium',
        10  : 'neon',
        18  : 'argon'
      };
    
      // 使用map构造函数也可以实现同样的功能:
      var gifts1 = new Map();
      gifts1['first'] = 'partridge';
      gifts1['second'] = 'turtledoves';
      gifts1['fifth'] = 'golden rigns';
    
      var nobleGases1 = new Map();
      nobleGases1[2] = 'helium';
      nobleGases1[10] = 'neon';
      nobleGases1[18] = 'argon';
    
      // 往map中添加新的键值对
      gifts1['fourth'] = 'calling birds';
    
      // 获取map中的值
      assert(gifts1['fourth'] == 'calling birds');
    
      // 如果所查找的键不存在,则返回null
      assert(gifts1['third'] == null);
    
      // 获取map中键值对的数目
      assert(gifts.length == 3);
    
      // 使用const可以创建一个编译时常量的map
      final cnostMap = const {
        2 : 'helium',
        10 : 'neon',
        18 : 'argon'
      };
      // cnostMap[2] = 'Helium';  // can NOT change it
    
    
    
      /**
       * Runes
       * 在Dart中,runes代表字符串的UTF-32 code points。
       * Unicode为每一个字符、标点符号、表情符号等都定义了一个唯一的数值。由于Dart字符串是UTF-16 code units字符序列,所以在字符串中
       * 表达32-bit Unicode值就需要新的语法了。
       * 
       * 通常使用 \uXXXX 的方式来表示 Unicode code point,这里的 XXXX 是4个16进制的数。
       * 例如,心形符号(♥)是 \u2665。
       * 对于非4个数值的情况,把编码值放到大括号中即可。例如,笑脸 emoji(😆)是 \u{1f600}。
       * 
       * String类有一些属性可以提取rune信息。codeUnitAt 和 codeUnit 属性返回 16-bit code units。使用 runes属性来获取字符串的runes信息。
       */
    
      // 以下演示了runes、16-bit code units、32-bit code points 之间的关系。
    
      var clapping = '\u{1f44f}';
      print(clapping);
      print(clapping.codeUnits);
      print(clapping.runes.toList());
      Runes input = new Runes(
        '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}'
      );
      print(new String.fromCharCodes(input));
    
    
    
      /**
       * Symbols
       * 一个Symbol的object代表Dart程序中声明的操作符或者标识符。
       * 该功能通过名字来引用标识符的情况是非常有价值的,特别是混淆后的代码,标识符的名字被混淆了,但是Symbol的名字不会改变。
       * 使用Symbol字面量来获取标识符的symbol对象,就是在标识符前面添加一个 # 符号:#radix, #bar
       * 
       */
    
    
     }
    
    

    相关文章

      网友评论

          本文标题:Built-in types (内置的类型) of Dart

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