dart学习(和js比较):
参考文献:https://www.w3cschool.cn/nxvsy/nxvsy-58fq35q6.html
在线dart环境: https://dartpad.cn/
声明变脸:
多了一个 final 和const几乎一样。只是 const 要求不能不给初值,而final是可以不给初值的,没给初值的final可以进行赋值,赋值了之后就无法再改变。
没有let,var 替代了let。 但是一旦给变量赋值后 它的类型就是确定的了,不能再改变。
var ce = 1;
ce = 'ssss';
// ↑ 这里报错: A value of type 'String' can't be assigned to a variable of type 'int'.
多了 一种 dynamic 动态的,如果是dynamic的就能 赋值成一种类型后 再改变。
dynamic ce = 1;
ce = 'ssss';
// 没毛病
类型
1、多了一种 Rune类型(表示Unicode字符)
2、Map Set多了几种表示的方式。
Set:
var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
// 形同:
var halogens1 = Set();
halogens1.add('fluorine')
// 形同:
var halogens2 = {};
halogens2.add('ssss');
Map:
var nMap = {};
// 形同:
var nMap1 = new Map();
// 假如
var mMap = { 1:'test' };
// 形同:
var mMap1 = Map();
值得注意的是,dart中没有js里隐式的类型转换,所以只有bool类型能作为是否判断
函数:
1、命名参数:声明函数的时候给参数加上大括号(类似于react组件参数的写法)。在调用该函数时,可以用 参数名称:变量 的方式去指定参数。
(这样就避免了要记第几个参数是啥,只要记得名字就好,更方便阅读。当然这样是不是也就意味着没有像js函数参数上的解构呢?)
如果函数使用了命名参数,调用时必须加上参数名称。
String add({String ce, String le} ){
return ce + le;
}
void main() {
// 输出: bs
print(add(le:'s',ce:'b'));
}
2、可选参数: 如果把参数用[]中括号括起来 就能设为可选的参数。
没法和命名参数合用
3、参数默认值和js一样用 = 设置
4、函数不再用 function 声明,而是用返回值类型 来替代function的位置(和java一样)
5、匿名函数:和js一样可以用箭头函数,同时甚至更进一步——箭头都省略。
var list = ['apples', 'bananas', 'oranges'];
list.forEach((item) {
print('${list.indexOf(item)}: $item');
});
list.forEach((item) => print('${list.indexOf(item)}: $item'));
6、函数内是可以再声明函数的,这点和js相同和java不同。
7、有闭包的概念。
/// 返回一个函数,返回的函数参数与 [addBy] 相加。
Function makeAdder(num addBy) {
return (num i) => addBy + i;
}
void main() {
// 创建一个加 2 的函数。
var add2 = makeAdder(2);
// 创建一个加 4 的函数。
var add4 = makeAdder(4);
assert(add2(3) == 5);
assert(add4(3) == 7);
}
8、函数返回值,js默认返回undefined,而dart默认返回null。
运算符
1、 ~/ 除以并取整。
print(10 ~/ 2 ); // 5
print(11 ~/ 2 ); // 5
print(12 ~/ 2 ); // 6
2、只有== 没有===
3、as is is!
用于类型判断 is is! 类似于js typeof。(只是类似)
而 as 则类似于一个语法糖:如果 is 则做什么:
if (emp is Person) {
// Type check
emp.firstName = 'Bob';
}
// 形同:
(emp as Person).firstName = 'Bob';
4、-= += /= %= js中也有或者即将出现在ES标准中的运算
5、三元运算符 ? : 和js中一样。
6、?? 用于表示 如果前面的为null 则给出后面的
String playerName(String name) => name ?? 'Guest';
// 形同
String playerName(String name) => name != null ? name : 'Guest';
// 形同
String playerName(String name) {
if (name != null) {
return name;
} else {
return 'Guest';
}
}
7、级联运算符 (..) 表示往上追溯到第一级 语句返回的对象。
querySelector('#confirm') // 获取对象。
..text = 'Confirm' // 调用成员变量。
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
// 形同
var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
8、?. 和js一样
控制语句
1、assert方法: 只在测试环境有效的断言,如果第一个参数为false,那么会打印第二个参数(String),并终止程序,如果第一个参数为true,啥都不发生。
异常
1、catch语句前可以用on XXX catch(e){} 来捕获特定类型的错误。
try {
breedMoreLlamas();
} on OutOfLlamasException {
// 一个特殊的异常
buyMoreLlamas();
} on Exception catch (e) {
// 其他任何异常
print('Unknown exception: $e');
} catch (e) {
// 没有指定的类型,处理所有异常
print('Something really unknown: $e');
}
类
1、new 关键词变成可选
2、注意空安全问题。 存在late关键字 表示延迟初始化。
3、对象的runtimeType 可以在运行时获取对象的类型
4、同样存在super关键字,但是使用上有所不同
5、私有属性用下划线表示,只能在同一文件(库)中访问 -- 和java prorect保护类型 类似但又不完全类似
6、构造参数后 会有一个初始化列表的位置来初始化