2.1、Dart語(yǔ)言基礎(chǔ):變量、運(yùn)算符、流程控制

學(xué)習(xí)筆記,旨在于快速入門(mén)和學(xué)習(xí)Dart,其中可能會(huì)有理解錯(cuò)誤,請(qǐng)指出,一起學(xué)習(xí)。

系列文章

2.1、Dart語(yǔ)言基礎(chǔ):變量、運(yùn)算符
2.2、Dart語(yǔ)言基礎(chǔ):函數(shù)與閉包
2.3、Dart語(yǔ)言基礎(chǔ):面向?qū)ο?/a>
2.4、Dart語(yǔ)言基礎(chǔ):異步
2.5、Dart語(yǔ)言基礎(chǔ):庫(kù)與包
...

一、概述

  • 語(yǔ)法類(lèi)似C語(yǔ)言,可以轉(zhuǎn)譯為JavaScript;
  • 面向?qū)ο笳Z(yǔ)言,屬于強(qiáng)類(lèi)型語(yǔ)言,支持可選類(lèi)型;

參考:
dart英文官網(wǎng)
Dart 中文教程
dart-源碼api

特性

重要概念

  • 一切皆為對(duì)象
    包括function函數(shù)、基礎(chǔ)變量(int、float等)、null等;而且?guī)缀跛蓄?lèi)都繼承于Object基類(lèi),Null除外。

  • 強(qiáng)類(lèi)型語(yǔ)言,支持類(lèi)型推導(dǎo)。
    強(qiáng)類(lèi)型指的是不能給變量賦值類(lèi)型不匹配的值,如下:int類(lèi)型的賦值字符串報(bào)錯(cuò)。

var age = 10; // 類(lèi)型推導(dǎo)為int
age = "xxx"; // 給int類(lèi)型的變量 賦值 字符串報(bào)錯(cuò)
print(age);
  • 支持可選類(lèi)型
    空值安全type?(類(lèi)似于swift的可選類(lèi)型),指的是變量可能為null。
int? aNullableInt = null;

如果變量確定一定有值,可以使用!(如果為空,則會(huì)拋出異常)。

int x = nullableButNotNullInt!
  • 字符串插值:
    美元符號(hào)$varName 或者 ${varName}
void sayHelloworld(String name) {
  print("$name say hello!"); //${name}
}
  • 頂級(jí)入口main函數(shù)。
void main(List<String> arguments)  { ... }
  • 定義任何類(lèi)型的變量:
    Object?、Object 或者 關(guān)鍵字dynamic(在程序運(yùn)行時(shí)才確定類(lèi)型)。

二、基礎(chǔ)


0、基本格式

  • 代碼語(yǔ)句,必須以 分號(hào); 結(jié)尾。

  • 代碼注釋:
    單行語(yǔ)句 // xxx
    多行語(yǔ)句 /* xxx */

  • 類(lèi)型安全檢測(cè):
    Dart 的類(lèi)型安全意味著不能使用 if / assert, 應(yīng)該像下面這樣,明確的進(jìn)行值檢查:

// 檢查空字符串。
var fullName = '';
assert(fullName.isEmpty);

// 檢查 0 值。
var hitPoints = 0;
assert(hitPoints <= 0);

// 檢查 null 值。
var unicorn;
assert(unicorn == null);

// 檢查 NaN 。
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);

1、變量與常量

1.1、變量

Dart萬(wàn)物結(jié)尾對(duì)象,因此變量實(shí)際就是一個(gè)引用。

1.1.1、聲明方式
  • 方式一:明確指定類(lèi)型
    String name = 'hello';

  • 方式二:不指定類(lèi)型,關(guān)鍵字var
    官方推薦在函數(shù)內(nèi)的本地變量盡量使用var聲明。
    var name = 'hello';

  • 方式三:不指定類(lèi)型,關(guān)鍵字dynamic
    在變量類(lèi)型,不明確的情況下使用。
    dynamic name = 'hello';

  • 方式四:?明確指定可為空的變量
    int? aNullableAge;

1.1.2、變量聲明是否可以為空?
  • 指定類(lèi)型的變量,聲明必須初始化,”不為空“,否則編譯報(bào)錯(cuò)。
  //  Error: Non-nullable variable 'obj' must be assigned before it can be used.
  Object obj;
  print(obj);

  // Error: Non-nullable variable 'nickName' must be assigned before it can be used.
  String nickName;
  print(nickName); 

  // Error: Non-nullable variable 'age' must be assigned before it can be used.
  int age;
  print(age);
  • 可為空(dynamic、var 或者 ?聲明)的變量,初始化可以為空;
  // 初始化可以不指定類(lèi)型,值為null
  dynamic nickName;
  print(nickName);

  var name;
  print(name);

  String? nickName1;
  print(nickName1);
1.1.3、延遲變量,關(guān)鍵字late(Dart 1.6新加)
  • 定義一個(gè)允許延遲初始化的變量。
// late的特性:
Lazily initializing a variable. 
Declaring a non-nullable variable that’s initialized after its declaration.

// late的使用場(chǎng)景
This lazy initialization is handy in a couple of cases:
1、The variable might not be needed, and initializing it is costly.
2、You’re initializing an instance variable, and its initializer needs access to this.
late String description;

void main() {
  description = 'Feijoada!';
  print(description);
}
  • 如果 延遲變量 未被其他地方使用,對(duì)應(yīng)語(yǔ)句不執(zhí)行。
// 如果temperature沒(méi)有被使用,則函數(shù) _readThermometer 不會(huì)調(diào)用
late String temperature = _readThermometer(); 

1.2、常量

  • 關(guān)鍵字final, 變量的值只能被設(shè)置一次。
    最高級(jí) final 變量或類(lèi)變量在第一次使用時(shí)被初始化。
    必須在構(gòu)造函數(shù)體執(zhí)行之前初始化 final 實(shí)例變量 —— 在變量聲明中,參數(shù)構(gòu)造函數(shù)中或構(gòu)造函數(shù)的初始化列表中進(jìn)行初始化。
// Error: Can't assign to the final variable 'name'.
final String name = 'hello';
name = 'new hello';
  • 關(guān)鍵字const , 變量在編譯時(shí)就已經(jīng)固定。
    如果 Const 變量是類(lèi)級(jí)別的,需要標(biāo)記為 static const。
    實(shí)例變量可以是 final 類(lèi)型但不能是 const 類(lèi)型。
  // Error: Can't assign to the const variable 'name'.
  const String name = 'hello';
  name = 'new hello';
1.2.1、變量 以及 變量本身 均不允許被修改
  // Error: Can't assign to the const variable 'list'.
  const list = [1, 2, 3];
  list = [11, 12];

  // Unsupported operation: Cannot modify an unmodifiable list
  list[0] = 10;
  print(list);
  • 以下不會(huì)報(bào)錯(cuò)
  // 此時(shí),list推導(dǎo)的類(lèi)型為不可變數(shù)組,修改字典值報(bào)錯(cuò);
  var list = const [1,2,3];
  list[0] = 10;  // 報(bào)錯(cuò)Unsupported operation: Cannot modify an unmodifiable list
  
// 但是變量list可以被重新初始化賦值
  list = [1, 2, 3];
  print(list);

  list[0] = 10;
  print(list);

3、內(nèi)置類(lèi)型

3.1、專有變量
image.png
3.2、數(shù)值類(lèi)型,關(guān)鍵字num,可以是int和double
  num val = 1;
  print(val); // 1

  val += 0.5;
  print(val); // 1.5
  • 布爾值,關(guān)鍵字falsetrue
  bool flag = false;
  print(flag);
  flag = true;
  print(flag);
3.3、數(shù)組,關(guān)鍵字List
var list = [1, 2, 3];
list[0] = 0;
list.length;

// C語(yǔ)言,大括號(hào)
int arr1[3] = {1, 2, 3};

常用APIs:

void testListTypeDemo() {
  var fruits = [];
  print('isEmpty:${fruits.isEmpty}');

  fruits.add('apples');
  fruits.addAll(['pear', 'banana']);
  print('原數(shù)組:$fruits');
  print('first:${fruits.first}, last:${fruits.last}');
  print('length:${fruits.length}');
  print('indexOf: ${fruits.indexOf('banana')}');
  print("contain:${fruits.contains('apples')}");
  print("join:${fruits.join('、 ')}");

  fruits.insert(0, 'watermalon');
  print('原數(shù)組:$fruits');

  print('range:${fruits.getRange(0, 2)}');

  fruits.remove('apples');
  fruits.removeAt(0);
  print(fruits);

  fruits.clear();
  print(fruits);

  var list = List.filled(8, 'name');
  print(list);

  var numbers = [1, 2, 3, 4, 5, 6, 7, 8];
  print('原數(shù)組:$numbers');
  numbers.sort((a, b) => a>b?a:b);
  print('倒敘:$numbers');
}
  • 展開(kāi)運(yùn)算符
    spread operator (...) 和 null-aware spread operator (...?)
  var list = [1, 2, 3];
  var list2 = [0, ...list];
  print(list2); // [0, 1, 2, 3]

  var null_list;
  var list3 = [0, ...?null_list]; // 可為空
  print(list3); // [0]
  • collection ifcollection for
    Dart also offers collection if and collection for, which you can use to build collections using conditionals (if) and repetition (for).
  bool promoActive = true;
  var nav = ['Home', 'Furniture', 'Plants', if (promoActive) 'Outlet'];
  print(nav); // [Home, Furniture, Plants, Outlet]

  var listOfInts = [1, 2, 3];
  var listOfStrings = ['#0', for (var i in listOfInts) '#$i'];
  print(listOfStrings); // [#0, #1, #2, #3]
3.4、集合,關(guān)鍵字Set,(無(wú)序,大括號(hào)定義)
var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);
  • 在 Set 字面量前增加 const ,來(lái)創(chuàng)建一個(gè)編譯時(shí) Set 常量:
  final constantSet = const {
    'fluorine',
    'chlorine',
    'bromine',
    'iodine',
    'astatine',
  };
3.5、字典,關(guān)鍵字Map
// Map<String, String>
var gifts = {
  // Key:    Value
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
};
3.6、標(biāo)識(shí)符,Symbol
# label_1
# label_x

4、流程控制

  • if/else(與C語(yǔ)言基本一樣)
if (cond1) {
    
} else if (cond2) {
    
} else {
    
}
  • for:與C語(yǔ)言基本類(lèi)似,支持for-in,
for (int i=0; i<8; i++) {
    print(i);
}

// for-in
for (var object in flybyObjects) {
  print(object);
}
  • while / do-while(與C語(yǔ)言基本一樣)
while(1) {
    
}

do {
    
} while(1)
  • break/continue(與C語(yǔ)言基本一樣)

  • 在生產(chǎn)環(huán)境代碼中 assert() 函數(shù)會(huì)被忽略,不會(huì)被調(diào)用。
    在開(kāi)發(fā)過(guò)程中, assert(condition) 會(huì)在非 true 的條件下拋出異常。

switch/case

  • 使用 == 比較整數(shù),字符串,或者編譯時(shí)常量。
  • 比較的對(duì)象必須都是同一個(gè)類(lèi)的實(shí)例,并且不可以是子類(lèi), 類(lèi)必須沒(méi)有對(duì) == 重寫(xiě)。
  • 非空的 case 語(yǔ)句結(jié)尾需要跟一個(gè) break 語(yǔ)句???case 語(yǔ)句, 允許程序以 fall-through 的形式執(zhí)行。
var command = 'CLOSED';
switch (command) {
  case 'OPEN': //非空case,必須跟break
    executeOpen();
    break;

  case 'CLOSED': // 空 case ,支持falls-through.
  case 'NOW_CLOSED':
    // Runs for both CLOSED and NOW_CLOSED.
    executeNowClosed();
    break;
}
  • 支持lable
var command = 'CLOSED';
switch (command) {
  case 'CLOSED':
    executeClosed();
    continue nowClosed;
  // Continues executing at the nowClosed label.

  nowClosed:
  case 'NOW_CLOSED':
    // Runs for both CLOSED and NOW_CLOSED.
    executeNowClosed();
    break;
}

5、運(yùn)算符

5.1、基本
  • 除法:~/ 和 /
assert(5 / 2 == 2.5); // 結(jié)果是雙浮點(diǎn)型
assert(5 ~/ 2 == 2); // 結(jié)果是整型
  • 支持自增自減:++a、a++、--a、a--
5.2、空合運(yùn)算符??
  • expr1 ?? expr2
    如果 expr1 是 non-null, 返回 expr1 的值; 否則, 執(zhí)行并返回 expr2 的值。
// 如果b為空時(shí),將變量賦值給b,否則,b的值保持不變。
b ??= value;
5.3、類(lèi)型判定運(yùn)算符
  • as 將對(duì)象強(qiáng)制轉(zhuǎn)換為特定類(lèi)型。
  • is 和 is! 判斷變量是不是某種類(lèi)型。
5.4、級(jí)聯(lián)運(yùn)算符 ..

可以實(shí)現(xiàn)對(duì)同一個(gè)對(duì)像進(jìn)行一系列的操作。

querySelector('#confirm') // 獲取對(duì)象。
  ..text = 'Confirm' // 調(diào)用成員變量。
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'));

// 等價(jià)于
var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
最后編輯于
?著作權(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)容

  • flutter是dart語(yǔ)言開(kāi)發(fā)的一個(gè)移動(dòng)開(kāi)發(fā)ui框架,dart語(yǔ)言與其他各種高級(jí)語(yǔ)言非常類(lèi)似。下面記錄一些與c+...
    liil_7bb5閱讀 125評(píng)論 0 0
  • 前文鏈接: Dart簡(jiǎn)介 Dart語(yǔ)法(上) 內(nèi)容: 函數(shù)(方法)函數(shù)定義及各類(lèi)函數(shù);函數(shù)參數(shù);閉包 面向?qū)ο蠖x...
    玉圣閱讀 2,677評(píng)論 0 2
  • Dart 語(yǔ)言系列 Dart 語(yǔ)言入門(mén) (一) Dart 語(yǔ)言入門(mén) (二) Dart 語(yǔ)言入門(mén) (三) Dart ...
    mark666閱讀 1,789評(píng)論 2 8
  • 此文章是v1.0+時(shí)編寫(xiě),年代久遠(yuǎn),小心有毒,謹(jǐn)慎食用!??! 一些重要概念 所有的東西都是對(duì)象,所有的對(duì)象都是類(lèi)的...
    soojade閱讀 10,217評(píng)論 2 27
  • 原文:https://www.dartlang.org/guides/language/language-tour...
    星空下奔跑閱讀 691評(píng)論 0 1

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