Dart语言是由谷歌公司开发的网络编程语言,于2011年10月10日发布。有了Dart,你可用的网页脚本将不只是Java专属.在使用Chromium的浏览器中,你可以直接运行Dart程序,而且有可靠的虚拟机帮助你提升程序性能和安全性.
即使你的浏览器不支持Dart语言,Dart也可以被转换为Java代码,也不必再担心兼容上的问题.
同时,Dart还可以用来编写桌面应用程序,这很像Java的Node.js。
Flutter使用dart语言来进行开发,dart官方也提供了在线编译器来学习dart语言语法
2.1 程序入口 main函数
// 这是dart程序执行的入口。
main() {
var number = 42; // 定义并初始化一个变量。
printNumber(number); // 调用一个方法。
}
在dart应用里,main函数表示程序的执行入口,执行一个dart应用,就会调用文件的main函数进行启动。
2.2 变量
main() {
var a = 'a';
int b = 10;
String s = "hello";
}
你可以明确指定某个变量的类型,如int bool String,也可以用var或 dynamic来声明一个变量,Dart会自动推断其数据类型。
Dart有如下几种内建的数据类型:
1、numbers 数字
2、strings 字符串
3、booleans 布尔
4、lists(或者是arrays) 数组
5、Maps
6、runes(UTF-32字符集的字符)
7、Symbols
下面用代码说明:
main() {
// numbers
var a = 0;
int b = 1; //整数
double c = 0.1; //浮点数
// strings
var s1 = 'hello';
String s2 = "world";
// booleans
var real = true;
bool isReal = false;
// lists
var arr = [1, 2, 3, 4, 5];
List<String> arr2 = ['hello', 'world', "123", "456"]; //String的数组
List<dynamic> arr3 = [1, true, 'haha', 1.0]; //自动推断数据类型
// maps
var map = new Map();
map['name'] = 'zhangsan';
map['age'] = 10;
Map m = new Map();
m['a'] = 'a';
//runes,Dart 中 使用runes 来获取UTF-32字符集的字符。String的 codeUnitAt and codeUnit属性可以获取UTF-16字符集的字符
var clapping = '\u{1f44f}';
print(clapping); // 打印的是拍手emoji的表情
// symbols
print(#s == new Symbol("s")); // true
}
注意:没有赋初值的变量都会有默认为null
2.3 函数
Dart 的函数支持函数声明、函数字面量、箭头函数、函数表达式、匿名函数。
int add(int a, int b) {
return a + b;
}
// 类型可省略
add(a, b) {
return a + b;
}
// 箭头函数
var add = (a, b) => a + b;
int add(int a, int b) => a + b;
// 可选参数,使用 [] 限定
int add(int a, int b, [int c = 1, int d = 2]) => a + b + c + d;
// 显示指定参数名称,默认参数
int add({ int a = 1, int b = 2 }) {
return a + b;
}
add(a: 1, b: 2);
2.3 操作符
操作符包括了:expr++、expr--、()、[]、.、?、等,基本和 ES6 一致,除了没有 === 的判断。
例外有三个特色的操作:is、as、is?。
// is运算符用于判断一个变量是不是某个类型的数据
// is!则是判断变量不是某个类型的数据
var s = "hello";
print(s is String); // true
var num = 6;
print(num is! String); // true
// ~/才是取整运算符,如果使用/则是除法运算,不取整
int k = 1;
int j = 2;
print(k / j); // 0.5
print(k ~/ j); // 0
// as运算符类似于Java中的cast操作,将一个对象强制类型转换
(emp as Person).teach();
// ??=运算符 如果 ??= 运算符前面的变量为null,则赋值,否则不赋值
var param1 = "hello", param2 = null;
param1 ??= "world";
param2 ??= "world";
print("param1 = $param1"); // param1 = hello
print("param2 = $param2"); // param2 = world
// ?.运算符
var str1 = "hello world";
var str2 = null;
print(str1?.length); // 11
print(str2?.length); // null
print(str2.length); // 报错
2.4 控制流程
Dart 的控制流程支持:if、 if-else、 for、 while、 do-while、 switch、try-catch-finally
if (isRaining()) {
// ...
} else if (isSnowing()) {
// ...
} else {
// ...
}
var message = new StringBuffer('Dart is fun');
for (var i = 0; i < 5; i++) {
message.write('!');
}
var collection = [0, 1, 2];
for (var x in collection) {
print(x); // 0 1 2
}
2.5 类(Class)
类的定义与构造方法
Dart中的类没有访问控制,所以你不需要用private, protected, public等修饰成员变量或成员函数,一个简单的类如下代码所示:
class Person {
String name;
int age;
String gender;
Person(this.name, this.age, this.gender);
sayHello() {
print("hello, this is $name, I am $age years old, I am a $gender");
}
}
上面的Person类中有3个成员变量,一个构造方法和一个成员方法,看起来比较奇怪的是Person的构造方法,里面传入的3个参数都是this.xxx,而且没有大括号{}包裹的方法体,这种语法是Dart比较独特而简洁的构造方法声明方式,它等同于下面的代码:
Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
要调用Person类的成员变量或成员方法,可以用下面的代码:
var p = new Person("zhangsan", 20, "male");
p.sayHello();
p.age = 50;
p.gender = "female";
p.sayHello();
Dart 中的实现接口类
class Impostor implements Person {
get _name => '';
String greet(String who) => 'Hi $who. Do you know who I am?';
}
2.6 模块
Dart 的模块导入。
// 全部导入,并且是全局变量
import 'dart:math';
max(1, 2);
// 别名
import 'dart:math' as math;
math.max(1, 2);
// 只导入部分
import 'dart:math' show min;
min(1, 2);
// 懒加载,类似 ES6 的 import()
import 'dart:math' deferred as math;
Future greet() async {
await math.max(1, 2);
}
2.7 异步
在 ES6 与异步相关的就是 Promise、async、await。而在 Dart 则是 Future、async、await。
使用 async/await 之前需要引入 dart:async 模块。
import 'dart:async';
Future<String> lookUpVersion() async => '1.0.0';
Future main() async {
await for (var request in requestServer) {
handleRequest(request);
}
}
2.8 正则表达式
正则使用的是 RegExp 对象。
RegExp exp = new RegExp(r"(\w+)");
// 返回正则表达式匹配项的可迭代对象
exp.allMatches("abc def ghi");
// 搜索并返回第一个匹配项,没有则返回null
exp.firstMatch("");
// 正则表达式是否找到匹配项
exp.hasMatch("as");
// 从第几个字符开始匹配正则表达式
exp.matchAsPrefix("ab cd", 3);
// 返回正则表达式的第一个匹配字符串
exp.stringMatch("abc de");
// 返回正则表达式的字符串表示
exp.toString();
作者:源码时代本文版权归源码时代所有,转载请注明出处,如果您觉得有用欢迎点赞留言,更多开发技术学习资料查看源码时代主页。