
Dart语法
面向对象的语言。
语言特性
Dart所有的东西都是对象,所有对象都继承自Object类。 Dart动态类型语言,尽量给变量定义一个类型,会更安全,没有显示定义类型的变量在debug的时候会是dynamic的。 Dart在运行之前会解析所有代码,指定数据类型和编译时的常量,可以提供运行速度。 Dart中的类和接口是统一的,类即是接口,你可以继承一个类,也可以实现一个类(接口) Dart提供了顶级函数 Dart没有public,private,protected字段,变量名以_开始的意味着它的lib是私有的。 Dart未初始化的变量都会被赋值为null。 final的值只能被绑定一次,实例变量可以是final的,但是不能是const const 是一个编译时的常量. var arr = const[];
注意arr是变量,赋了一个常量值,也可以被赋其他的值。
关键字
| 关键字 | - | - | - |
|---|---|---|---|
| abstract | do | import | super |
| as | dynamic | in | switch |
| assert | else | - | sync* |
| enum | implements | is | this |
| async* | export | library | throw |
| await | external | mixin | true |
| break | extends | new | try |
| case | factory | null | typedef |
| catch | false | operator | var |
| class | final | part | void |
| const | finally | rethrow | while |
| continue | for | return | with |
| covariant | get | set | yield* |
| default | if | static | deferred |
变量和常量
声明变量
// 没有明确类型,编译的时候根据值明确类型
var name = ‘Bob’;
Object name = '张三';
dynamic name = '李四';
// 显示声明将被推断类型, 可以使用String显示声明字符串类型
String name = 'Bob' ;
变量的初始值
//测试 数字类型的初始值是什么?
int lineCount;
// 为false的时候抛出异常
assert(lineCount == null);
print(lineCount); //打印结果为null,证明数字类型初始化值是null
final and const
被final修饰的顶级变量或类变量在第一次声明的时候就需要初始化。被final或者const修饰的变量,变量类型可以省略,建议指定数据类型。被 final 或 const 修饰的变量无法再去修改其值。flnal 或者 const 不能和 var 同时使用。常量如果是类级别的,请使用 static const 在常量表达式中,该运算符的操作数必须为'bool'、'num'、'String'或'null', const常量必须用conat类型的值初始化。
//可以省略String这个类型声明
final name = "Bob";
final String name1 = "张三";
const name2 = "alex";
const String name3 = "李四";
name3 = '王五'; //报错。
const var String outSideName = 'Bill';//报错。
final var String name = 'Lili';//报错。
// 常量如果是类级别的,请使用 static const
static const String name3 = 'Tom';
const String outSideName = 'Bill';
final String outSideFinalName = 'Alex';
const String outSideName2 = 'Tom';
const aConstList = const ['1', '2', '3'];
// In constant expressions, operands of this operator must be of type 'bool', 'num', 'String' or 'null'
// 在常量表达式中,该运算符的操作数必须为'bool'、'num'、'String'或'null'。
const validConstString = '$outSideName $outSideName2 $aConstList';
// Const variables must be initialized with a constant value
// const常量必须用conat类型的值初始化
const validConstString = '$outSideName $outSideName2 $outSideFinalName';
var outSideVarName='Cathy';
// Const variables must be initialized with a constant value.
// const常量必须用conat类型的值初始化
const validConstString = '$outSideName $outSideName2 $outSideVarName';
// 正确写法
const String outSideConstName = 'Joy';
const validConstString = '$outSideName $outSideName2 $outSideConstName';
数据类型
num
num是数字类型的父类. 有两个子类int和double。 int, DartVM上是[-263,263),编译后的javaScript是[-253,253) double: 64位,双精度浮点数。 String
Dart里面的String是一系列 UTF-16 代码单元。 您可以使用单引号或双引号来创建一个字符串。 单引号或者双引号里面嵌套使用引号。 用 或{} 来计算字符串中变量的值,需要注意的是如果是表达式需要${表达式} bool
Dart 是强 bool 类型检查,只有bool 类型的值是true 才被认为是true。 只有两个对象具有bool类型:true和false,它们都是编译时常量。 Dart的类型安全意味着您不能使用 if(nonbooleanValue) 或 assert(nonbooleanValue)等代码, 相反Dart使用的是显式的检查值。 assert 是语言内置的断言函数,仅在检查模式下有效 在开发过程中, 除非条件为真,否则会引发异常。(断言失败则程序立刻终止) List集合
在Dart中,数组是List对象
// 创建list
List list = [10, 7, 23];
var fruits = new List();
可以直接打印list包括list的元素
list里面的元素必须保持类型一致,不一致就会报错
Map集合
// 方式一
Map companys = {'Alibaba': '阿里巴巴', 'Tencent': '腾讯', 'baidu': '百度'};
// 方式二
Map schoolsMap = new Map();
schoolsMap['first'] = '清华';
schoolsMap['second'] = '北大';
schoolsMap['third'] = '复旦';
注意:
map的key类型允许不一致
运算符
| 描述 | 表示 |
|---|---|
| 一元后置操作符 | expr++ ,expr-- ,() , [] ,. ,?. |
| 一元前置操作符 | expr !expr ~expr ++expr --expr |
| 乘除 | *, /, % , ~/ |
| 加减 | + ,- |
| 位移 | << , >> |
| 按位与 | & |
| 按位或 | | |
| 按位异或 | ^ |
| 逻辑与 | && |
| 逻辑或 | || |
| 关系和类型判断 | >= , > , <= , < ,as ,is,is! |
| 等于,不等于 | ==,!= |
| 如果为空 | ?? |
| 条件表达式 | expr1 ? expr2 : expr3 |
| 赋值 | =, *=, = ,~/=, %=, +=, -=, <<=, >>=, &=, ^=, =, ??= |
| 级联 | .. |
流程控制语句
if ... else for while do...while break ,continue switch...case assert
异常
throw
抛出特定类型的异常
throw new FormatException('xxxx')抛出任意类型的异常
throw 'xxxx'因为抛出异常属于表达式,可以将throw语句放在=>语句中,或者其它可以出现表达式的地方
distanceTo(Point other) => throw new UnimplementedError();try...catch
将可能出现异常的代码放置到try语句中,可以通过 on语句来指定需要捕获的异常类型,使用catch来处理异常。
try {
breedMoreLlamas();
} on OutOfLlamasException {
// A specific exception
buyMoreLlamas();
} on Exception catch (e) {
// Anything else that is an exception
print('Unknown exception: $e');
} catch (e, s) {
print('Exception details:\n $e');
print('Stack trace:\n $s');
}rethrow 语句用来处理一个异常,同时希望这个异常能够被其它调用的部分使用。
final foo = '';
void misbehave() {
try {
foo = "1";
} catch (e) {
print('2');
rethrow;// 如果不重新抛出异常,main函数中的catch语句执行不到
}
}
void main() {
try {
misbehave();
} catch (e) {
print('3');
}
}
finally
final foo = '';
void misbehave() {
try {
foo = "1";
} catch (e) {
print('2');
}
}
void main() {
try {
misbehave();
} catch (e) {
print('3');
} finally {
print('4'); // 即使没有rethrow最终都会执行到
}
}
函数 function
main函数(和C一样) 每个程序都有自己的main函数,它可以作为程序的入口,返回值为void,可以接收list的参数
级联符号.. 允许您在同一个对象上进行一系列操作。除了函数调用之外,还可以访问同一对象上的字段。这通常会为您节省创建临时变量的步骤,并允许您编写更流畅的代码。
querySelector('#confirm') // Get an object.
..text = 'Confirm' // Use its members.
..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!'));
级联符号也可以嵌套使用,但是当返回值是void时不能构建级联
final addressBook = (AddressBookBuilder()
..name = 'jenny'
..email = 'jenny@example.com'
..phone = (PhoneNumberBuilder()
..number = '415-555-0100'
..label = 'home')
.build())
.build();
可选参数(python) 可选的命名参数, 定义函数时,使用{param1, param2, …},用于指定命名参数。可选的位置参数,用[]它们标记为可选的位置参数
String say(String from, String msg, [String device]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
return result;
}
默认参数,函数可以使用=为命名参数和位置参数定义默认值。默认值必须是编译时常量。如果没有提供默认值,则默认值为null。(python)
作为一个类对象的功能 您可以将一个函数作为参数传递给另一个函数.您也可以将一个函数分配给一个变量
void printElement(int element) {
print(element);
}
var list = [1, 2, 3];
// 把 printElement函数作为一个参数传递进来
list.forEach(printElement);
var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!';
assert(loudify('hello') == '!!! HELLO !!!');
匿名函数
大多数函数都能被命名为匿名函数,如 main() 或 printElement()。您还可以创建一个名为匿名函数的无名函数,有时也可以创建lambda或闭包。您可以为变量分配一个匿名函数,例如,您可以从集合中添加或删除它。一个匿名函数看起来类似于一个命名函数 - 0或更多的参数,在括号之间用逗号和可选类型标注分隔。下面的代码块包含函数的主体:
var list = ['apples', 'bananas', 'oranges'];
list.forEach((item) {
print('${list.indexOf(item)}: $item');
});
如果函数只包含一条语句,可以使用箭头符号=>来缩短它, 比如上面的例2可以简写成:
list.forEach((item) => print('${list.indexOf(item)}: $item'));
返回值
所有函数都返回一个值,如果没有指定返回值,则语句return null,隐式地附加到函数体。
foo() {}
assert(foo() == null);
本篇文章就到这里啦~如果觉得不错的话,就转发出去,让更多人的看到,最后,关注一下,点个在看吧。





