-
所有变量的值都是对象,也就是类的实例。甚至数字、函数和null也都是对象,都继承自Object类。
-
虽然Dart是强类型语言,但是显式变量类型声明是可选的,Dart支持类型推断。如果不想使用类型推断,可以用dynamic类型。
-
Dart支持泛型,List<int>表示包含int类型的列表,List<dynamic>则表示包含任意类型的列表。
-
Dart支持顶层(top-level)函数和类成员函数,也支持嵌套函数和本地函数。
-
Dart支持顶层变量和类成员变量。
-
Dart没有public、protected和private这些关键字,使用下划线“_”开头的变量或者函数,表示只在库内可见。
-
健全的类型系统,同时支持静态类型检查和运行时类型检查。
-
代码体积优化(Tree Shaking),编译时只保留运行时需要调用的代码(不允许反射这样的隐式引用),所以庞大的Widgets库不会造成发布体积过大。
-
丰富的底层库,Dart自身提供了非常多的库。
-
多生代无锁垃圾回收器,专门为UI框架中常见的大量Widgets对象创建和销毁优化。
-
跨平台,iOS和Android共用一套代码。
-
JIT & AOT运行模式,支持开发时的快速迭代和正式发布后最大程度发挥硬件性能。
-
Dart中类似线程的概念叫做Isolate,每个Isolate之间是无法共享内存的,所以这种分配策略可以让Dart实现无锁的快速分配
-
Dart是单线程执行模型。但是它支持 Isolate(一种让 Dart 代码运行在其他线程的方式)、事件循环和异步编程。除非你自己创建一个 Isolate ,否则你的 Dart 代码永远运行在 UI 线程,并由 event loop 驱动。Flutter 的 event loop 和 iOS 中的 main loop 相似——Looper 是附加在主线程上的。Dart 的单线程模型并不意味着你写的代码一定是阻塞操作,从而卡住 UI。相反,使用 Dart 语言提供的异步工具,例如 async / await ,来实现异步操作。
Dart的垃圾回收也采用了多生代算法,新生代在回收内存时采用了“半空间”算法,触发垃圾回收时Dart会将当前半空间中的“活跃”对象拷贝到备用空间,然后整体释放当前空间的所有内存:
image.png整个过程中Dart只需要操作少量的“活跃”对象,大量的没有引用的“死亡”对象则被忽略,这种算法也非常适合Flutter框架中大量Widget重建的场景。
Reference
网友评论