Dart語法快速上手二 《Dart2之變量及基礎(chǔ)類型》

變量

  • 變量的定義:dart中萬物皆對象,包括java中認(rèn)為的基礎(chǔ)數(shù)據(jù)類型也是對象,所以我們初始化任何對象的時候,只要沒賦值,默認(rèn)值都是null(null也是對象)

  • 變量的分類(根據(jù)聲明方式,不再細(xì)說有哪些內(nèi)置類型):

    String str = "Bob"; //顯示聲明
    var str = "Bob"; // 隱式聲明
    Object str = "Bob"; //通用對象聲明
    dynamic str = 'Bob'; //動態(tài)對象聲明,這里dynamic和Object是等價的,二者可 被賦值為其他類型的對象
    final str = "Bob"; //不可變對象
    int value ;
    assert(value == null); 
    

這里需要指出一個不同點,java中成員變量如果是int類型,默認(rèn)情況下會賦值為0,但是dart中萬物皆對象,int類型不賦值的話value的值依然跟其他對象一樣是null。

注意:生產(chǎn)代碼中將忽略assert()調(diào)用。在開發(fā)期間,assert(condition)會拋出異常,除非條件為真

常量和Final

如果您從不打算更改變量,請使用final或const,而不是var或類型。最終變量只能設(shè)置一次;const變量是編譯時常量。(Const變量是隱式最終的。)最終的頂級或類變量在第一次使用時被初始化,對于要成為編譯時常量的變量,請使用const。如果const變量在類級別,則將其標(biāo)記為static const。在聲明變量的地方可以通過關(guān)鍵字const將值設(shè)置為編譯時常量,例如int類型、String字符串類型、const變量以及通過其他變量常量通過算術(shù)運算之后的結(jié)果也可以作為常量

注意:實例變量可以是final,但不能是const(cost只能表示常量),F(xiàn)inal實例變量必須在構(gòu)造函數(shù)體啟動之前初始化最終實例變量 - 在變量聲明,構(gòu)造函數(shù)參數(shù)或構(gòu)造函數(shù)的初始化列表中。

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; // 這是其他常量算術(shù)結(jié)果賦值為新的常量

const關(guān)鍵字不僅用于聲明常量變量。您還可以使用它來創(chuàng)建常量值,以及聲明創(chuàng)建常量值的構(gòu)造函數(shù)。任何變量都可以具有常量值。

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

部分情況下Dart是允許省略const關(guān)鍵字的,比如:


image.png

您可以更改非final,非const變量的值,即使它曾經(jīng)有一個const值,但是你不能更改一個被聲明成const的值,比如:

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

內(nèi)置類型

Dart語言特別支持以下類型:

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

您可以使用文字初始化任何這些特殊類型的對象。
例如,'this is a string'是一個字符串文字,true是一個布爾文字。

因為Dart中的每個變量都是一個對象 、 一個類的實例 -,您通常可以使用構(gòu)造函數(shù)來初始化變量。一些內(nèi)置類型有自己的構(gòu)造函數(shù)。例如,您可以使Map()構(gòu)造函數(shù)來創(chuàng)建Map

Number

Number類型只有兩種形式:int 和 double,比java少多了。

  • int
    整數(shù)值不大于64位,具體取決于平臺,在Dart VM上,值可以是-263到263 - 1.編譯為JavaScript的Dart使用JavaScript編號,允許從-253到253 - 1的值。

  • double 64位(雙精度)浮點數(shù),由IEEE 754標(biāo)準(zhǔn)規(guī)定。

int和double都是num的子類型。
num類型包括基本運算符,如+, - ,/和*,也是你可以找到abs(),ceil()和floor()以及其他方法的地方。(按位運算符,如>>,在int類中定義。)如果num及其子類型沒有您要查找的內(nèi)容,則dart:math庫可能提供你想要的

int 和double可以跟String之間相互轉(zhuǎn)換

// 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類型指定傳統(tǒng)的按位移位(<<,>>),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}將表達(dá)式的值放在字符串中。如果表達(dá)式是標(biāo)識符,則可以跳過{}。要獲取對應(yīng)于對象的字符串,Dart調(diào)用對象的toString()方法。這點和Koltin很相似

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

你也可以跟java一樣中間用+號來連接兩個字符串
創(chuàng)建多行字符串的另一種方法:使用帶有單引號或雙引號的三重引號:

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

輸出結(jié)果是:In a raw string, not even \n gets special treatment.
這種把\n換行符直接輸出的方法比java中需要一些轉(zhuǎn)換符才能完整輸出特定的字符的方法好不少!??

List

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

list[1] = 1;
assert(list[1] == 1);

如果要創(chuàng)建一個常量集合(不可變),可以這樣寫

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

可能有學(xué)過java的同學(xué)看到[]符號,下意識認(rèn)為是數(shù)組,數(shù)組什么特性?長度定義好了就不可變,只能修改里面的元素值啊,但是Dart等于集合了數(shù)組和List集合的優(yōu)勢,可以通過一些方法來實現(xiàn)增刪改查

     var list = [1,2,3];
    list.add(4);
    print(list.toString());
    list.removeAt(0);
    print(list.toString());
    print(list.contains(2).toString());

    /**
    上面表達(dá)式輸出的結(jié)果為
    [1, 2, 3, 4]
    [2, 3, 4]
   true
  **/

Map

Dart中的map不僅僅跟常規(guī)map一樣可以通過string類型來做key,他的key可以是任何一個object類型

var gifts = {
  // Key:    Value
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
};

var nobleGases = {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};

你也可以通過構(gòu)造方法來構(gòu)造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); //根據(jù)key來移除鍵值對

注意:您可能希望看到新的Map()而不僅僅是Map()。從Dart 2開始,new關(guān)鍵字是可選的
如果需要創(chuàng)建一個編譯期間的常量map,這樣做

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

Runes(符號文字)

就是可以通過文字轉(zhuǎn)換成符號表情或者代表特定的文字,截取一段官網(wǎng)代碼自行了解


image.png

Symbols(不常用,翻譯自官網(wǎng))

Symbol對象表示在Dart程序中聲明的運算符或標(biāo)識符。您可能永遠(yuǎn)不需要使用符號,但它們對于按名稱引用標(biāo)識符的API非常有用,因為縮小會更改標(biāo)識符名稱而不會更改標(biāo)識符符號。要獲取標(biāo)識符的符號,請使用符號文字,它只是#后跟標(biāo)識符:

# radix
#bar

好了,所有關(guān)于變量基礎(chǔ)數(shù)據(jù)類型的知識就介紹到這里了,打字打的??~~有對下一章節(jié)需求的可以留言,再看是否可以快速更新

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

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

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