几个概念

1、dart中所有能放置到变量中的数据都是对象,是class的实例对象。不管是数字、函数、null等等,都继承自class这个类;
2、dart虽然是强类型,但是不需要指定变量的类型,因为dart能够推断出变量的类型;
3、dart支持范类型, 比如List<int> (a list of integers) 也可以List<dynamic> (a list of objects of any type);
4、dart支持顶级函数和顶级变量。(什么是顶级函数和顶级变量?)
5、表达式(expression)和声明(statement):表达式在runtime中有值,声明则没有。比如条件表达式condition: condition ? expr1 : expr2 ,式中可能会有两个值。而if else属于声明,runtime中没有值。一个声明中可能会有多个表达式,但是一个表达式中不能有声明;

关键字

变量

变量的初始化
var name = 'Bob';

dart会推断变量的类型,如果需要指定类型,则使用指定类型的注释即可,如果不确定类型,则使用dynamic或者object,官方推荐直接使用var,因为var是默认dynamic还是object来着?

变量的默认值

dart中未初始化的变量值都为null,即使数字也是null,因为数字在dart中和其他类型一样也是对象。

int lineCount;
assert(lineCount == null);

另外:assert(condition)是调试函数,生产环境中不会执行,如果condition为false,debug环境中会崩溃

Final and const

final修饰不可变实例变量
被final修饰的实例变量必须在构造体之前初始化,也就是说必须在变量初始化、构造器入参初始化、构造器初始化列表三个时间段中的一个阶段完成初始化(后续会讲到构造器)。

final name = 'Bob'; // 可以不加类型
final String nickname = 'Bobby'; // 也可以指定类型

final修饰的变量必须初始化,且只能在初始化时赋值一次

final name2; // 报错,未初始化name2 = 'Tim';  // 报错,不能修改final修饰的变量

const:修饰编译期不变的变量、创建常量值、声明创建常量之的构造函数

  const name4 = 'White'; // 修饰编译期不变的变量var list1 = const []; // 创建列表元素为常量的变量列表final list2 = const []; // 创建列表元素为常量的不变列表,这里已经初始化完成了,不能再改变const list3 = [];  // 修饰编译期不变的变量name4 = 'test'; // 报错,name4不能改变list1 = [1,2,3]; // 不报错list2 = [1,2,3]; // 报错,final修饰不能改变list3 = [1,2,3]; // 报错,const修饰的变量不能改变,同name4;

const还可以修饰构造函数,后文会讲到,list中对const的使用后文也会继续讲解;

内置类型

number

num对象包含两个子对象,分别是int和double。int在不同平台位数不同,但是不会超过64位。num对象自带+、-、*、/等运算方法,还有ceil、floor等方法,int类型支持位运算。如果number对象子类无法满足要求,可以查阅 dart:math
库。基本使用如下:

var x = 1;
var hex = 0xDEADBEEF;var y = 1.1;
var exponents = 1.42e5;

dart2.1之后,在必要情况下,会将int类型转换成double类型。在2.1之前,上下文为double类型的变量使用int类型会报错。
int类型的位运算:

assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 >> 1) == 1); // 0011 >> 1 == 0001
assert((3 | 4) == 7); // 0011 | 0100 == 0111

int、double、string相互转换:

// String -> int
var one = int.parse('1');
assert(one == 1);// String -> double
var onePointOne = double.parse('1.1');
assert(onePointOne == 1.1);// int -> String
String oneAsString = 1.toString();
assert(oneAsString == '1');// double -> String
String piAsString = 3.14159.toStringAsFixed(2);
assert(piAsString == '3.14');
string

string的基本使用:

  var s1 = 'hello';var s2 = 'world';var s3 = s1 + s2; //helloworldvar s4 = '${s1}sss'; // hellosssvar s5 = '$s1 $s2'; // hello worldassert('hello world' == s5);// 多行var s1 = '''You can createmulti-line strings like this one.''';var s2 = """This is also amulti-line string.""";

纯字符串:使用r + 'xxx'

var s1 = r'In a raw string, not even \n gets special treatment.';
var s2 = r'In a raw string, not even \n gets special treatment.';

打印结果:

In a raw string, not even \n gets special treatment.
In a raw string, not even gets special treatment.
bool

List

List初始的索引为0,所以最后一个元素的索引为list.length-1。list默认为int类型,但是会自动判断类型,如果包含多种类型的元素,则为dynamic类型。list是有序数组,而set则是无需数组,list基本使用如下:

  var list1 = [1,2,3];var list2 = ['1','2','3'];var list4 = ['1','2',3];// var list4 = <dynamic>['1','2',3];var para1 = list4[0];var para2 = list4[1];var para3 = list4[2];list1.add(4);print(list1); // [1,2,3,4]print(para1 is String); // trueprint(para2 is String); //trueprint(para3 is String); // falseprint(para3 is int); //trueprint(list4 is dynamic); // trueprint(list4 is List<int>); // falseprint(list4 is List<String>); // falseprint(list4 is List<dynamic>); // true

List支持spread operator (...) and the null-aware spread operator (...?),来初始化/添加元素。其中...?为添加非空元素。详细使用参考 spread operator proposal.

var list = [1, 2, 3];
var list2 = [0, ...list];
assert(list2.length == 4);var list;
var list2 = [0, ...?list];
assert(list2.length == 1);

list支持 collection if 和 collection for,详细使用参考control flow collections proposal.

var nav = ['Home','Furniture','Plants',if (promoActive) 'Outlet'
];var listOfInts = [1, 2, 3];
var listOfStrings = ['#0',for (var i in listOfInts) '#$i'
];
assert(listOfStrings[1] == '#1');

list的详细api参考文档:List

Sets

set是无需数组,使用{}来表示,但是需要注意其表达方式,如果不指定类型也不初始化,则系统会认定其为一个Map<dynamic, dynamic>.的字典,使用如下:

官方文档:https://dart.dev/guides/language/language-tour
中文文:https://www.kancloud.cn/marswill/dark2_document/709089
Design Guidelines:https://dart.dev/guides/language/effective-dart/design#do-annotate-with-object-instead-of-dynamic-to-indicate-any-object-is-allowed
Style Guide Recommendation:https://dart.dev/guides/language/effective-dart/design#types

备注:中文文档更新不及时,最好参考英文文档

Dart教程(四):语法相关推荐

  1. Docker教程(四) Docker镜像构建

    Docker教程(四) Docker镜像构建 本文链接:https://blog.csdn.net/yuan_xw/article/details/77744272 Docker教程(四) Docke ...

  2. Flex 布局教程:语法篇

    阮一峰的网络日志 » 首页 » 档案 上一篇:ES6 的功能侦测库 下一篇:Flex 布局教程:实 分类: 开发者手册 Flex 布局教程:语法篇 作者: 阮一峰 日期: 2015年7月10日 网页布 ...

  3. 菜鸟教程 MarkDown语法

    菜鸟教程之MarkDown语法 MarkDown标题 MarkDown段落 MarkDown字体 MarkDown分隔线 MarkDown删除线 MarkDown脚注 MarkDown列表 MarkD ...

  4. python3.4.4教程_Python3基础教程四(个人整理

    <Python3基础教程四(个人整理>由会员分享,可在线阅读,更多相关<Python3基础教程四(个人整理(21页珍藏版)>请在人人文库网上搜索. 1.Python运算符优先级 ...

  5. Flex 布局教程:语法篇(阮一峰)

    阿里云  >  教程中心   >  html教程  >  Flex 布局教程:语法篇(阮一峰) Flex 布局教程:语法篇(阮一峰) 发布时间:2018-03-12 来源:网络 上传 ...

  6. 【Dart 教程系列第 49 篇】Dart 是值传递还是引用传递

    这是[Dart 教程系列第 49 篇],如果觉得有用的话,欢迎关注专栏. 文章目录 一:结论 二:什么是值类型 ? 三:什么是引用类型 ? 四:值类型和引用类型的主要区别 五:验证 Dart 中的值传 ...

  7. 【Dart 教程系列第 40 篇】Dart 之 trim,trimLeft,trimRight 字符串去除空格

    这是[Dart 教程系列第 40 篇],如果觉得有用的话,欢迎关注专栏. trim 源码如下所示 String trim(); 语法 去除字符串中左右两边的空格,注意不是去掉字符串中所有的空格.如果两 ...

  8. Xamarin XAML语言教程基础语法篇大学霸

    Xamarin XAML语言教程基础语法篇大学霸 前  言 Xamarin是一个跨平台开发框架.它可以用来开发iOS.Android.Windows Phone和Mac的应用程序.使用Xamarin框 ...

  9. 史上最详细的Android Studio系列教程四--Gradle基础

    史上最详细的Android Studio系列教程四--Gradle基础 转载于:https://www.cnblogs.com/zhujiabin/p/5125917.html

  10. excel计算机不准确,Excel小教程四十一:关于Excel计算不准确,我们应该这样解决!...

    原标题:Excel小教程四十一:关于Excel计算不准确,我们应该这样解决! 我们有时候在用excel进行计算的时候,会遇到Excel计算不准确的的时候! 别怕,先听小雅为您一一道来! 5.1-5.2 ...

最新文章

  1. Hadoop HDFS文件操作的Java代码
  2. 对于后端来说,一个项目究竟应该怎么做
  3. 死磕Java并发:J.U.C之Java并发容器:ConcurrentLinkedQueue
  4. U3D+SVN: 两份相同资源放在不同目录下导致META的更改
  5. 地址总线是单向还是双向_三端双向交流开关(TRIAC)
  6. Android MediaScanner:(一)MediaScanner总体架构
  7. 来了!iPhone 12今晚天猫首销:12期分期免息,还送5G流量包
  8. BZOJ 2728 HNOI2012 与非 高斯消元
  9. PHP利用smarty生成静态页详解
  10. Elasticsearch 监控和优化(持续)
  11. 商业智能BI系统对企业有什么好处
  12. Cognos常见错误解决办法
  13. 开源免费etl作业批量调度必备软件 Taskctl Free应用版
  14. linux 解压 WinRAR 压缩文件
  15. AIDA64 Business Edition(系统检测)多国语言绿色特别
  16. 「 数学模型 」“使用SPSS软件线性回归分析”实例
  17. MySQL——MHA原理介绍及VIP配置
  18. 安装GNOME3桌面并设置开机启动图形界面
  19. 手机卫星定位系统_为什么手机支持北斗导航,却不知道如何开启?
  20. 【R_绘图】绘图字体设为Times New Roman

热门文章

  1. 垃圾回收相关算法总结
  2. JavaScript的==和Java的==比较
  3. Jxl读写Excel文件
  4. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](十一)
  5. Intel 处理器 ME 管理引擎是无法移除的安全隐患
  6. Windows用户最佳远程控制器——Xmanager
  7. 关于java字符串编译优化问题
  8. Java基础-----基类Object源码分析
  9. iOS启动动画效果实现
  10. Centos在VMware虚拟机上的网络配置一记