前言:dart语言简介

Dart是谷歌开发的计算机编程语言,后来被Ecma认定为标准 。它被用于web、服务器、移动应用 和物联网等领域的开发。它是宽松开源许可证下的开源软件。
Dart是面向对象的、类定义的、单继承的语言。它的语法类似C语言,可以转译为JavaScript,支持接口、混入、抽象类、具体化泛型、可选类型和sound type system 。


一、变量

1.1.类型推导

创建一个变量并初始化

var name = ‘Bob’;

动态类型(会关闭类型检查)

dynamic name = ’ Bob’;

  1. void main() {
  2. dynamic name = 'Ronin';
  3. print(name.runtimeType);
  4. var name2 = 'Ronin';
  5. print(name2.runtimeType);
  6. name = 12;
  7. print(name.runtimeType);
  8. }

1.2.默认值

var s; //默认为null
print(s);

1.3.Final 和 const修饰符

如果你从未打算改变一个变量,那么可以使用final和const修饰它

  1. final name = 'zsh';
  2. name = 'zms'; // 错误做法
  3. const age = 20;
  4. age = 19; // 错误做法

final和const的区别?

const在赋值时, 赋值的内容必须是在编译期间就确定下来的
final在赋值时, 可以动态获取, 比如赋值一个函数

  1. String getName() {
  2. return "zsh";
  3. }
  4. main() {
  5. final name1 = getName(); //正确
  6. const name2 = getName(); //错误->需要执行函数才能取到值
  7. }

二、内建类型

2.1.数据类型

整数类型 int a = 1;
浮点类型 double = 1.23;
字符串类型 String s = ‘abc’;
布尔类型 bool flag = true;
List集合类型 List list = [‘a’,‘b’,‘c’,‘d’];
字典(Map)类型 Map<String,String> map2 = {‘name’:‘zsh’,‘age’:‘20’};

  1. main() {
  2. int a = 1; //整数类型
  3. print(a);
  4. double b = 1.23; //浮点类型
  5. print(b);
  6. String s = 'abc'; //字符串类型
  7. print('$s');
  8. bool flag = true; //布尔类型
  9. print(flag);
  10. var str1 = ['a','b','c','d']; //List集合类型,使用类型推导定义
  11. print('$str1 ${str1.runtimeType}');
  12. List<String> list = ['a','b','c','d']; //List定义
  13. print('$list ${list.runtimeType}');
  14. var map1 = {'name':'zsh','age':'20'}; //字典类型,使用类型推导定义
  15. print('$map1 ${map1.runtimeType}');
  16. Map<String,String> map2 = {'name':'zsh','age':'20'};
  17. print('$map2 ${map2.runtimeType}');
  18. }

2.2.集合的相关操作

2.2.1、所以集合都支持length属性

  1. main() {
  2. //1.length属性
  3. List<String> list = ['a','b','c','d'];
  4. Map<String,String> map = {'name':'zsh','age':'20'};
  5. print('${list.length}');
  6. print('${map.length}');
  7. }

2.2.2、添加,删除,包含操作

  1. main() {
  2. //1.length属性
  3. List<String> list = ['a','b','c','d'];
  4. Map<String,String> map = {'name':'zsh','age':'20'};
  5. //list
  6. list.add('e'); //添加
  7. print('$list');
  8. list.remove('a'); //删除
  9. print('$list');
  10. bool s = list.contains('b'); //是否包含
  11. print('$s');
  12. /**
  13. * ------------------------------------------------
  14. */
  15. //map
  16. Map<String,String> map2 = {'height':'10','weight':'20'};
  17. map.addAll(map2); //添加一个map集合
  18. print('$map');
  19. map.remove('name'); //删除
  20. print('$map');
  21. print('${map.containsKey('age')}'); //包含
  22. }

三、函数

3.1.函数的定义

返回值 函数的名称(参数列表) {
函数体
return 返回值
}

  1. String getString() {
  2. return "zsh";
  3. }
  4. void main() {
  5. String s = getString();
  6. print('$s');
  7. }

3.2.箭头函数

  1. void main() {
  2. List<String> list = ['a','b','c','d'];
  3. list.forEach((value)=> print('$value'));
  4. }

3.3.可选函数

  1. void copy(String name,{int age,int num }) {
  2. print('$name $age $num');
  3. }
  4. main() {
  5. copy('zsh');
  6. copy('zsh',age:20);
  7. copy('zsh',age: 20,num: 10);
  8. }

3.4.参数默认值

参数可以有默认值, 在不传入的情况下, 使用默认值
只有可选参数才可以有默认值

  1. copy(String name, {int age = 20, double height=1.3}) {
  2. print('name=$name age=$age height=$height');
  3. }

3.5.匿名函数

  1. (functio(){
  2. ```
  3. })()

3.6.词法作用域

dart中的词法有自己明确的作用域范围,它是根据代码的结构({})来决定作用域范围的
优先使用自己作用域中的变量,如果没有找到,则一层层向外查找。

  1. var s = 'zsh';
  2. main() {
  3. font() {
  4. print('$s');
  5. }
  6. font();
  7. }

3.7.词法闭包

闭包可以访问其词法范围内的变量,即使函数在其他地方被使用,也可以正常的访问。

  1. main() {
  2. makeAdder(num addBy) {
  3. return (num i) {
  4. return i + addBy;
  5. };
  6. }
  7. var adder2 = makeAdder(2);
  8. print(adder2(10)); // 12
  9. print(adder2(6)); // 8
  10. var adder5 = makeAdder(5);
  11. print(adder5(10)); // 15
  12. print(adder5(6)); // 11
  13. }

3.7.返回值问题

所有函数都返回一个值。如果没有指定返回值,则语句返回null;隐式附加到函数体。

  1. main(List<String> args) {
  2. print(foo()); // null
  3. }
  4. foo() {
  5. }

四、运算符

4.1.除法、整除、取模运算

  1. var num = 7;
  2. print(num / 3); // 除法操作, 结果2.3333..
  3. print(num ~/ 3); // 整除操作, 结果2;
  4. print(num % 3); // 取模操作, 结果1;

4.2.条件运算符

Dart中包含一直比较特殊的条件运算符:expr1 ?? expr2

如果expr1是null,则返回expr2的结果;
如果expr1不是null,直接使用expr1的结果。

  1. var str = 'zsh';
  2. var str= null;
  3. var str= str ?? 'kobe';
  4. print(str);

4.3.级联语法

对一个对象进行连续的操作,这个时候可以使用级联语法

  1. class Shop{
  2. String name;
  3. void add() {
  4. print("${name} is add");
  5. }
  6. void update() {
  7. print("${name} is update");
  8. }
  9. }
  10. main(List<String> args) {
  11. final p1 = Shop();
  12. p1.name = 'zsh';
  13. p1.add();
  14. p1.update();
  15. final p2 = Shop()
  16. ..name = "zsh"
  17. ..add()
  18. ..update()
  19. }

五、循环语句

if 和 else
for循环
while和do-while循环
break和continue
switch和case

六、类和对象

6.1.类型的定义

class 类名 {
类型 成员名;
返回值类型 方法名(参数列表) {
方法体
}
}

  1. class Csrf{
  2. String name;
  3. test() {
  4. print('${name}');
  5. }
  6. }

6.2.不支持重载

Dart本身不支持函数的重载

  1. class Csrf{
  2. String name;
  3. int age;
  4. Csrf(String name, int age) {
  5. this.name = name;
  6. this.age = age;
  7. }
  8. }

6.3.抽象类

抽象方法,必须存在于抽象类中。
抽象类是使用abstract声明的类。

  1. abstract class AbstractContainer {
  2. void updateChildren();

6.4.继承

Dart中的继承使用extends关键字,子类中使用super来访问父类。
父类中的所有成员变量和方法都会被继承,,但是构造方法除外。

  1. class Animal {
  2. String name;
  3. }
  4. class Cat extends Animal {
  5. }

6.5.隐式接口

默认情况下,定义的每个类都相当于默认也声明了一个接口,可以由其他的类来实现(因为Dart不支持多继承)

  1. abstract class Dog{
  2. method1();
  3. }
  4. abstract class Cat{
  5. method2();
  6. }
  7. class Person implements Dog, Cat{
  8. @override
  9. method1() {
  10. }
  11. @override
  12. method2() {
  13. }
  14. }

6.6.Mixin混入

Mixin混入的方式实现多继承

  1. mixin Cat{
  2. method1() {
  3. }
  4. }
  5. mixin Dog{
  6. method2() {
  7. }
  8. }
  9. class Person implements Cat, Dog{
  10. }

七、泛型

7.1.List泛型

List list = [‘zsh’, ‘zms’, ‘user’];
var list = [‘zsh’, ‘zms’, ‘user’];

7.2.Map泛型

Map<String, String> map= {‘name’: ‘zsh’, ‘age’: ‘20’};
var map2 = <String, String>{‘name’: ‘zsh’, ‘age’: ‘20’};

7.3.泛型方法

T first(List ts) {
T tmp = ts[0];
return tmp;
}

  1. main() {
  2. var names = ['zsh', 'ss'];
  3. var first = getFirst(names);
  4. print('$first ${first.runtimeType}');//zsh String
  5. }
  6. T getFirst<T>(List<T> ts) {
  7. return ts[0];
  8. }

八、异步

Dart是单线程模型

Dart是一个单线程语言.我们在处理耗时操作的时候使用stream或者future来实现
async和await关键字支持异步编程,允许您编写类似于同步代码的异步代码。

九、元数据

使用元数据提供关于代码的附加信息。元数据注释以字符@开头

  1. class Todo {
  2. final String who;
  3. final String what;
  4. Todo(this.who, this.what);
  5. }
  1. import 'todo.dart';
  2. @Todo('seth', 'make this do something')
  3. void doSomething() {
  4. print('do something');
  5. }

Dart语言基础的更多相关文章

  1. Flutter学习之Dart语言基础(构造函数)

    最常见的构造函数形式,即生成构造函数,创建一个类的新实例: class Point { num x, y; //Dart中int和double是num的子类 //this引用当前类对象 Point(n ...

  2. Fluter基础巩固之Dart语言详解<一>

    在上一篇https://www.cnblogs.com/webor2006/p/11367345.html中咱们已经搭建好了Flutter的开发环境了,而Flutter的开发语言是选用的dart,那么 ...

  3. Fluter基础巩固之Dart语言详解<三>

    继续Dart语言的学习,这次过后下次就进入全新的Flutter的学习了,小小的激动.. 操作符重载: C++中也有,咱们来看一下在Dart中是如何来实现的: 比较简单. 异步[重要!]: async和 ...

  4. Fluter基础巩固之Dart语言详解<二>

    继续学习枯燥的Dart语言语法,目前的耐得住寂寞是为了将来学得“爽”做准备的!!! 异常: Dart 提供了 Exception 和 Error 类型, 以及一些子类型.还可以定义自己的异常类型.但是 ...

  5. 红黑树的删除详解与思路分析——不同于教科书上的算法(dart语言实现)

    对于红黑树的删除,看了数据结构的书,也看了很多网上的讲解和实现,但都不满意.很多讲解都是囫囵吞枣,知其然,不知其所以然,讲的晦涩难懂. 红黑树是平衡二叉树的一种,其删除算法是比较复杂的,因为删除后还要 ...

  6. dart系列之:dart语言中的内置类型

    目录 简介 Null 数字 字符串 布尔值 列表 set和map 简介 和所有的编程语言一样,dart有他内置的语言类型,这些内置类型都继承自Object,当然这些内置类型是dart语言的基础,只有掌 ...

  7. 《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(下)

    索引: 一.SQL Server的体系结构 二.查询 三.表表达式 四.集合运算 五.透视.逆透视及分组 六.数据修改 七.事务和并发 八.可编程对象 五.透视.逆透视及分组 5.1 透视 所谓透视( ...

  8. 《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(上)

    索引: 一.SQL Server的体系结构 二.查询 三.表表达式 四.集合运算 五.透视.逆透视及分组 六.数据修改 七.事务和并发 八.可编程对象 一.SQL Server体系结构 1.1 数据库 ...

  9. C#语言基础

    第一部分 了解C# C#是微软公司在2000年7月发布的一种全新且简单.安全.面向对象的程序设计语言,是专门为.NET的应用而开发的.体现了当今最新的程序设计技术的功能和精华..NET框架为C#提供了 ...

随机推荐

  1. CSAPP shell Lab 详细解答

    Shell Lab的任务为实现一个带有作业控制的简单Shell,需要对异常控制流特别是信号有比较好的理解才能完成.需要详细阅读CS:APP第八章异常控制流并理解所有例程. Slides下载:https ...

  2. linux下更改文件字符格式为uft-8

    liunx下发布的.net Core 程序,发现短信签名不错误不能发出.后来检查发现配配文件中的字符为乱码才知道是因为字符格式问题. 因为服务器批较多,还是使用命令来解决比较快.使用iconv来更改. ...

  3. CSAPP CH7链接的应用:静动态库制作与神奇的库打桩机制

    目录 创建静态库 创建动态库 库打桩机制 编译时打桩: 链接时打桩 运行时打桩 运行时打桩的printf与malloc循环调用debug 使用LD_PRELOAD对任意可执行程序调用运行时打桩 总结 ...

  4. vite2 打包的时候vendor-xxx.js文件过大的解决方法

    vite2是一个非常好用的工具,只是随着代码的增多,打包的时候 vendor-xxxxxx.js 文件也越来越大,这就郁闷了. 打包时遇到警告 输出文件名字/static/vendor.9b5698e ...

  5. Docker容器和虚拟机区别

    Docker .虚拟机之间区别 虚拟机技术的缺点: 1.资源占用太多 2.冗余步骤多 3.启动很慢 容器化技术 1.服务器资源利用率高 2.比较轻量化 3.打包镜像测试,一键运行 比较Docker和虚 ...

  6. 在/etc/docker/下 创建daemon.json重新加载后docker无法启动问题 /etc/docker/daemon.json编辑不了 找不到

    可能产生这个问题的原因至少有以下几个: 编辑daemon.json步骤不对:想要创建并编辑daemon.json,应该是先启动docker服务,此时系统自动产生/etc/docker目录,此时cat生 ...

  7. Java基础——基本类型包装类

    一.概述: 将基本数据类型封装成对象 优点: 可以在对象中定义更多的功能方法操作该数据 常见用法: 用于基本类型与字符串之间的转换 基本数据类型 包装类 byte Byte short Short i ...

  8. unicode和unicode编码

    unicode编码是什么? 这其实是两个问题,unicode 是什么什么?unicode是怎样编码的? What is Unicode? Unicode provides a unique numbe ...

  9. python3鸡兔同笼问题

    # 假设兔子有x只 for x in range(1,31): y = 30 - x if 4*x + 2*y == 90: print('兔子有%d只,鸡有%d只'%(x, y))

  10. bzoj5130 字符串的周期(kmp,最小表示法)

    bzoj5130 字符串的周期(kmp,最小表示法) bzoj 题解时间 m很大,n很小. 周期很容易求,就是kmp之后n-fail[n]. 之后对于枚举所有的字符串用最小表示法,暴力搜索. 能过就完 ...