Dart 前世今生以及特性

一、Dart语言的前世今生

Dart语言就是为了解决JS存在的缺陷,可Node.js出现让JS可以在移动端跑起来,React,RN,vue等,Dart语言沉寂了一段时间,专注于大前端和跨平台生态语言。

出生名门待遇自然不会差:在 Google 内部孵化了移动开发框架 Flutter,弯道超车进入了移动开发的领域;而在 Google 未来的操作系统 Fuchsia 中,Dart 更是被指定为官方的开发语言。

二、Dart语言的特性

JIT(Just in Time)运行时即时编译,在开发周期使用,可以动态下发执行代码,效率高;AOT(Ahead of Time)提前编译,可以生成二进制代码,运行速度快,但是每次执行前都需要提前编译,效率低。

如何区分一门语言究竟是 AOT 还是 JIT 呢?通常来说,看代码在执行前是否需要编译即可。如果需要编译,通常属于 AOT;如果不需要,则属于 JIT。

内存分配和垃圾回收

Dart VM的内存分配就是在堆上累叠,内存增长是线性的。在Dart中并发是通过Isolate实现,它可以看作线程,但是不共享内存,独立运行,这样做的的作用就是让Dart实现无锁的快速分配。

垃圾回收,采用多生代算法。采用“半空间”机制,将那些活跃的对象拷贝到备用空间,然后整体释放当前空间所有内存,这样很适合flutter中大量widget销毁重建场景。

单线程模式:类似于OC C++ JAVA大多数以抢占式的方式切换线程,会利用到锁,说到锁这涉及到与内核的上下文切换,很耗性能。

一个函数从执行到结束没有其他Dart代码打断,所以在Dart中没有线程之后Isolate(隔断区),隔断区之间不会共享内存。

 

三、基础语法与类型变量:Dart语言如何表示信息?

var 来声明一个变量,表示类型是交由编译器推断决定,默认情况下未初始化的变量的值都是null。

const 表示变量在编译期间即能确定的值;final用来定义运行时确定的值,而一旦确定后就不可再变。被final或者const 修饰的变量,变量类型可以省略。

Object和dynamic,Object是所有对象的根基类,任何类型的数据都可以复制给Object声明的对象,类似OC的id,dynamic和var声明的变量可以赋值任意对象,而dynamic,什么的变量可以在后期改变赋值类型。dynamic声明的对象编译器会提供所有可能的组合,而Object声明的对象只能使用Object的属性和方法,否则编译器会报错。

dynamic a;
 Object b;
 main() {
     a = "";
     b = "";
     printLengths();
 }   

 printLengths() {
     // no warning
     print(a.length);
     // warning:
     // The getter 'length' is not defined for the class 'Object'
     print(b.length);
 }

四、函数

函数是一段用来独立完成某个功能的代码,在Dart中所有类型都是对象类型,函数也是对象,Function,这就意味着函数可以 被定义为变量,甚至可以被定义为参数传递给另一个函数。不能用重载,但是提供了可选命名参数和可选参数。在声明函数时加{}表示指定调用参数,给参数加[]表示这些参数可以忽略

“_”可作为private方法,不加则为public。“_”限制范围并不是类访问级别,而是库访问级别。

五、复用

继承父类:子类由父类派生,会自动获取父类成员变量和方法实现,子类可以根据需求覆写构造函数和父类方法;

接口实现:子类获取的仅仅是接口的成员变量符号和方法符号,需要重新实现成员变量以及方法声明和初始化,负责编译器会报错。(类似于OC中协议)

混入(MiXin):具有实现方法的接口,这样可以解决Dart缺少对多重继承支持问题,还能避免由于多重继承可能导致的歧义。关键字with

1.一般来讲,单继承,多实现,混入是多继承
A.继承是子类需要复用父类的方法实现
B.实现接口是复用接口的参数,返回值,和方法名,但不复用方法的实现,在Dart中实现抽象类 更像在java中实现用interface修饰的接口
C.混入是多继承,当被混入的类有多个同名方法时,调用子类的该方法时,会调用with声明的最后一个拥有该方法的类中的该方法,同时混入中的父类不能继承

六、运算符

?.运算符: p?.printInfo()代表如果某个p为空那就跳过,避免产生异常

??= 运算符:a??=value如果 a 为 null,则给 a 赋值 value,否则跳过。

?? 运算符:a??b 如果 a 不为 null,返回 a 的值,否则返回 b。

七、异步支持

关键字Future 将来执行的方法

static Future login(String phone, String code) async {
    var response = await http.get('api_url', queryParameters: {
      'phone': phone,
      'code': code,
    });
    User user = User.fromJsonMap(response.data);
    user.phone = phone;
    return user;
  }

async:用来表示函数是异步的

await:来表示等待异步执行完成才会走下一步

async/await都只是一个语法糖,编译器或者解释器最终都会将其转化为一个Promise(Future)的调用链

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值