/study_load.jpeg)
dart
语言学习之路:数据类型和函数
注释
1 | // 单行注释 |
数据类型
Number
类型
基本类型有两种:整型 int
和 浮点型double
:
整型的范围是 2^63-1
到 -2^63
,如需编译成 js ,那么整型的范围就是 2^53-1
到 -2^53
。
浮点型是 64 位的数字,包括小数位数,并符合IEEE754标准。一个数字只要有小数点,就是 double 类型。
1 | int num1 = 12; |
从
dart 2.1
开始,必要的时候两种类型可以自动转换。
如:double z = 1; 相当于 double z = 1.0
数字类型字面量是编译时常量。 在算术表达式中,只要参与计算的因子是编译时常量, 那么算术表达式的结果也是编译时常量。
1 | const ps = 1000; |
String
类型
字符串类型是使用 Unicode-16 存储,可以使用单引号或双引号定义。
字符串内部可以使用 ${expression}
来使用变量或表达式(当仅取变量值时,可以省略花括号),类似 js 模板字符串。
定义多行字符串需要使用三个引号。
在字符串里的一些转义字符不想被表达,需要在字符串前添加 r
表示是一个原始字符串。
1 | String str = 'Silen'; |
字符串连接可以使用 +
操作符,相邻的字符串在编译的时候会自动连接。如果多个字符串相邻,中间的字符串不能为空,否则报错。但是如果单引号和双引号相邻,即使是空值也不会报错,但相信没有人这么做
1 | String s1 = 'silen' + ' yang'; // silen yang |
Boolean
类型
1 | bool bo = false; |
List
类型(数组)
数组类型,可以指定数组元素的类型
1 | List arr1 = [1, 2, 3, 4]; |
Map
类型
1 | Map obj = (new) Map(); |
Set
类型
与 js 中的 Set
一致,值是唯一的
1 | var names = {}; // 空集合 |
Runes
类型
dart 中 使用 runes
来获取 UTF-32 字符集的字符,可以通过文字转换成符号表情或者代表特定的文字。
String 的 codeUnitAt
和 codeUnit
属性可以获取 UTF-16 字符集的字符
1 | var clapping = '\u{1f44f}'; |
Symbol
类型
1 | Symbol sy1 = (new) Symbol('name'); |
类型转换
所有非字符串类型都可以使用 toString()
转换为字符串。
数字(num)类型的字符串可以使用对应类型的 parse
姜字符串转换为相应的数字。
1 | String si = '12'; |
类型判断
在 dart 中,类型的判断使用 is
和 is!
来判断变量的类型。
- is 判断一个变量是不是某个类型的数据
- is! 判断变量不是某个类型的数据
1 | var s = '123'; |
若一个类型能够转换为另一个类型,可以使用 as
来直接进行类型转换。
1 | if(person is Person){ // 类型检测,转换之前用is判断一下 |
变量
变量的声明除了使用具体的类型,还可以使用 var
来声明。它会根据初始化的只判断什么类型,一旦确定不可更改。
所有的类型都为对象
。所以变量没有初始值时,默认为 null
。
1 | var str = '12'; |
如果变量类型是动态变化的,使用 dynamic
或 Object
来声明。
1 | dynamic a = "Silen"; |
常量
常量可以使用 final
和 const
来声明。都可以做类型推导,与 var
的使用一致,但不能混用。
被 final
和 const
修饰的变量,变量类型可以省略,建议指定数据类型。
1 | final num1 = 12; |
区别:
const
定义的是编译时常量,只能用常量来初始化final
定义的运行时常量,可以用变量来初始化- 可以通过
const
来创建常量的值,就是说const[]
本身是构造函数
var、final 等在左边定义变量的时候,并不关心右边是不是常量
但是如果右边用了 const,那么不管左边如何,右边都必须是常量
1 | const list = const[1,2,3]; // Ok |
常量如果是类级别的,请使用 static const
const
关键字不只是声明常数变量,您也可以使用它来创建常量值,以及声明创建常量值的构造函数,任何变量都可以有一个常量值。
1 | // const []创建一个空的、不可变的列表(EIL)。 |
函数
函数也是对象,当没有指定返回值的时候,函数默认返回 null
定义方法如下:
1 | String sayHello(String name) |
类型是可选,可以省略显式的类型,但仍然建议显式指定类型
1 | sayHello(name) |
assert()
断言函数
Debug 模式下,当表达式的值为 false
时抛出异常。第二个参数 message
,用于在抛出异常的时候,输出具体信息。
1 | String s = '12'; |
箭头函数
如果函数只是简单的返回一个表达式的值可以使用箭头函数
1 | sayHello(name) => 'hello $name'; |
匿名函数
1 | ([[Type] param1[, …]]) { |
可选参数与默认值
可选参数有两种,但两种不能同时使用。
- 命名可选参数使用大括号
{}
,默认值用冒号:
或=
- 位置可选参数使用方括号
[]
,默认值用等号=
命名参数
命名参数, 定义函数时,使用 {param1, param2, …}
,用于指定命名参数。在调用的时候需要指明参数名,没有赋值的参数值为 null
。例如:
1 | void fun({bool a, bool b}) { |
位置参数
位置参数,用 []
它们标记为可选的位置参数, 在调用的时候参数值会依次按顺序赋值,没有赋值的参数值为 null
。:
1 | void fun(String a, [String b, String c]) { |
主函数
这是 dart 程序执行的入口,返回 void
,并具有可选的 List<String>
作为参数。
1 | (void) main { |
作用域
作用域
是由代码的布局静态决定的。
闭包
闭包
是一个函数对象,它可以访问其词法作用域内的变量,就算该函数是在其原始作用域之外使用的。