2.1、Dart语言基础:变量、运算符、流程控制

学习笔记,旨在于快速入门和学习Dart,其中可能会有理解错误,请指出,一起学习。

系列文章

2.1、Dart语言基础:变量、运算符
2.2、Dart语言基础:函数与闭包
2.3、Dart语言基础:面向对象
2.4、Dart语言基础:异步
2.5、Dart语言基础:库与包
...

一、概述

  • 语法类似C语言,可以转译为JavaScript;
  • 面向对象语言,属于强类型语言,支持可选类型;

参考:
dart英文官网
Dart 中文教程
dart-源码api

特性

重要概念

  • 一切皆为对象
    包括function函数、基础变量(int、float等)、null等;而且几乎所有类都继承于Object基类,Null除外。

  • 强类型语言,支持类型推导。
    强类型指的是不能给变量赋值类型不匹配的值,如下:int类型的赋值字符串报错。

var age = 10; // 类型推导为int
age = "xxx"; // 给int类型的变量 赋值 字符串报错
print(age);
  • 支持可选类型
    空值安全type?(类似于swift的可选类型),指的是变量可能为null。
int? aNullableInt = null;

如果变量确定一定有值,可以使用!(如果为空,则会抛出异常)。

int x = nullableButNotNullInt!
  • 字符串插值:
    美元符号$varName 或者 ${varName}
void sayHelloworld(String name) {
  print("$name say hello!"); //${name}
}
  • 顶级入口main函数。
void main(List<String> arguments)  { ... }
  • 定义任何类型的变量:
    Object?、Object 或者 关键字dynamic(在程序运行时才确定类型)。

二、基础


0、基本格式

  • 代码语句,必须以 分号; 结尾。

  • 代码注释:
    单行语句 // xxx
    多行语句 /* xxx */

  • 类型安全检测:
    Dart 的类型安全意味着不能使用 if / assert, 应该像下面这样,明确的进行值检查:

// 检查空字符串。
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万物结尾对象,因此变量实际就是一个引用。

1.1.1、声明方式
  • 方式一:明确指定类型
    String name = 'hello';

  • 方式二:不指定类型,关键字var
    官方推荐在函数内的本地变量尽量使用var声明。
    var name = 'hello';

  • 方式三:不指定类型,关键字dynamic
    在变量类型,不明确的情况下使用。
    dynamic name = 'hello';

  • 方式四:?明确指定可为空的变量
    int? aNullableAge;

1.1.2、变量声明是否可以为空?
  • 指定类型的变量,声明必须初始化,”不为空“,否则编译报错。
  //  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);
  • 可为空(dynamicvar 或者 ?声明)的变量,初始化可以为空;
  // 初始化可以不指定类型,值为null
  dynamic nickName;
  print(nickName);

  var name;
  print(name);

  String? nickName1;
  print(nickName1);
1.1.3、延迟变量,关键字late(Dart 1.6新加)
  • 定义一个允许延迟初始化的变量。
// late的特性:
Lazily initializing a variable. 
Declaring a non-nullable variable that’s initialized after its declaration.

// late的使用场景
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);
}
  • 如果 延迟变量 未被其他地方使用,对应语句不执行。
// 如果temperature没有被使用,则函数 _readThermometer 不会调用
late String temperature = _readThermometer(); 

1.2、常量

  • 关键字final, 变量的值只能被设置一次。
    最高级 final 变量或类变量在第一次使用时被初始化。
    必须在构造函数体执行之前初始化 final 实例变量 —— 在变量声明中,参数构造函数中或构造函数的初始化列表中进行初始化。
// Error: Can't assign to the final variable 'name'.
final String name = 'hello';
name = 'new hello';
  • 关键字const , 变量在编译时就已经固定。
    如果 Const 变量是类级别的,需要标记为 static const。
    实例变量可以是 final 类型但不能是 const 类型。
  // 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);
  • 以下不会报错
  // 此时,list推导的类型为不可变数组,修改字典值报错;
  var list = const [1,2,3];
  list[0] = 10;  // 报错Unsupported operation: Cannot modify an unmodifiable list
  
// 但是变量list可以被重新初始化赋值
  list = [1, 2, 3];
  print(list);

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

3、内置类型

3.1、专有变量
image.png
3.2、数值类型,关键字num,可以是int和double
  num val = 1;
  print(val); // 1

  val += 0.5;
  print(val); // 1.5
  • 布尔值,关键字falsetrue
  bool flag = false;
  print(flag);
  flag = true;
  print(flag);
3.3、数组,关键字List
var list = [1, 2, 3];
list[0] = 0;
list.length;

// C语言,大括号
int arr1[3] = {1, 2, 3};

常用APIs:

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

  fruits.add('apples');
  fruits.addAll(['pear', 'banana']);
  print('原数组:$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('原数组:$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('原数组:$numbers');
  numbers.sort((a, b) => a>b?a:b);
  print('倒叙:$numbers');
}
  • 展开运算符
    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、集合,关键字Set,(无序,大括号定义)
var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);
  • 在 Set 字面量前增加 const ,来创建一个编译时 Set 常量:
  final constantSet = const {
    'fluorine',
    'chlorine',
    'bromine',
    'iodine',
    'astatine',
  };
3.5、字典,关键字Map
// Map<String, String>
var gifts = {
  // Key:    Value
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
};
3.6、标识符,Symbol
# label_1
# label_x

4、流程控制

  • if/else(与C语言基本一样)
if (cond1) {
    
} else if (cond2) {
    
} else {
    
}
  • for:与C语言基本类似,支持for-in,
for (int i=0; i<8; i++) {
    print(i);
}

// for-in
for (var object in flybyObjects) {
  print(object);
}
  • while / do-while(与C语言基本一样)
while(1) {
    
}

do {
    
} while(1)
  • break/continue(与C语言基本一样)

  • 在生产环境代码中 assert() 函数会被忽略,不会被调用。
    在开发过程中, assert(condition) 会在非 true 的条件下抛出异常。

switch/case

  • 使用 == 比较整数,字符串,或者编译时常量。
  • 比较的对象必须都是同一个类的实例,并且不可以是子类, 类必须没有对 == 重写。
  • 非空的 case 语句结尾需要跟一个 break 语句。空 case 语句, 允许程序以 fall-through 的形式执行。
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、运算符

5.1、基本
  • 除法:~/ 和 /
assert(5 / 2 == 2.5); // 结果是双浮点型
assert(5 ~/ 2 == 2); // 结果是整型
  • 支持自增自减:++a、a++、--a、a--
5.2、空合运算符??
  • expr1 ?? expr2
    如果 expr1 是 non-null, 返回 expr1 的值; 否则, 执行并返回 expr2 的值。
// 如果b为空时,将变量赋值给b,否则,b的值保持不变。
b ??= value;
5.3、类型判定运算符
  • as 将对象强制转换为特定类型。
  • is 和 is! 判断变量是不是某种类型。
5.4、级联运算符 ..

可以实现对同一个对像进行一系列的操作。

querySelector('#confirm') // 获取对象。
  ..text = 'Confirm' // 调用成员变量。
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'));

// 等价于
var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容

  • flutter是dart语言开发的一个移动开发ui框架,dart语言与其他各种高级语言非常类似。下面记录一些与c+...
    liil_7bb5阅读 92评论 0 0
  • 前文链接: Dart简介 Dart语法(上) 内容: 函数(方法)函数定义及各类函数;函数参数;闭包 面向对象定义...
    玉圣阅读 2,293评论 0 2
  • Dart 语言系列 Dart 语言入门 (一) Dart 语言入门 (二) Dart 语言入门 (三) Dart ...
    mark666阅读 1,690评论 2 8
  • 此文章是v1.0+时编写,年代久远,小心有毒,谨慎食用!!! 一些重要概念 所有的东西都是对象,所有的对象都是类的...
    soojade阅读 10,051评论 2 27
  • 原文:https://www.dartlang.org/guides/language/language-tour...
    星空下奔跑阅读 648评论 0 1