目录
numbers 支持两种int,double,int double都是num的子类。
Optional named parameters(可选命名参数)
Optional positional parameters(可选位置参数)
Default parameter values(默认参数值)
Control flow statements(流程控制语句)
Dart是啥?
官网地址:https://www.dartlang.org/,这么介绍的,是用来可以编写高质量的Android,iOS以及Web应用程序的语言。
有哪些特点呢?
- 语法简洁,工具简单但强大,尽早的发现错误,核心库已经很成熟了。
- 快,提供AOT编译,以便在移动平台和web更快的启动。
- JIT编译,开发效率高,热重载。
- 可移植,跨平台姓,Android,iOS,Web。
- 上手简单,如果熟悉了c++,java,c#,都是面向对象,易学。
- 支持响应式编程,更快的内存分配和垃圾收集,支持异步编程。
安装SDK
$ brew tap dart-lang/dart
$ brew install dart
前提是已经安装homebrew,没有安装的可以复制下面这段命令:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
IDE的选择:vim,emacs.atom,vscode等。
如果是想快速熟悉语法可以使用dartpad https://dartpad.dartlang.org/,在线IDE。
基础介绍
一段代码:
// 定义个方法。
printNumber(num aNumber) {
print('The number is $aNumber.'); // 在控制台打印内容。
}
// 这是程序执行的入口。
main() {
var number = 42; // 定义并初始化一个变量。
printNumber(number); // 调用一个方法。
}
提示:使用两个空格来缩进代码。
一些重要的概念:
- 所有能够使用变量引用的都是对象, 每个对象都是一个类的实例。在 Dart 中 甚至连 数字、方法和
null
都是对象。所有的对象都继承于 Object 类。 - 和 Java 不同的是,Dart 没有
public
、protected
、 和private
关键字。如果一个标识符以 (_) 开头,则该标识符 在库内是私有的。 - 标识符可以以字母或者 _ 下划线开头,后面可以是 其他字符和数字的组合。
- Dart 在运行之前会先解析你的代码。你可以通过使用 类型或者编译时常量来帮助 Dart 去捕获异常以及 让代码运行的更高效。
变量
var name = 'Bob';
变量是一个引用。上面名字为 name
的变量引用了 一个内容为 “Bob” 的 String 对象。
Default value(默认值) 没有初始化的变量自动获取一个默认值为 null
。类型为数字的 变量如何没有初始化其值也是 null,不 要忘记了 数字类型也是对象。
可选类型
String name = 'Bob';
添加类型可以更加清晰的表达你的意图。 IDE 编译器等工具有可以使用类型来更好的帮助你, 可以提供代码补全、提前发现 bug 等功能。
Final and const
如果你以后不打算修改一个变量,使用 final
或者 const
。 一个 final 变量只能赋值一次;一个 const 变量是编译时常量。 (Const 变量同时也是 final 变量。) 顶级的 final 变量或者类中的 final 变量在 第一次使用的时候初始化。
final name = 'Bob'; // Or: final String name = 'Bob';
// name = 'Alice'; // Uncommenting this causes an error
const
变量为编译时常量。 如果 const 变量在类中,请定义为 static const
。 可以直接定义 const 和其值,也 可以定义一个 const 变量使用其他 const 变量的值来初始化其值。
const bar = 1000000; // Unit of pressure (dynes/cm2)
const atm = 1.01325 * bar; // Standard atmosphere
const
关键字不仅仅只用来定义常量。 有可以用来创建不变的值, 还能定义构造函数为 const 类型的,这种类型 的构造函数创建的对象是不可改变的。任何变量都可以有一个不变的值
// Note: [] creates an empty list.
// const [] creates an empty, immutable list (EIA).
var foo = const []; // foo is currently an EIA.
final bar = const []; // bar will always be an EIA.
const baz = const []; // baz is a compile-time constant EIA.
// You can change the value of a non-final, non-const variable,
// even if it used to have a const value.
foo = [];
// You can't change the value of a final or const variable.
// bar = []; // Unhandled exception.
// baz = []; // Unhandled exception.
基本数据类型
Dart 内置支持下面这些类型:
- numbers
- strings
- booleans
- lists (也被称之为 arrays)
- maps
- runes (用于在字符串中表示 Unicode 字符)
- symbols
numbers 支持两种int,double,int double都是num的子类。
var x = 1;
var hex = 0xDEADBEEF;
var bigInt = 34653465834652437659238476592374958739845729;
var y = 1.1;
var exponents = 1.42e5;
Strings
Dart 字符串是 UTF-16 编码的字符序列。 可以使用单引号或者双引号来创建字符串:
var s1 = 'Single quotes work well for string literals.';
var s2 = "Double quotes work just as well.";
var s3 = 'It\'s easy to escape the string delimiter.';
var s4 = "It's even easier to use the other delimiter.";
Booleans(布尔值)
为了代表布尔值,Dart 有一个名字为 bool
的类型。 只有两个对象是布尔类型的:true
和 false
所创建的对象, 这两个对象也都是编译时常量。
var name = 'Bob';
if (name) {
// Prints in JavaScript, not in Dart.
print('You have a name!');
}
Lists(列表)
也许 array (或者有序集合)是所有编程语言中最常见的集合类型。 在 Dart 中数组就是 List 对象。所以 通常我们都称之为 lists。
var list = [1, 2, 3];
Maps
通常来说,Map 是一个键值对相关的对象。 键和值可以是任何类型的对象。每个 键 只出现一次, 而一个值则可以出现多次。Dart 通过 map 字面量 和 Map 类型支持 map。
var gifts = {
// Keys Values
'first' : 'partridge',
'second': 'turtledoves',
'fifth' : 'golden rings'
};
var nobleGases = {
// Keys Values
2 : 'helium',
10: 'neon',
18: 'argon',
};
Runes
在 Dart 中,runes 代表字符串的 UTF-32 code points。
Unicode 为每一个字符、标点符号、表情符号等都定义了 一个唯一的数值。 由于 Dart 字符串是 UTF-16 code units 字符序列, 所以在字符串中表达 32-bit Unicode 值就需要 新的语法了。
Symbols
一个 Symbol object 代表 Dart 程序中声明的操作符或者标识符。 你也许从来不会用到 Symbol,但是该功能对于通过名字来引用标识符的情况 是非常有价值的,特别是混淆后的代码, 标识符的名字被混淆了,但是 Symbol 的名字不会改变。
Functions
Dart 是一个真正的面向对象语言,方法也是对象并且具有一种 类型, Function
。 这意味着,方法可以赋值给变量,也可以当做其他方法的参数。 也可以把 Dart 类的实例当做方法来调用。
bool isNoble(int atomicNumber) {
return _nobleGases[atomicNumber] != null;
}
Optional parameters(可选参数)
可选参数可以是命名参数或者基于位置的参数,但是这两种参数不能同时当做可选参数。
Optional named parameters(可选命名参数)
调用方法的时候,你可以使用这种形式 paramName: value
来指定命名参数。
enableFlags(bold: true, hidden: false);
在定义方法的时候,使用 {param1, param2, …}
的形式来指定命名参数
/// Sets the [bold] and [hidden] flags to the values
/// you specify.
enableFlags({bool bold, bool hidden}) {
// ...
}
Optional positional parameters(可选位置参数)
把一些方法的参数放到 []
中就变成可选 位置参数了:
String say(String from, String msg, [String device]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
return result;
}
Default parameter values(默认参数值)
在定义方法的时候,可以使用 =
来定义可选参数的默认值。 默认值只能是编译时常量。 如果没有提供默认值,则默认值为 null
。
/// Sets the [bold] and [hidden] flags to the values you
/// specify, defaulting to false.
void enableFlags({bool bold = false, bool hidden = false}) {
// ...
}
// bold will be true; hidden will be false.
enableFlags(bold: true);
Anonymous functions(匿名方法)
大部分方法都带有名字,例如 main()
或者 printElement()
。 你有可以创建没有名字的方法,称之为 匿名方法,有时候也被称为 lambda 或者 closure 闭包。 你可以把匿名方法赋值给一个变量, 然后你可以使用这个方法,比如添加到集合或者从集合中删除。
匿名函数和命名函数看起来类似— 在括号之间可以定义一些参数,参数使用逗号 分割,也可以是可选参数。 后面大括号中的代码为函数体:
([[Type] param1[, …]]) {
codeBlock;
};
var list = ['apples', 'oranges', 'grapes', 'bananas', 'plums'];
list.forEach((i) {
print(list.indexOf(i).toString() + ': ' + i);
});
Operators(操作符)
Dart 支持常用的算术操作符,如下:
操作符 | 解释 |
---|---|
+ | 加号 |
– | 减号 |
-expr | 负号 |
* | 乘号 |
/ | 除号 |
~/ | 除号,但是返回值为整数 |
% | 取模 |
Dart 还支持递增、递减前缀 和后缀操作:
Operator | Meaning |
---|---|
++var | var = var + 1 (expression value is var + 1 ) |
var++ | var = var + 1 (expression value is var ) |
--var | var = var – 1 (expression value is var – 1 ) |
var-- | var = var – 1 (expression value is var ) |
Cascade notation (..)(级联操作符)
级联操作符 (..
) 可以在同一个对象上 连续调用多个函数以及访问成员变量。 使用级联操作符可以避免创建 临时变量, 并且写出来的代码看起来 更加流畅:
例如下面的代码:
querySelector('#button') // Get an object.
..text = 'Confirm' // Use its members.
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
Control flow statements(流程控制语句)
可以使用下面的语句来控制 Dart 代码的流程:
-
if
andelse
-
for
loops -
while
anddo
-while
loops -
break
andcontinue
-
switch
andcase
-
assert
使用 try-catch
和 throw
还能影响控制流程的 跳转
Exceptions(异常)
代码中可以出现异常和捕获异常。异常表示一些 未知的错误情况。如果异常没有捕获, 则异常会抛出,导致 抛出异常的代码终止执行。
和 Java 不同的是,所有的 Dart 异常是非检查异常。 方法不一定声明了他们所抛出的异常, 并且你不要求捕获任何异常。
Dart 提供了 Exception 和 Error 类型, 以及一些子类型。你还 可以定义自己的异常类型。但是, Dart 代码可以 抛出任何非 null 对象为异常,不仅仅是实现了 Exception 或者 Error 的对象。
参考文档: