几个概念
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; //helloworld
var s4 = '${s1}sss'; // hellosss
var s5 = '$s1 $s2'; // hello world
assert('hello world' == s5);
// 多行
var s1 = '''
You can create
multi-line strings like this one.
''';
var s2 = """This is also a
multi-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); // true
print(para2 is String); //true
print(para3 is String); // false
print(para3 is int); //true
print(list4 is dynamic); // true
print(list4 is List<int>); // false
print(list4 is List<String>); // false
print(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
备注:中文文档更新不及时,最好参考英文文档
网友评论