Dart语言特性必备了解!
学习Dart语言,必须将以下的概念熟记于心:
- 在dart语言中,一切皆为对象。所有的对象都是一个类的实例。甚至整数、函数、null也看做是对象。所有的对象都继承于Object类
- 尽管Dart是强类型语言,但是变量的类型指定不一定要标明,因为Dart可以推断出它的类型。比如说变量number就可以被推测出是int类型。如果你想明确表示这个变量不想被任何一个类型指定,那就使用特殊类型dynamic来表示。
- Dart语言支持通用类型,比如List<int>表示整数集列表,List<dynamic>表示元素集为任意类型对象的列表
- Dart支持顶级函数(如main()),以及绑定到类或对象的函数(分别是静态方法和实例方法)。您还可以在函数中创建函数(嵌套函数或本地函数)。
- 类似的,Dart支持顶级变量,以及绑定到类或对象(静态和实例变量)的变量。实例变量有时称为字段或属性。
- 有别于JAVA语言,dart语言中没有public、protected和private这些关键字。在dart里面,如果标识符以下划线(_)开头,那么它对其库是私有的
- Dart里面的标志符号由
_
、字母和数字组成,只能以_
或者字母开头 - Dart既有表达式(具有运行时值),也有语句(不具有运行时值)。比如传统的表达式condition ? expr1 : expr2会有一个值,expr1或者expr2。相比较于if-else语句,则没有值。一个语句通常包括一个或者多个表达式,但是一个表达式不能直接包含一个语句。
- Dart工具会向你发出两种类型问题:警告和错误。警告则是指出你的代码存在问题,但是不会阻止你正在执行的程序。错误则会发生在编译时和运行时。编译时的错误会完全阻止你代码的运行。运行时错误导致代码执行时引发异常。
变量
定义一个变量name并初始化一个String类型的值zeng:
- var name = 'zeng'
这个name变量的类型会自动推断出String类型,但是你也可以通过其他方法来改变类型。如果你不想让一个变量仅仅受限为一个类型,你可以指定这个变量是Object或者dynamic类型,如下面的做法:
- dynamic name = 'zeng'
还有一个做法就是显示的声明你即将定义的变量的类型,如:
- String name = 'zeng'
如果你定义了一个变量而没有初始化值,则这个变量有一个默认值null。即使变量是个数值类型(int),也是null,因为在dart语言中,一切皆为对象。
- int a;
- assert(a == null)
final 和 const
如果你不想改变一个变量,使用final和const是最好的选择。final变量只能设置一次 ,const变量是一个编译时常量。顶层final或者class变量在第一次使用时就初始化 了。
定义一个final变量:
- final name = 'zeng';//没有一个类型声明
- final String nickName = 'lucky';
上面定义的final变量如果你改变他的值,则会报错:
- name = 'fan';//Error: a final variable can only be set once.
用const来定义一个编译时的变量。如果const变量位于class级别,则将其标记为静态const。在声明变量的地方,将值设置为编译时常量,如数字或字符串文字、常量变量或对常量进行算术运算的结果:
- const a = 1000;
- const double b = 1.05 * a;
数据类型
Dart语言有以下七种内置数据类型
- numbers
- strings
- booleans
- lists (also known as arrays)
- maps
- runes (for expressing Unicode characters in a string)
- symbols
Numbers
Dart有两种数值类型
int整数型
整数型的值不超过64位,取决于平台。如果在Dart VM平台,整数值的取值范围是 -263 ~ 263 - 1。dart如果是编译为javascript语言中javascript numbers,则取值为-253 ~ 253 - 1。
doubel浮点型
int和double类型都是数值型的子类型,这数值类型包括一些基本的运算符操作如 + 、- 、/ 和*,当然还有一些其他方法 abs()、ceil()、floor()。
int就是没有小数点的数值。比如:
- var x = 1;
- var y = 0xDEADBEEF;
而如果是有小数点的数值,它就是一个浮点型,比如:
- var y = 1.1;
- var exponents = 1.42e5;
在Dart2.1版本中,在必要的时候,整数型的数值会自动转换成浮点型的数值。比如
- double z = 1; // Equivalent to double z = 1.0.
下面的是演示怎样让字符型转换成数值型,反之亦然:
- // 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');
int类型也可进行按位操作(<<,>>)(&)、(|)
- assert((3 << 1) == 6); // 0011 << 1 == 0110
- assert((3 >> 1) == 1); // 0011 >> 1 == 0001
- assert((3 | 4) == 7); // 0011 | 0100 == 0111
数字字面量是编译时的常量。许多算术运算表达式也是编译时的常量,只要他们的操作数是编译时常量,计算结果是数字就行。比如:
- const a = 100;
- const b = 10;
- const c = a * b;
String字符串
Dart字符串是一系列UTF-16代码单元组成。你可以用单引号或者双引号括起来组成一个字符串。
- var s1 = 'use single quotes.';
- var s2 = "use double quotes.";
通过 ${expression} 这个方法可以把表达式的值放入一个string中,如果这个表达式是个标识符,你也可以省略这个{}
- var s = 'string interpolation';
- assert('Dart has $s, which is very handy.' ==
- 'Dart has string interpolation, ' +
- 'which is very handy.');
- assert('That deserves all caps. ' +
- '${s.toUpperCase()} is very handy!' ==
- 'That deserves all caps. ' +
- 'STRING INTERPOLATION is very handy!');
下面是连接字符串的方法:
- var s1 = 'String '
- 'concatenation'
- " works even over line breaks.";
- assert(s1 ==
- 'String concatenation works even over '
- 'line breaks.');
- var s2 = 'The + operator ' + 'works, as well.';
- assert(s2 == 'The + operator works, as well.');
如果你要写多行的字符串,你可以使用三个单引号或者三个双引号来标记:
- var s1 = '''
- You can create
- multi-line strings like this one.
- ''';
- var s2 = """This is also a
- multi-line string.""";
可以通过r方法,让你的字符串代码原样输出:
- var s = r'this is a test \n ,tell me';
Booleans布尔类型
Dart使用bool类型来表示布尔值。ture 和false是bool的两个对象,同时这两个也是编译时常量
在dart语言中,我们不能使用javascript中的判断语句,比如:
- var a = '';
- //在javascript中
- if(a){
- console.log('nice')
- }
- //但是在dart语言中,不能这样进行判断。而要使用下面的方法
- if(a.isEmpty)
- //检查是否为null
var b ;
assert(b == null)- //检查是否为NaN
var c = 0/0;
assert(c.isNaN)
Lists列表型
数组(array)几乎是所有编程语言中最常见的集合。但在Dart语言中,数组就是List对象。
dart中的list就像是javascript中的Array。通过下面的例子了解dart中的list
- var list = [1, 2, 3];
- assert(list.length == 3);
- assert(list[1] == 2);
- list[1] = 1;
- assert(list[1] == 1);
Lists也有length,list中数据的表示方法也和数组一样可以通过索引号码来访问特定的元素,比如List[1]。
Maps
通常来说,map是键值对类型的对象。key和value可以是任意类型的对象。但是不能出现相同的key,每个key只能出现一次,而相同的值可以多次出现。
- var gifts = {
- // Key: Value
- 'first': 'partridge',
- 'second': 'turtledoves',
- 'fifth': 'golden rings'
- };
- //新增一个key-value对
gifts['fourth'] = 'nice baby';
- var nobleGases = { 2: 'helium', 10: 'neon', 18: 'argon', };
如上,key值中有了first,就不能再出现key为first的一项,不然会报错。除了通过上面的字面量方法来创建map,也可以通过map构造器来创建对象
- var gifts = Map();
- gifts['first'] = 'partridge';
- gifts['second'] = 'turtledoves';
- gifts['fifth'] = 'golden rings';
- var nobleGases = Map();
- nobleGases[2] = 'helium';
- nobleGases[10] = 'neon';
- nobleGases[18] = 'argon';
如果你查找map对象里面不存在的key,则会返回一个null
- var gifts = {'first': 'partridge'};
- assert(gifts['fifth'] == null);
可以通过.length的方法获取map中的键值对数量:
- var gifts = {'first': 'partridge'};
- gifts['fourth'] = 'calling birds';
- assert(gifts.length == 2);
Functions函数集
- bool isNoble(int atomicNumber) {
- return _nobleGases[atomicNumber] != null;
- }
声明函数类型可以提升函数执行效率,如果省略这些类型,也是可以执行的:
- isNoble(atomicNumber) {
- return _nobleGases[atomicNumber] != null;
- }
如果只有一个表达式,你可以简写为:
- bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;
函数可选参数
当调用一个函数,你需要指明参数paramName: value,比如:
- enableFlags(bold: true, hidden: false);
当定义一个函数,你可以使用{param1,param2,....}来命名参数:
- void enableFlags({bool bold, bool hidden}) {...}
如果是一个必须传入的参数,则需要使用@required来指明参数:
- const Scrollbar({Key key, @required Widget child})
我们也可以在[]中放置一个可选的参数:
- String say(String from, String msg, [String device]) {
- var result = '$from says $msg';
- if (device != null) {
- result = '$result with a $device';
- }
- return result;
- }
在上面的[]中的参数,可传也可以不传。如果我们想给一个参数一个默认的值,就可以使用如下的方法:
- String say(String from, String msg,
- [String device = 'carrier pigeon', String mood]) {
- var result = '$from says $msg';
- if (device != null) {
- result = '$result with a $device';
- }
- if (mood != null) {
- result = '$result (in a $mood mood)';
- }
- return result;
- }
- assert(say('Bob', 'Howdy') ==
- 'Bob says Howdy with a carrier pigeon');
当调用say函数时,没有传入device参数和mood参数,但是device参数有一个默认值‘carrrer pigeon’,所以不传这个参数,则会默认把默认值放入到函数中运行。
main()函数
每个app都必须有main()函数,main()函数是作为app的入口函数。一个web app的入口函数如下:
- void main() {
- querySelector('#sample_text_id')
- ..text = 'Click me!'
- ..onClick.listen(reverseText);
- }
注:..
是一种级联操作符,它返回调用者本身,这样就可以连续调用同一个对象上的多个方法,实现链式操作!
函数可以作为另一个函数的参数运行,如
- void printElement(int element) {
- print(element);
- }
- var list = [1, 2, 3];
- // Pass printElement as a parameter.
- list.forEach(printElement);
类型检查操作符
as、 is、 is!
比如:
- if (emp is Person) {
- // Type check
- emp.firstName = 'Bob';
- }
分配符
- // Assign value to a
- a = value;
- // Assign value to b if b is null; otherwise, b stays the same
- b ??= value;
Dart语言特性必备了解!的更多相关文章
- Atitit.dart语言的特性 编译时js语言大总结
Atitit.dart语言的特性 编译时js语言大总结 1. 原型环境1 1.1. Dart可以编译js3 2. 第二个期待的理由是Dart的语言特性,没有什么特别特性好像,类似java c#一小时 ...
- C# 动态语言特性,dynamic 关键字研究
1 动态语言简介 支持动态特性的语言现在大行其道,并且有继续增长的趋势.比如 Ruby 和 Python, 还有天王级的巨星 --- JavaScript. 现在一个程序员说自己对 Jav ...
- 红黑树的删除详解与思路分析——不同于教科书上的算法(dart语言实现)
对于红黑树的删除,看了数据结构的书,也看了很多网上的讲解和实现,但都不满意.很多讲解都是囫囵吞枣,知其然,不知其所以然,讲的晦涩难懂. 红黑树是平衡二叉树的一种,其删除算法是比较复杂的,因为删除后还要 ...
- 简单易懂的Dart》 - Dart语言中文简明教程
转自:https://www.blackglory.me/straightforward-dart/ Dart是Google公司发布的网络编程语言,其诞生的目的是为了让广大C类OOP程序员们克服Jav ...
- Flutter学习笔记(2)--Dart语言简介
Dart简介: Dart诞生于2011年10月10日,Dart是一种"结构化的web编程"语言,Dart虽然是谷歌开发的计算机编程语言,但后来被ECMA认定位标准,这门语言用于We ...
- Fluter基础巩固之Dart语言详解<一>
在上一篇https://www.cnblogs.com/webor2006/p/11367345.html中咱们已经搭建好了Flutter的开发环境了,而Flutter的开发语言是选用的dart,那么 ...
- Dart 语言简述
Dart是一种“结构化的web编程”语言,Dart编程语言在所有现代浏览器和环境中提供高性能.Dart是谷歌开发的计算机编程语言,后来被ECMA认定为标准. Dart重要的概念: 1.所有的东西都是对 ...
- 写给.NET开发者的Python教程(一):C# vs Python: 语言特性、Conda和Jupyter Notebook环境
承接上篇,本文会从语言特性.开发环境和必备工具来带领大家进入Python的世界. 语言特性 首先一起看下C#和Python在语言特性层面的对比,他们作为截然不同的两类面向对象高级语言,在语言层面上有何 ...
- dart系列之:dart语言中的变量
目录 简介 dart中的变量 定义变量 变量的默认值 Late变量 常量 总结 简介 flutter是google在2015年dart开发者峰会上推出的一种开源的移动UI构建框架,使用flutter可 ...
随机推荐
- python的__mro__与__slot__
class A(object): def __init__(self): print ' -> Enter A' print ' <- Leave A' class B(A): def _ ...
- mysql 架构~多写模式MGR
一 简介:今天咱们来聊聊MGR的单主切换和新节点加入二 单主模式下变成多主: 1 3306 STOP group_replication; set global group_replicati ...
- d 属性: 赋予字段执行动作的能力
1.对只读属性误解 property AppSetting: ISuperobject read fAppSetting;当看到 AppInfo.AppSetting.D['lastLat'] := ...
- python - 迭代器(迭代协议/可迭代对象)
迭代器 # 迭代器协议 # 迭代协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就触发一个 StopIteration 异常,以终止迭代(只能往后走不能往前退) # 可迭代对 ...
- python的技巧和方法你了解多少?
学了这些你的python代码将会改善与你的技巧将会提高. 1. 路径操作 比起os模块的path方法,python3标准库的pathlib模块的Path处理起路径更加的容易. 获取当前文件路径 前提导 ...
- JS禁止鼠标右键、禁止全选、复制、粘贴的方法(所谓的防盗功能)
简述:一个防君子不防小人的鸡肋的功能,针对小白还行. 代码如下: <script> //都能支持 document.oncontextmenu = function (e) { retur ...
- 使用Jyhon脚本和PMI模块监控WAS性能数据
使用Jyhon脚本和PMI模块监控WAS性能数据的优点有: 1.可以使用非交互的方式远程获取数据 2.不需要图形化模块支持 3.对各种was版本的兼容性较高 4.使用方便,官方自带 缺点也有很多: 1 ...
- BOvW简介
原文地址:http://blog.csdn.net/ddreaming/article/details/52894379 BOW (bag of words) 模型简介 Bag of words模型最 ...
- [bzoj3123][洛谷P3302] [SDOI2013]森林(树上主席树+启发式合并)
传送门 突然发现好像没有那么难……https://blog.csdn.net/stone41123/article/details/78167288 首先有两个操作,一个查询,一个连接 查询的话,直接 ...
- js实现弹窗居中
在一些页面中,我们总会遇到一些弹窗不居中的时候,还要根据浏览器的大小来调整弹窗的弹出位置, 之前我也遇到这样的问题,现在我把我知道的呈现给大家 css样式 .windowBox{ width:500p ...