Dart語(yǔ)言基礎(chǔ)(二)之?dāng)?shù)據(jù)類(lèi)型

Dart語(yǔ)言之?dāng)?shù)據(jù)類(lèi)型

數(shù)據(jù)類(lèi)型

  • dart語(yǔ)言數(shù)據(jù)類(lèi)型包含一下類(lèi)型:
    1. 變量-Var
    2. 常量-Const
    3. 數(shù)值型-Number
    4. 字符串-String
    5. 布爾型-Boolean
    6. 列表-List
    7. 鍵值對(duì)-Map
    8. 動(dòng)態(tài)類(lèi)型-dynamic
    9. Runes、Symbols(很少用)

變量Var

  • 使用var聲明變量,可賦予不同類(lèi)型的值

  • 未初始化時(shí),默認(rèn)值為null。此時(shí)的類(lèi)型dynamic類(lèi)型

      var a;  //初始化并沒(méi)有聲明類(lèi)型,是dynamic類(lèi)型
      print(a); //null
      
      a = 10;
      print(a); //10
      
      a = 'hello world';
      print(a); //hello world
      
      //聲明變量并初始化,確實(shí)變量類(lèi)型
      var b = 20;
      print(b); //20
    
  • 使用final聲明一個(gè)只能賦值一次的變量

      //final變量   
      final c = 20; //類(lèi)型已經(jīng)確定并且不能再進(jìn)行賦值
      c = 'hello';//報(bào)錯(cuò)
      c = 10; //報(bào)錯(cuò)
    

常量Const

  • 使用const聲明常量

  • 使用const聲明的必須是編譯器常量

      const d = 20;
      d = 50;//報(bào)錯(cuò),常量不能再賦值了。
    

數(shù)值型num

  • Dart語(yǔ)言是面向?qū)ο笳Z(yǔ)言,num也是object,int和double繼承于num。

  • 如果直接用int和double來(lái)聲明的話(huà),int無(wú)法變成double,double無(wú)法變成int

  • num包含兩種子類(lèi)型:1、整型-int 2、浮點(diǎn)型-double

      num = 10;//整型
      num = 10.5;//這個(gè)時(shí)候就變成浮點(diǎn)型了
      
      int b = 20;
      b = 20.5;//報(bào)錯(cuò)int不能轉(zhuǎn)double
      
      double d = 20.5;
      d = 20; //報(bào)錯(cuò)double不能轉(zhuǎn)int
    
  • 運(yùn)算符:+、-、*、/、~/、%

      int a = 10;
      int b = 2;
      print(a + b); //12
      print(a - b); //8   
      print(a * b); //20
      print(a / b); //5.0 這個(gè)不是整除,值是浮點(diǎn)型的
      print(a ~/ b);//整除,余數(shù)部分舍棄取整 5
      print(a % b);//去余數(shù) 0
    
  • 常用屬性:isNaN、isEven、isOdd等

      //isNaN 非數(shù)字
      print(0.0/0.0);//NaN,只有這個(gè)情況是
      int a = 3;
      int b = 4;
      //是否是偶數(shù)
      print(a.isEven);//false
      print(b.isEven);//true
      //是否是奇數(shù)
      print(a.isOdd);//true
      print(b.isOdd);//false
    
  • 常用的方法:abs()、round()、floor()、ceil()、toInt()、toDouble()

      int a = -100;
      //取絕對(duì)值
      print(a.abs()); //100
      double f = 10.5;
      //四舍五入
      print(f.round()); //11
      //不大于f的最大整數(shù)     
      print(f.floor()); //10
      //不小于f的最小整數(shù)
      print(f.ceil()); //11
      //轉(zhuǎn)整型
      print(f.toInt()); //10
      //轉(zhuǎn)浮點(diǎn)型
      int d = 100;
      print(d.toDouble()); //100.0
    

字符串

  • 使用單引號(hào)、雙引號(hào)創(chuàng)建的字符串

      String str1 ='hello'; //使用雙引號(hào)也可以字符串賦值
    
  • 使用三個(gè)單引號(hào)、三個(gè)雙引號(hào)創(chuàng)建的多行字符串

      String str = '''hello
                          dart''';//使用三個(gè)雙引號(hào)賦值多行字符串
    
  • 使用r創(chuàng)建原始的raw字符串

      String *str = 'hello \n Dart ';
      print(str);//打印換行字符串
      
      //打印帶\n
      String *str1 = r'hello \n Dart ';
      print(str1);//hello \n Dart 
    
  • 可以使用+號(hào)來(lái)拼接字符串

      String *str1 = 'hello';
      print(str1 + 'dart');//hellodart
    
  • 可以使用*號(hào)來(lái)表示循環(huán)這個(gè)字符串幾次

      String *str1 = 'hello';
      print(str1*3);//hellohellohello
    
  • 可以使用==比較兩個(gè)字符串是否相等(比較的是內(nèi)容)

      String *str1 = 'hello';
      String *str2 = 'hello';
      String *str3 = 'dart';
      print(str1 == str2); //true
      print(str1 == str3); //false
    
  • 可以使用[]來(lái)獲取字符串的某個(gè)字節(jié)

      String *str1 = 'hello';
      print(str1[0]); // h        
    
  • 可以使用${表達(dá)式}來(lái)表示插值表達(dá)式

      int a = 1;
      int b = 2;
      print("a + b = $(a + b)");//a + b = 3
      print("a = $a");//a = 1
    
  • 可以使用.length獲取字符串長(zhǎng)度(空格也算一個(gè)字節(jié))

      String str = 'hello';
      print(str.length);//5
      
      String str = 'hello dart';
      print(str.length);//10
    
  • 可以使用.isEmpty、.isNotEmpty來(lái)判斷是空、是非空

      String str = 'hello';
      print(str.isEmpty); //false
      print(str.isNotEmpty); //true
    
  • 可以使用.contains(字符串)判斷是字符穿否包含另一個(gè)字符串

      String str = 'hello dart';
      print(str.contains('dart')); //true
    
  • 可以使用.substring(int startIndex, endIndex)來(lái)截取字符串

     String str = 'hello dart';
     print(str.substring(0,4)); // hello
    
  • 可以使用.startsWith(字符串)、.endsWith(字符串)來(lái)判斷是否以括號(hào)里字符串開(kāi)頭、結(jié)尾的

      String str = 'hello dart';
      print(str.startsWith('he')); //true
      
      print(str.endsWith('a')); // false
    
  • 可以使用.split()分割字符串,返回的是List

      String str = 'hello dart';
      //以空格分割
      var list = str.split(' ');
      print(list); //[hello,dart]
    
  • 可以使用.replaceAll()來(lái)替換字符串

      String str = 'hello dart';
      print(str.replaceAll('dart','java')); //hello java
    
  • 可以使用.toLowerCase()、toUpperCase()轉(zhuǎn)成小寫(xiě)、大寫(xiě)

      String str = 'Hello';
      print(str.toLowerCase()); //hello
      print(str.toUpperCase()); //HELLO
    
  • 字符串還有很多的方法,自己可以摸索。我只列出比較常用的方法

布爾型

  • 使用bool表示布爾類(lèi)型
  • 布爾值只有true和false

列表List

  • 創(chuàng)建可變List

      var list = [1,2,3];
    
  • 創(chuàng)建一個(gè)不可變的List

      //不可變,內(nèi)容元素和長(zhǎng)度都不可變
      var list = const [1,2,3];   
    
  • 構(gòu)造創(chuàng)建

      var list = new List();
    
  • 列表里面的元素可以是不同類(lèi)型的

      var list = [1,2,'dart',true];
      print(list); //[1,2.dart,true]
    
  • 可以通過(guò).[imdex]獲取某個(gè)元素或者改變某個(gè)元素的值

      var list = [1,2,'dart',true];
      print(list[]); //dart
      
      list[1] = 8;
      print(list);//[1,8,dart,true]
    
  • 可以通過(guò).length獲取list的長(zhǎng)度

    var list = [1,2,'dart',true];
    print(list.length); //4
  • 可以同過(guò)add(element)、insert(index,element)添加元素,添加的元素類(lèi)型List要包含

      var list = ['dart','java'];
      
      list.add('iOS');
      list.add(3); //報(bào)錯(cuò),List都是字符串,沒(méi)有int類(lèi)型,要想添加成功List里面必須要int,還有一種dynamic方式創(chuàng)建就可以,后面會(huì)講
      
      print(list);//[dart,java,iOS]
      
      list.insert(0,'data');
      list.insert(0, 3); //報(bào)錯(cuò),List都是字符串,沒(méi)有int類(lèi)型
      print(list); [data,dart,java,iOS]
    
  • 可以通過(guò)remove(element)移除元素、removeLast()移除最后一個(gè)元素、removeAt(idnex)按index移除元素、clear()清空元素

      var list = [1,2,'dart',true];
      list.remove(true)
      print(list); //[1,2,dart]
      
      list.removeLast();
      print(list); //[1,2]
      
      list.removeAt(0);
      print(list); //[2]
      
      list.clear();
      print(list); //[]
    
  • 可以通過(guò)indexOf(element)獲取元素所在的位置、lastIndexOf()最后元素所在的位置

      var list = [1,2,'dart',true];
      print(list.indexOf('dart')); //2
      print(list.lastIndexOf());//3
    
  • 可以通過(guò)sort()排序,排序的元素必須是同類(lèi)型的

  • sublist()獲取子list

      var list = [1,2,'a'];
      list.sort();
      print(list);//報(bào)錯(cuò),排序需要list的元素是同類(lèi)型的
    
      var list1 = [2,4,1];
      list.sort();
      print(list); //[1,2,4]
    
      var list2 = ['hello','dart','java'];
      list2.sort();
      print(list2); //[dart, hello, java]
    
  • 可以通過(guò)asMap()把list轉(zhuǎn)成Map(鍵值對(duì))key是用元素的index補(bǔ)全

      var list2 = ['hello','dart'];
      print(list2.asMap()); //{0: dart, 1: hello}
    
  • 可以通過(guò)forEach(f)遍歷list的元素,括號(hào)里f是方法

      var list2 = ['hello','dart','java'];
      //遍歷每個(gè)元素都都調(diào)用print
      list2.forEach(print);
      //hello
      //dart
      //java
    

可能有些人不太明白元素的值怎么傳遞的,可以看看forEach實(shí)現(xiàn)源碼

    void forEach(void f(E element)) {
        for (E element in this) f(element);
    }

看到這大概知道了,就是遍歷this就是自己也就是list,把list里面的元素,遍歷的時(shí)候把元素當(dāng)成f這個(gè)方法的參數(shù)。

  • List里面的方法太多,我只列舉比較常用的方法,大家有時(shí)間可以多了解其他的方法

Map 鍵值對(duì)

  • 創(chuàng)建可變的Map

      var map = {'first':'dart','second':'java'};
    
  • 創(chuàng)建不可變的Map,map里的鍵值對(duì)都不能更改

      var map = const {1:'dart',2:'java'};
    
  • 構(gòu)造創(chuàng)建

      var map = new Map();
    
  • 可以通過(guò)[key]來(lái)獲取value,key盡量使用字符串或者數(shù)字,不要使用布爾值當(dāng)key。

      var map = {'first':'dart',2:'java'};
      print(map['first']); //dart
      print(map[2]); //java
    
  • 可以通過(guò).addAll(Map<K, V> other)來(lái)添加鍵值對(duì)

  • 可以通過(guò).length獲取map的鍵值對(duì)個(gè)數(shù)

      var map = {'first':'dart',2:'java'};
      map.addAll({'third':'iOS'});
      print(map); //{'first':'dart',2:'java','third':'iOS'} 
    
  • 可以通過(guò).isEmpty()是否是空不 .isNotEmpty()是否是非空

      var map = {'first':'dart',2:'java'};
      print(map.isEmpty()); //false
      print(map.isNotEmpty()); //true
    
  • 可以通過(guò).keys、.values獲取Map所有的鍵、值

      var map = {'first':'dart',2:'java'};
      print(map.keys); //(first,2)
      print(map.values); //(dart,java)
    
  • 可以通過(guò)containsKey()、containsValue()來(lái)判斷是否包含某個(gè)key、value

      var map = {'first':'dart',2:'java'};
    
      print(map.containsKey('first')); //true
      print(map.containsValue('iOS')); //false    
    
  • 可以通過(guò)remove()移除某個(gè)key的鍵值對(duì)

       var map = {'first':'dart',2:'java'};
       map.remove('first');
       print(map);// {2:'java'}
    
  • 通過(guò)forEach(f)遍歷所有的鍵值對(duì)

      //forEach(f) f這個(gè)方法接受兩個(gè)參數(shù)key、value
      void forEach(void f(K key, V value)); 
      
      var map = {'first':'dart',2:'java'};
      map.forEach(f); 
      /*
          key=first,value=dart
          key=2,value=java
      */
      
      //下面是定義一個(gè)方法接受兩個(gè)參數(shù)的處理
      void f(key, value) { 
          print('key=$key,value=$value');
      }
    
  • Map里面的方法太多,我只列舉比較常用的方法,大家有時(shí)間可以多了解其他的方法

dynamic

  • Dart提供了可選的類(lèi)型系統(tǒng),在聲明變量、定義函數(shù)的時(shí)候,可以指定類(lèi)型,也可以不指定,不指定的話(huà)就是dynamic

  • Dart的類(lèi)型系統(tǒng)比較獨(dú)特的地方在于,類(lèi)型僅僅是給編輯器看的,它不應(yīng)也不會(huì)對(duì)代碼的行為產(chǎn)生任何影響。在production模式下,類(lèi)型會(huì)被忽略,以獲得更好的性能。我們?cè)趫?zhí)行dart代碼時(shí),可以指定–checked參數(shù),打開(kāi)或關(guān)閉運(yùn)行時(shí)的類(lèi)型檢查(默認(rèn)未開(kāi)啟)。

      var a = 10; //指定類(lèi)型并且賦值
      a = 'aa'; //報(bào)錯(cuò),不是int類(lèi)型
      
      var a; //a沒(méi)有指定類(lèi)型是dynamic,可以賦值任何類(lèi)型
      a = 10; //dynamic
      a = 'dart; //dynamic
    
  • 可以通過(guò)dynamic 聲明一個(gè)變量

      dynamic b = 10;
      b = 'dart'; //因?yàn)槭莿?dòng)態(tài)類(lèi)型可以賦值字符串
    
  • 可以創(chuàng)建dynamic的List

      //通過(guò)dynamic創(chuàng)建的list可以添加任何類(lèi)型
      var list = new List<dynamic>();
      list.add(1);
      list.add("value");
      list.add(true);
      print(list); //[1,value,true]
    

Runes

  • 在DART中,runes表示字符串的UTF-32編碼

  • Unicode為所有世界上的書(shū)寫(xiě)系統(tǒng)中使用的每個(gè)字母、數(shù)字和符號(hào)定義一個(gè)唯一的數(shù)字值。由于DART字符串是由UTF-16代碼單元組成的序列,因此在字符串中表示32位Unicode值需要特殊的語(yǔ)法。

  • 通常表示Unicode代碼點(diǎn)的方法是uXXXX,其中XXXX是一個(gè)4位的十六進(jìn)制值。例如,愛(ài)心字符(?)是u2665。

  • String類(lèi)具有幾個(gè)可用于提取符文信息的屬性,codeUnitAt和codeUnit屬性返回16位代碼單元。使用runes屬性獲取字符串的符文。

      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));
    

打印的結(jié)果如下:


runes打印.png

Symbol

  • Symbol對(duì)象表示在Dart程序中聲明的運(yùn)算符或標(biāo)識(shí)符。您可能永遠(yuǎn)不需要使用符號(hào),但它們對(duì)于按名稱(chēng)引用標(biāo)識(shí)符的API非常有用,因?yàn)榭s小會(huì)更改標(biāo)識(shí)符名稱(chēng)而不會(huì)更改標(biāo)識(shí)符符號(hào)。要獲取標(biāo)識(shí)符的符號(hào),請(qǐng)使用符號(hào)文字,它只是#后跟標(biāo)識(shí)符:

      // 通過(guò)new Symbol()聲明
      var a = new Symbol('radix');
      print(a); //Symbol("radix")
    
      //可以通過(guò)#radix來(lái)表示
      print(#radix); //Symbol("radix")
      print(#bar); //Symbol("bar")
    
      print(#radix == new Symbol('radix'));  //true
    

這個(gè)很不常用,大家知道這個(gè)類(lèi)型就可以。

結(jié)尾

這里的很多內(nèi)容都只是大概介紹個(gè)基礎(chǔ)點(diǎn),里面的每個(gè)部分都還有很多知識(shí)點(diǎn)細(xì)節(jié)需要學(xué)習(xí),在之后的系列會(huì)慢慢展開(kāi)來(lái)說(shuō)。

下一章節(jié)講解Dart語(yǔ)言基礎(chǔ)(三)之運(yùn)算符

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容