一、重要概念
- 一切变量都是对象,包括数字,函数和
null
- 对象是类的实例,所有类都继承与
Object
- 强类型但支持类型推断
- 如果不想制定具体类型可以使用
dynamic
- 支持泛型,比如
List<int>
或者List<Dynamic>
- 支持顶层函数、类方法、实例方法和嵌套函数
- 支持顶层变量、类变量、实例变量和局部变量。
二、变量的私有和公开
Dart 变量只有私有和公开两种类型
- 以
_
下划线开头变量为私有、只能在Library
中使用 - 标识符只能以字母或者下划线大头、后面跟任意多个字母、数字或者下划线字符
- 表达式在
运行时
可以求值,而语句不可以 - 代码问题分为
warning
和error
两种类型,warning
不会阻止程序的运行,但是error
会阻止程序运行 -
error
分为编译时错误
和运行时错误
两种,运行时错误会导致抛出异常
三、变量
- 变量类型可以自动推断,也可以显示指定
- 为初始变量值都为
null
包括数字 - 如果某个变量值在定义之后不会再改变,那就声明为
final
或者const
-
final
和const
变量只能赋值一次,但是const
变量在编译时候 -
final
和const
变量必须在定义时候就完成初始化, -
const
变量的值必须为编译时常量
,包括数字和字符串字面量
、其它常量
和算数运算结果
- 初始化
const
变量可以省去前面的const
应为const
肯定是常量
- 常量是防止内容变化、常量避免变量寻址、final变量用来提升代码安全性
void main() {
var name = 'Jagger Gao';
String nickname = 'tianhuao';
var n; // null 如果没有赋值
print(n);
final s = 'dart final'; // 运行时决定时候 如果需要 是在运行时候得到的值,可以使用 final
const c = 'dart const';
const r = 10;
const double area = 3.1e3344 * r * r; // 编译时候可以确定下来
var v1 = const []; // 常值 空变量
final v2 = const []; // 长治
const v3 = []; // 常量执行的值,只能是
v1 = [1, 2, 3]; // 对变量可以再次赋值
}
四、哈希表
- 哈希表是表示关联件和关联值,键和值可以是任意类型对象,但是键必须唯一
- 私用
[]
操作符来操作哈希表
- 使用哈希表字面量使用const 声明常量
五、符文
-
Rune
是由UTF32
码点(Code Point)
组成的字符串,一个Rune
字符对应一个Unicode
字符 - 码点 一般使用4 个十六进制字符串
\uxxxx
来表示,如果超过 4 个 则需要使用{} 将使用十六进制字符括起来 -
字符串
和Rune
直接可以互相转换
var clapping = '\u{1f44f}'; // 超过一个字符使用大括号 通过 \u + {} 表示 长度 为 2
print(clapping);
print(clapping.codeUnits);
print(clapping.runes.toList()); // 码点序列表示
六、布尔类型
- 只有两个值
true
和false
都是编译时常量 - 需要布尔类型,必须使用布尔值
七、列表 List
-
列表
就是其它语言中的数组
,用来表示对象序列 -
列表
的索引号从零
开始,到list.length-1
- 在列表字面量前使用const 来声明常量
- 使用 [] 操作符来操作列表的元素
例子
void main() {
var x = 1; // 自动推断为常数
var hex = 0xDEADBEEF;
print(hex);
var y = 1.1; // 数字字面量
var exponents = 1.42e5; // 科学计数法
print('输出当前exponenets ${ exponents }'); //
double z = 1; // 明确变量类型
var one = int.parse('1'); // 字符串类型转换得到相应整型
assert(one == 1);
var onePointPine = double.parse('1.1'); //
assert(onePointPine == 1.1); // 断言失败会抛出异常
String piAsString = 3.1415926.toStringAsFixed(2); // 转换成字符串并保留小数点后面指定位数
print('piAsString ${ piAsString }'); //
assert(piAsString == '3.14'); // 断言失败会抛出异常
// 左移运算
assert((3 << 1) == 6);
var leftGo = 3 << 1;
print('leftGo ${ leftGo }'); //
// 右移运算
assert((3 >> 1) == 1);
var rightGo = 3 >> 1;
print('rightGo ${ rightGo }'); //
}
-
两个字符串插值表达
// 字符串的插值 var insetStr = 'INSERT VALUE'; var completeInsert = 'my inset String $insetStr with Result'; print('completeInsert ${ completeInsert }'); //
-
字符串拼接操作
// 使用 + 号 拼接字符串 var firstStr = 'INSERT VALUE'; var sendStr = 'my inset String with Result'; var reusltComplete = firstStr + sendStr; print('reusltComplete ${ reusltComplete }'); //
-
换行的方式
使用 ’‘’ 或者 “”“ 三单引号 和 三双引号
// 使用 ’‘’ 或者 “”“ 三单引号 和 三双引号 var s1 = ''' you can create muti-line sting. '''; print('s1 ${ s1 }'); // /// 进行相应的换行操作 var s2 = 'you can use \n line feed'; print('s2进行换行操作 ${ s2 }'); // /// 如果前面有 r 字符标识不做转义 var s3 = r'you can use \n line feed'; print('s3进行换行操作 ${ s3 }'); // 保持原样输出
0/0
问题不会抛出异常(需要注意)
iMeantToDoThis.isNaN 进行判断
// -------
var unicorn;
assert(unicorn == null); // 进行断言
// 不会抛出异常
var iMeantToDoThis = 0/0;
assert(iMeantToDoThis.isNaN); // 进行断言
网友评论