Day 3 | Dart 基本介绍 - Dart vs JS

Dart是什麽?

Dart 是一个静态强型别的语言,同时支援物件导向程序设计(OOP)及函数式程序设计(FP)的特性,

而 Dart 正是「Flutter」所使用的语言,原本是 google 为取代 JavaScript 而设计的语言,所以在语法上借监许多 JS 的特点,同时刚好补足一些我认为的缺点。

这里先来大概列举JS的差异,而与其他语言一样的基本语法就会直接省略(条件判断及回圈相关等)。

相似的地方:

  1. first-class function
  2. 非同步程序设计的相关概念
  3. 基本语法、运算子大部分类似

相异的地方:

  1. JS是 prototype-base 而 Dart 则是 class-base
  2. Dart 是强型别且支援型别推断
  3. Dart 拥有健全的null safety功能
  4. 执行环境

根据以上几点我认为 「 Dart 是具有Type保障且是class-base的JS」 *,基本上只要是熟悉JS的开发者转而学习Dart的学习曲线是相当友善的。在网路上其他文章也有看过「Dart是融合JavaScript与Java优点的语言」,但因为我没使用过Java所以对这个观点就不多做评论了。如果有使用过Java的读者可以在底下留言与大家分享一下你的观点。

特别说明一下差异里的後三点,型别这个问题,有写过JS的读者应该都有遇过 「xxx is not defined」 这种runtime error,但如果有型别系统,在开发期间的编辑器静态检查就能很大的一部份避免这些问题了。

当然如果跟TypeScrpit相比一样也能达成上面的需求且对於开发体验的提升也很大,但使用TS有时会遇到第三方package的generic type很难标,甚至最後标成 any。但因为Dart本身就有型别系统所以基本上第三方的pub还是有型别保障的。

那 null safety指的是什麽?最大的好处就是我们可以在开发时很有把握的知道这个变数是不是null的而不必其他额外的null判断,至於是怎麽做到的後面的篇章会介绍到。

(题外话:因为null safety所以现在Dart/Flutter在使用第三方的pub时也是有很多的坑)

至於执行环境,JS在node出现之前大部分就是直接跑在浏览器上

而Dart本身可以分成两类平台

  1. Dart Native
  2. Dart web

Dart Native:简单来说就是同时利用Dart 两种编译模式JIT(即时编译)及AOT(预先编译),开发时是使用JIT编译模式跑在Dart VM上(可以想像成跟node.js一样)然後到production时则是采用AOT的形式。
这样就能让我们是开发时享受到hot reload的之类的好处,而到了production环境时AOT编译器就会产生出该环境要用machine code,让程序的启动时间减少。

Dart web:基本上就是将Dart转成JS,开发环境会使用dartdevc,production则是用dart2js。而flutter web也是利用已经成熟的dart2js才得以实现的。

今天的内容就大概到这里,明天我们将会正式进入Dart的语法介绍了。


附注* :prototype-base或者class-base哪个比较好也许是没有绝对的答案,根据周遭的意见大多数的人还是比较喜欢class-base的写法。虽然js後来有 class 这个语法糖但终究不像是操作class、instance那样的感觉。

参考资料

  1. https://dart.dev/overview#platform

<<:  【Day1】前言X动机X首款宠物约散Android平台APP

>>:  Day 15:「你真的不减肥吗...?」- Tailwind 的生产环境优化

(Day 20) Object.create 建立多层继承

上回介绍了如何使用建构式来建立原型,接着今天介绍使用 Object.create() 建立多层原型,...

[Android Studio 30天自我挑战] TableLayout元件对齐方式

TableLayout为表格布局,顾名思义就是利用表格方式来布局 TableLayout里面是透过T...

# JS杂食-06--小实作之1

用HTML+纯JS试作一表单,规格: 两个输入框 一个提交按钮 点击按钮时显示:输入的两个数字总和 ...

Day 11 Compose Click Event

今年的疫情蛮严重的,希望大家都过得安好,希望疫情快点过去,能回到一些线下技术聚会的时光~ 今天目标:...

[分享] verilog设计经验总结

先记下来: 1、不使用初始化语句; 2、不使用延时语句; 3、不使用循环次数不确定的语句,如:for...