Dart的變量與內置類型


一.Dart 簡介

Dart是谷歌發布的一門面向對象的開源編程語言,誕生於2011年10月10日,Dart是一種“結構化的Web編程”語言,在所有現代的瀏覽器和環境中提供高性能。

Dart主要用途分為三種:

  •   Flutter開發移動應用
  •   Dart webdev 開發瀏覽器應用
  •   Dart VM開發腳本或者服務器應用

下面即將開啟Dart學習之旅

二.Dart語法

重要概念(Important concepts)

在學習Dart的時候,請牢記下面的一下事實和概念:

  •   所有能夠使用變量引用的都是對象,每個對象都是一個類的實例。在Dart中甚至連數字、方法和null都是對象。所有的對象都繼承與Object類。
  •   雖然Dart是強類型,但由於Dart可以推斷類型,所以類型注釋是可選的,當您不需要明確的類型時,可以使用dynamic類型。
  •  Dart支持泛型類型,像List<int>(整數類型)或者List<dynamic>(任何類型的對象)
  •   支持頂層函數(例如main()),以及綁定到類或者對象的函數(分別是靜態方法和實例方法)。您還可以在函數中創建函數(嵌套函數或本地函數)。
  •   類似地,Dart支持頂級變量,以及綁定到類或對象的變量(靜態變量和實例變量)。實例變量有時稱為字段或屬性
  •   與Java不同,Dart沒有關鍵字public、proteched、private。如果標識符以下划線(_)開頭,則它是其庫的私有標識符。
  •   標識符可以以字母或下划線開頭,然后這些字符和數字的任意組合
  •   Dart同時具有表達式和語句。例如,條件表達式條件 ? expr1 : expr2 ; 最后得到的值為expr1 或expr2,將其與沒有值得if-else 語句進行比較,語句通常包含一個或多個表達式,但表達式不能直接包含語句。
  •   Dart工具可以報告兩種類型的問題:警告和錯誤,警告只表明您的代碼可能無法工作,但它們不會阻止您的程序執行。錯誤可以是編譯時的,也可以是運行時的。編譯時的錯誤完全阻止了您的程序執行,運行時錯誤會導致在執行代碼時引發異常。

1.  變量

變量是一個引用,根據Dart中“萬物皆對象”原則,即變量存儲的都是對象的引用,或者說它們都是指向對象

1)  聲明變量

聲明可以有兩種方式,一種是不指定類型,即使用var關鍵字

 var name = "Bob";

另一種是明確指定類型(Optional types)

String name = "Bob";

因為有類型推導,所以兩種實現效果一樣,官方推薦在函數內的本地變量盡量使用var聲明。

在變量類型並不明確的情況下,可以使用dynamic關鍵字

dynamic name = "Bob";

2 )  默認值

沒有初始化的變量自動獲取一個默認值為null。類型為數字的變量如果沒有初始化其值也是null,不要忘記數字類型也是對象。

var name;
var age;
print(name); // null
print(age); // null

2.  Final與const

如果一個變量的值不再修改,則使用final或者const代替var。

一個final變量只能賦值一次;一個const變量是編譯時常量,const變量默認為final變量。頂層final變量與類變量在首次訪問時才執行初始化。需要注意的是,實例變量可以為final,但是不能是const

// 常量
const bar = 1000;
// 常量計算也是常量
const atm = 0.15 * bar;

const 關鍵字不僅僅只能用來定義常量,也可以用來創建不變的值,還能定義構造函數為const類型的,這中類型的構造函數創建的對象是不可改變的。任何變量都可以有一個不變的值。

var foo = const[1,2,3];
final baz = const[2,3,4];

3.  內置類型

Dart內置支持下面這些類型

  •   numbers
  •   string
  •   boleans
  •   lists(或稱arrays)
  •   sets
  •   maps
  •   runes(用於在字符串中表示Unicade字符)
  •   symbols

1)   Numbers(數值)

Dart支持兩種類型的數字

int 整數值、double (雙精度) 浮點數,兩者都是num的子類。Num類型定義了基本的操作符,例如+-*/,還定義了abs()、ceil()、和floor()等函數。

2) 字符串(String)

Dart字符串使用單引號或者雙引號來創建字符串;

String s1 = 'Single quotes work well for string literals.';
String s2 = "Double quotes work just as well.";

可以使用+操作符來把多個字符串連接為一個,也可以把多個字符串放到一起實現同樣的功能

String s3 = 'String ''concatenation'
    ' works even over line breaks.';
String s4 = 'The + operator ' + 'work,as well.';
print(s3);
print(s4);

輸出結果:

其中官方不建議使用+操作符連接字符串。

使用三個單引號或者雙引號也可以創建多行字符串對象

String s5 = '''
You can create
multi-line strings like this one.
''';
String s6 = """
This is alse a 
multi-line string.
""";
print(s5);
print(s6);

輸出結果:

通過提供一個r前綴可以創建一個“原始raw”字符串

var s = r"In a raw string, even \n isn't special.";
var ss = "In a raw string, even \n isn't special.";
print(s);
print(ss);

輸出結果:

可以在字符串中使用表達式,用法為:${expression}。如果表達式是一個標識符,可以省略{},如果表達式的結果為一個對象,則Dart會調用對象的toString()函數來獲取一個字符串

var str = 'string interpolation';
if("Dart has $str ,which is very handy." ==
    "Dart has string interpolation ,which is very handy."){
  print("yes");
}
if('Dart has ${str.toUpperCase()} ,which is very handy.' ==
 'Dart has STRING INTERPOLATION ,which is very handy.'){
   print("upperCase is yes");
}

3)  Booleans(布爾值)

為了代表布爾值,Dart有個名為bool的類型。只有兩個對象是布爾類型的:true和false所創建的對象,這兩個對象也都是編譯時常量。

當Dart需要一個布爾值的時候,只有true對象才被認為是true,所有其他的值都是false,這點和javascript不一樣,像1,“aString”以及someObject等值都認為是false。

如果在javascript中運行,則會打印Bob,在javascript中name是非null對象,所以為true,但在Dart的生產模式下運行,則不打印任何內容,原因是name != true;  name被轉換為false了。如果在Dart檢查模式運行,代碼會拋出異常,表示變量name不是一個布爾值。

4)  Lists(列表)

也稱array(有序集合)是所有編程語言中最常見的集合類型。在Dart中數組就是List對象。所以通常稱之為lists。

var list = [1,2,3];
print("list長度為:"+list.length.toString()); //list長度為:3
print("第二個數值為:"+list[1].toString()); //第二個數值為:2
list[1] = 1;
print("修改后,第二個數值為:"+list[1].toString()); //修改后,第二個數值為:1

list可以使用const關鍵字,可以定義一個不變的list對象(編譯時常量)

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

定義一個空的可變的list,盡量使用[],如(var points = []),如果您想創建一個不可變的list,護着其他自定義類型的集合,可以使用構造函數。

如果有必要還可以提供泛型類型

 var points = <Point>[];

5 )  Maps

通常來說,Map是一個鍵值對相關的對象。鍵和值可以是任何類型的對象。每個鍵出現一次,而一個值則可以出現多次。

下面是一些簡單實例 

var gifts = {
  'frist':'partridge',
  'second':'turtldoves',
  'fifth':'golden rings'
};
var nobleGases = {
  2 :   'helium',
  10:   'neon',
  18:   'argon',
};

使用map構造函數也可以實現同樣的功能:

var gifts2 = new Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';

var nobleGases2 = new Map();
nobleGases[2] = 'helium';
nobleGases[10] = 'neon';
nobleGases[18] = 'argon'; 

往map中添加新的鍵值對和在javascript中用法一樣

 gifts['fourth'] = "calling birds"; // 添加新的鍵值對

獲取map中的對象

 print(gifts['fourth']); //calling birds

使用length來獲取map中鍵值對的數目:

print("gifts中總數為:"+gifts.length.toString()); //gifts中總數為:4

同樣使用const可以創建一個編譯時常量的map 

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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM