dart学习(和js java比较)

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、构造参数后 会有一个初始化列表的位置来初始化

你可能感兴趣的:(dart学习(和js java比较))