美文网首页
dart学习(和js java比较)

dart学习(和js java比较)

作者: Demonskp | 来源:发表于2021-07-01 10:39 被阅读0次

    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<String>();
    halogens1.add('fluorine')
    
    // 形同:
    var halogens2 = <String>{};
    halogens2.add('ssss');
    
    

    Map:

    
    var nMap = {};
    // 形同:
    var nMap1 = new Map<dynamic,dynamic>();
    
    // 假如
    var mMap = { 1:'test' };
    // 形同:
    var mMap1 = Map<Number, String>();
    
    

    值得注意的是,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比较)

          本文链接:https://www.haomeiwen.com/subject/cukkultx.html