Dart
是谷歌在 2011 年推出的编程语言,是一种结构化Web
编程语言,容许用户经过Chromium
中所整合的虚拟机(Dart VM
)直接运行Dart
语言编写的程序,免去了单独编译的步骤Dart VM
更快的性能与较低的启动延迟中受益Dart
从设计之初就为配合现代web
总体运做而考虑,开发团队也同时在持续改进Dart
向JavaScript
转换的快速编译器Dart VM
以及现代JavaScript
引擎(V8 等)都是Dart
语言的首选目标平台Dart
语言和Swift
语言有不少的类似之处在学习Dart
语言以前, 先了解一些Dart
相关的一些概念:web
O-Objective
中有一切皆对象的说法, 这句话在Dart
中一样适用
Dart
中 甚至连 数字、方法和null
都是对象Object
类Dart
动态类型语言, 尽可能给变量定义一个类型,会更安全,没有显示定义类型的变量在debug
模式下会类型会是dynamic
(动态的)Dart
会在运行以前解析你的全部代码,指定数据类型和编译时的常量,能够提升运行速度Dart
中的类和接口是统一的,类即接口,你能够继承一个类,也能够实现一个类(接口),天然也包含了良好的面向对象和并发编程的支持Dart
函数
main()
)Dart
支持顶级变量,以及依赖于类或对象(静态变量和实例变量)变量。实例变量有时被称为域或属性Dart
不具有关键字public
,protected
和private
。若是一个标识符如下划线(_)
开始,那么它和它的库都是私有的以上只是大概说明了一些
Dart
中的重要概念, 具体的语法使用, 请看下文编程
Dart
的注释分为3种:单行注释、多行注释、文档注释安全
//
开头/*
开头,以*/
结尾///
或者/**
开头Dart
语句Dart
中,用分号来结束语句是必须的, 不加分则会报错Dart
的编程规范,使用2个空格来缩进print(Object)
使用var
、Object
或dynamic
关键字声明变量bash
var name = 'name';
dynamic name1 = 'name1';
String name2 = 'name2';
// 变量的赋值
name = 'a';
name1 = 'a1';
name2 = 'a2';
复制代码
未初始化的变量的初始值为null
, 即便是数字也是如此,由于在Dart
中数字也是一个对象微信
var name;
dynamic name1;
String name2;
复制代码
可选类型并发
在声明变量的时候,你能够选择加上具体的类型:less
String name2 = 'name2';
复制代码
var
而不是具体的类型来定义局部变量final
或者const
final
变量只能赋值一次const
变量是编译时常量final
可是不能是const
final
修饰的变量(即常量2)编程语言
final age = 10;
final int age1 = 20;
// final修饰的变量不能从新赋值, 会报错
age = 20;
age1 = 30;
复制代码
const
变量为编译时常量const
定义常量,请定义为static const
const
定义的常量, 能够直接给定初始值,也可使用其余const
变量的值来初始化其值// const
const m1 = 12;
const double m2 = 23;
const m3 = m1 + m2;
// final修饰的变量不能从新赋值, 会报错
m1 = 10;
m2 = 1.02;
复制代码
Dart
支持经常使用的算术操做符ide
操做符 | 解释 |
---|---|
+ |
加号 |
– |
减号 |
-expr |
负号 |
* |
乘号 |
/ |
除号(值为double 类型) |
~/ |
除号,可是返回值为整数 |
% |
取模 |
示例:函数
assert(2 + 3 == 5);
assert(2 - 3 == -1);
assert(2 * 3 == 6);
assert(5 / 2 == 2.5); // 结果是double类型
assert(5 ~/ 2 == 2); // 结果是integer类型
assert(5 % 2 == 1); // 余数
复制代码
Dart
还支持自加自减操做
++var
: 先自加在使用var++
: 先使用在自加--var
: 先自减在使用var--
: 先使用在自减示例
var a = 0, b = 0;
b = a++;
print('a = $a, b = $b'); //a = 1, b = 0
b = ++a;
print('a = $a, b = $b'); //a = 2, b = 2
b = a--;
print('a = $a, b = $b'); //a = 1, b = 2
b = --a;
print('a = $a, b = $b'); //a = 0, b = 0
复制代码
运算符 | 含义 |
---|---|
== |
等于 |
!= |
不等于 |
> |
大于 |
< |
小于 |
>= |
大于等于 |
<= |
小于等于 |
==
操做符identical()
方法external bool identical(Object a, Object b);
复制代码
类型断定操做符是在运行时断定对象类型的操做符
操做符 | 解释 |
---|---|
as |
类型转换 |
is |
若是对象是指定的类型返回 True |
is! |
若是对象是指定的类型返回 False |
obj
实现了 T
的接口, obj is T
才是true
。例如obj is Object
老是true
as
操做符把对象转换为特定的类型as
它当作用is
断定类型而后调用 所断定对象的函数的缩写形式if (emp is Person) { // Type check
emp.firstName = 'Bob';
}
// 上面代码可简化为
(emp as Person).firstName = 'Bob';
复制代码
注意: 若是
emp
是null
或者不是Person
类型,则第一个示例使用is
则不会执行条件里面的代码,而第二个状况使用as
则会抛出一个异常; 因此在不缺定emp
是否为空的状况下, 安全起见, 建议使用第一种方式
= |
–= |
/= |
%= |
>>= |
^= |
+= |
*= |
~/= |
<<= |
&= |
示例:
// 给 a 变量赋值
a = value;
// 复合赋值操做符
a += b; // 等价于a = a + b;
// 若是 b 是 null,则赋值给 b;
// 若是不是 null,则 b 的值保持不变
b ??= value;
// 以下所示:
var s;
print(s); // null
print(s ?? 'str'); // str
s ??= 'string';
print(s); // string
复制代码
可使用逻辑操做符来 操做布尔值:
!expr
: 对表达式结果取反(true 变为 false ,false 变为 true)||
: 逻辑 OR&&
: 逻辑 ANDcondition ? expr1 : expr2
// 若是 condition 是 true,执行 expr1 (并返回执行的结果); 不然执行 expr2 并返回其结果
expr1 ?? expr2
// 若是 expr1 是 non-null,返回其值; 不然执行 expr2 并返回其结果
复制代码
示例:
String toString() => msg ?? super.toString();
// 上面的代码等价于
String toString() => msg == null ? super.toString() : msg;
// 等价于
String toString() {
if (msg == null) {
return super.toString();
} else {
return msg;
}
}
复制代码
级联操做符 (..
) 能够在同一个对象上 连续调用多个函数以及访问成员变量。 使用级联操做符能够避免建立 临时变量, 而且写出来的代码看起来 更加流畅
querySelector('#button') // Get an object.
..text = 'Confirm' // Use its members.
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
复制代码
第一个方法querySelector()
返回了一个selector
对象。 后面的级联操做符都是调用这个对象的成员, 并忽略每一个操做 所返回的值
// 上面代码等价于
var button = querySelector('#button');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
复制代码
级联调用也能够嵌套:
final addressBook = (new AddressBookBuilder()
..name = 'jenny'
..email = 'jenny@example.com'
..phone = (new PhoneNumberBuilder()
..number = '415-555-0100'
..label = 'home')
.build())
.build();
复制代码
注意:严格来讲,两个点的级联语法不是一个操做符, 只是一个Dart
特殊语法。
在Dart
中可使用下面的语句来控制Dart
代码的流程:
if-else
for
和for-in
while
和do-while
switch
assert
break
和continue
try-catch
和throw
if-else
Dart
支持if
语句以及可选的else
if (a == 0) {
print('a = 0');
} else if (a == 1) {
print('a = 1');
} else {
print('a = 2');
}
复制代码
注意点: 上述代码中的条件控制语句的结果必须是布尔值
可使用标准的for
循环, List
和Set
等实现了Iterable
接口的类还支持for-in
形式的遍历:
var arr = [0, 1, 2];
// for循环
for (var i = 0; i < arr.length; i++) {
print(arr[i]);
}
// for-in循环
for (var x in arr) {
print(x);
}
复制代码
While
和do-while
// while 循环在执行循环以前先判断条件是否知足:
while (c == 0) {
print('c = $c');
}
// 而do-while循环是先执行循环代码再判断条件:
do {
print('c = $c');
} while (c == 0);
复制代码
Break
和continue
使用break
来终止循环:
while (true) {
if (shutDownRequested()) break;
processIncomingRequests();
}
复制代码
使用continue
来开始下一次循环
for (int i = 0; i < candidates.length; i++) {
var candidate = candidates[i];
if (candidate.yearsExperience < 5) {
continue;
}
candidate.interview();
}
复制代码
Switch
Dart
中的Switch
语句使用 ==
比较 integer
、string
、或者编译时常量case
语句都必须有一个break
语句continue
、throw
或者return
来结束非空case
语句case
语句匹配的时候,可使用default
语句来匹配这种默认状况case
语句能够有局部变量,局部变量只有在这个语句内可见var command = 'OPEN';
switch (command) {
case 'CLOSED':
print('CLOSED');
break;
case 'APPROVED':
print('APPROVED');
// break;
// 这里非空的case, 没有break会报错
case 'DENIED':
// 这里空的case, 能够不要break
case 'OPEN':
print('OPEN');
continue nowClosed;
//若是你须要实现这种继续到下一个 case 语句中继续执行,则能够 使用 continue 语句跳转到对应的标签(label)处继续执行:
nowClosed:
case 'PENDING':
print('PENDING');
break;
default:
print('default');
}
复制代码
assert
语句中断代码的执行assert
方法的参数能够为任何返回布尔值的表达式或者方法。true
,断言执行经过,执行结束false
,断言执行失败,会抛出一个异常// Make sure the variable has a non-null value
assert(text != null);
// Make sure the value is less than 100
assert(number < 100);
// Make sure this is an https URL
assert(urlString.startsWith('https'));
复制代码
注意:断言只在开发模式下运行有效,若是在生产模式 运行,则断言不会执行
这篇文章的简单介绍就到这里了, 下一篇将会记录
Dart
的基本数据类型
欢迎您扫一扫下面的微信公众号,订阅个人博客!