← Career advice
Advice Columnist

Dart vs JavaScript vs TypeScript

隨著Flutter受到開發者的重視,Google於2011年推出的Dart又重新進入大家關注的視野之內,不過除了Flutter以外,其實Google的開發者早在2016年也推出過Angular Dart,讓開發者以Dart開發網站應用,不過由於Angular Dart對比TypeScript版Angular文本長期不足,因此沒有引起太多關注。Google推出Flutter,可以說為大家對Dart的信心注入了一劑强心針,大家又重新開始關注這個已有8年歷史的程式語言。

本文想介紹的是,就是到底Dart有何特色?與JavaScript比較,又有何優劣?由於TypeScript開始於前端日漸盛行,我們亦可以趁機比較一下三種語言的異同。

應用範圍(Application)

有讀過上一篇Web Technology為何征服世界的朋友,應該已經知道JavaScript跟TypeScript已經可以在網頁、伺服器、智能電話、IOT、人工智能等範疇落地生根,Dart呢?托Flutter的發展,Dart已相當適合同時於網頁、伺服器、智能電話等範圍作開發,這一點與JavaScript已不相上下。不過Dart與JavaScript的最大分別,在於Dart本身可以有三種方法運行:分別是編譯為JavaScript(Compiled To JavaScript)、由Dart VM獨立運行(Standalone By Dart VM)、AOT編譯為機械碼(Ahead-of-time compiled to machine code). 而JavaScript現時最流行的做法,都是以Node運行JavaScript。Node運行JavaScript時,會將JavaScript轉變為機械碼(Machine Code),再運行機械碼。亦是因此Node JS的運行速度比其他動態語言如Python、Ruby等都較快。而Flutter所採用的,就是第三種方法,先編譯為機械碼(AOT Compilation)再在智能電話運行,因此大家可能聽過Flutter無需JS Bridge的原因,亦是由於早已編譯為機械碼,所以無需一個額外的JS Bridge再作轉譯。

 

React Native寫成的手機程式結構如下:

Flutter寫成的手機程式結講則如下:

基本運行

理解了Dart、JavaScript、TypeScript各自的應用範圍,就以三種語言都寫一個簡單的hello world為例:

JavaScript 和 TypeScript的例子都是:

.
console.log("Hello World");
.

Dart的例子:

.
print("Hello World");
.

要在command line運行,就分別如下面三行:

.
node index.js
ts-node index.ts
dart main.dart
.

以上index.js、index.ts、main.dart都是進入點(entry point)。 具體分別不大,都是以語言的命令(node,ts-node,dart)直接運行檔案,無須額外編譯,因為Dart受JavaScript 影響很大,想必也從JavaScript汲取了這一點。 順帶一提,JS及TS都支援REPL(Read-Eval-Print-Loop),但Dart無官方REPL,無法像JS及TS一樣於REPL裏面直接嘗試代碼。

 

基本語法

基本語法上,由於Dart受JavaScript影響很大,因此語法上很類似,但與TypeScript比較之下,卻看見了兩者取態的不同。TypeScript受Scala的語法影響,將類別(Type)置於變數及參數之後;相反,Dart則沿用傳統Java及C#的前置類別語法。

由變數及函數一看,就可見不同之處。

 

變數(Variable)

JavaScript例子:

.
var num = 123;
let hello = "Hello Dart!";
const obj = { key1: 1234, key2: 5678};
.

TypeScript例子(例子中類別皆可省略):

.
var num:number = 123;
let hello:string = "Hello Dart!";
const obj:obj = { key1: 1234, key2: 5678};
.

Dart例子:

.
var num = 42;
dynamic hello = "Hello Dart!";
final obj = {"key1":1234,"key":5678};
hello = 1234;
String myName = "Tecky";
const PI = 3.141592654;
var x;// == null
.

JavaScript的例子與TypeScript除了額外的類別,幾乎一模一樣,反之Dart則非常不同,Dart有幾種不同的方法定義變數:

  1. var: 定義一個新的變數,類別由數值所推論,所以如果將num重新賦值為String會出現Error,但賦值為同一類別則無問題。
  2. dynamic: 定義一個新的變數,類別不定,重新賦值任何類別都無問題。
  3. final: 定義一個新的常數,不可重新賦值。
  4. 直接前置類別如String: 定義一個新的變數,類別由前置類別決定,如果將重新賦值為其他類別會出現Error,但賦值為同一類別則無問題
  5. const: 與final類似,編譯常數,不可重新賦值。

可見Dart為了增强JavaScript類別上的欠缺,特意下了不少功夫,也解決了var及let之分,可是相較起來,似乎TypeScript的後置類別更為簡潔。

 

運算符號(Operators)

運算符號上,Dart跟JavaScript及TypeScript都很類似,其中一個最大的分別,在於Dart不支援===,而且在if statement中,必須使用boolean,不可以如JS及TS一樣使用其他數值作boolean使用。

JavaScript 及TypeScript例子:

.
let num = null;
if(!num){
    console.log(`null is false`);
}
let zero = 0;
if(!zero){
    console.log(`zero is false`);
}
.

以上用法在Dart是錯誤。只能使用Boolean作真假判斷 Dart例子:

.
var num = null;
if(num == null){
    print(`null is not false`);
}
var zero = 0;
if(zero == 0){
    print(`zero is not false`);
}

 

函數(Function)

函數方面,Dart不使用關鍵字function,語法較簡潔。

JavaScript例子:

.
function sum(a,b){
    return a + b;
}
.

TypeScript例子(例子中回傳值的類別可省略):

.
function sum(a:number,b:number):number{
    return a + b;
}
.

Dart例子:

.
sum(int a, int b){
  return a+b;
}
.

Dart的例子中,如果不寫int的類別,那兩個參數都會是dynamic 類別,也就是任何類別都可以成為參數。

sum(a,b){
return a+b;
}
// equals to 

sum(dynamic a,dynamic b){
return a+b;
}
.

而如果你寫了

.
sum("1",1);
.

就會出現一個Runtime Exception,也就是與JavaScript類似,失去了類別的保護作用。 似乎dynamic就是dart的any吧。

而且dart還有一個特點,就是每個作為進入點的檔案都必須有一個名為main的函數作為進入點,這一點明顯繼承了C的傳統

.
main(){
    sum(2,2);
}

sum(int a, int b){
    return a+b;
}
.

 

進階語法

除了以上基本函數、運算符號、變數的語法之外,Dart作為一種多用途語言,亦同時有類別(Class)的語法及專為非同步編程(Async Programming)而設的語法。

 

類別(Class)

類別是物件導向編程一個重要部份,Dart由JavaScript發展出來,因此類別語法亦與JavaScript非常類似,卻又與TypeScript有些相似。

以下是Dart的類別語法:

.
import 'dart:math';

class Point{
    num x;
    num y;
    num z= 0;

    Point(num x, num y){
        this.x = x;
        this.y = y;
    }

    num distanceTo(Point other) {
        var dx = x - other.x;
        var dy = y - other.y;
        return sqrt(dx * dx + dy * dy);
    }
}

void main(){
    var p1 = Point(2,2);
    var p2 = new Point(4,5);
    p1.distanceTo(p2);
}
.

與JavaScript相當類似,不同在於method 上定義的分別及初始化(initialization)物件不一定需要new keyword.

 

以下是TypeScript同樣的類別語法:

.
class Point{

    private x: number;
    private y: number;
    private z: number = 0;

    constructor(x:number,y:number){
        this.x = x;
        this.y = y;
    }

    distanceTo(Point other){
        let dx = x - other.x;
        let dy = y - other.y;
        return sqrt(dx * dx + dy * dy);
    }
}

const p1 = new Point(2,2);
const p2 = new Point(4,5);
p1.distanceTo(p2);
.

要留意的是,Dart亦不支援Access Modifier,例如上面TypeScript所用的private在Dart裏面不會用到。因此Dart不能像TypeScript一樣,定義private field.

 

非同步編程(Asynchronous Programming)

作為前端開發的程式語言,非同步編程是必不可少的一部份,汲取了JavaScript的教訓,Dart本身就支援了async。

Dart的async與JavaScript幾乎一模一樣,分別只是先後次序寫法,以及必須寫下傳回值的類別,也就是Future。 Future的概念與JavaScript Promise無任何分別,只是名字上的分別。Java的非同步編程類別,也是稱為Future。

.
Future main() async{
    await someAsyncOperation();
}
.

 

以下就是JavaScript的版本

.
async function main(){
    await someAsyncOperation()
}
.

 

總結

本文總結了一些Dart與JavaScript及TypeScript的異同,亦因篇幅所限,未能詳盡解釋其他Dart特別用法例如Mixins、Callable Classes等。筆者認為Dart明顯是希望改善JavaScript弱類別的缺點而設計,然而Dart卻因為多年的停滯錯過了前端近年的飛速發展,反而被後上的TypeScript超越。程式語言的受歡迎程度,往往可以受一兩個應用範圍所左右:Objective-C一直寂寂無名,因為iOS的發展變得廣受歡迎;Rust是Firefox自家製程式語言,也因為Firefox新引擎Servo而變得聲名大噪,未知Flutter能否為Dart迎來發展之第二春呢?這就要大家拭目以待了。

文章來源:Tecky Academy – Gordon Lau

呢篇文章係由Tecky Academy提供。如果你中意呢篇文章,您可以喺呢到睇更多佢哋嘅文章。

 

不要讓在亞洲的頂尖科技公司之中工作停留在夢想的階段。在GetLinks創立自己的履歷,並在完成履歷時選擇「我想跨國工作」一欄,今日就向你的夢想踏出第一步吧!

 

GetLinks Recruitment

GetLinks Recruitment

GetLinks Recruitment 是一家全方位的人材招募公司。 自2015年以來,我們已經為亞洲超過20,000位人才找到了完美的匹配, 我們的 使命是為求職者和僱主提供一個高效 的 連接平台。 GetLinks Recruitment 迅速成為不少 公司值得信賴的合作夥伴,在全球多個地點設有辦事處,提供一個真正全球化的專業人士和企業網路。

Keep reading

Related career advice

【IT事務所】匯豐選擇新加坡作全球AI開發中心——香港真正需要守護的,不只是金融中心地位,而是未來的創新話語權
Advice Columnist

【IT事務所】匯豐選擇新加坡作全球AI開發中心——香港真正需要守護的,不只是金融中心地位,而是未來的創新話語權

當匯豐銀行(HSBC)宣布在新加坡設立全球人工智能卓越中心(Global AI Centre of Excellence)時,香港社會隨即引起廣泛討論。有人認為這只是跨國企業的正常業務部署,也有人擔心,這是否反映香港在全球創科競爭中的吸引力正在下降。畢竟,匯豐於1865年在香港創立,其發展歷程幾乎與香港由區域港口蛻變為國際金融中心同步,即使今天集團總部設於倫敦,香港仍然是匯豐最重要的盈利市場之一。因此,當集團把肩負未來發展重任的全球AI研發中心設於新加坡,而非香港,難免令人思考,這個決定背後究竟釋放了甚麼訊號。 然而,若將焦點停留在「匯豐沒有選擇香港」,或將事件簡單解讀為香港與新加坡之間的一場勝負,恐怕會錯失真正值得反思的課題。匯豐並非撤離香港,也沒有削弱香港作為其核心市場的地位;相反,這項部署反映的是跨國企業在人工智能時代重新分配全球資源的新策略。今天,企業已不再按照歷史淵源或市場規模決定創新中心的位置,而是根據人才、生態系統、科研能力、算力基建,以及人工智能治理環境等因素作出長遠部署。 事實上,每一個經濟時代都有不同的競爭法則。工業時代,比拼的是港口、物流和土地;金融全球化年代,則取決於法律制度、資本市場及金融基建;但踏入人工智能時代,競爭焦點已轉移至誰能提供最優秀的人才、最成熟的創新生態、最快的科研成果轉化,以及最值得信賴的AI治理制度。換言之,今天跨國企業尋找的不再只是金融中心,而是一個能夠持續孕育創新的城市。 正因如此,新加坡近年的發展值得香港深思。多年來,新加坡政府持續推動國家人工智能策略,積極投資科研、數據中心、高效能運算及人才培育,同時吸引Google、Microsoft、Amazon Web Services、NVIDIA等國際科技企業設立區域研發中心,逐步建立完整的AI創新生態。當頂尖企業願意落戶,世界各地的人才自然隨之而來;而人才聚集,又進一步吸引更多企業投資,形成良性循環。對跨國企業而言,這種完整的創新生態,往往比單一稅務優惠或資助政策更具吸引力。 另一方面,杜拜近年的崛起同樣值得留意。阿聯酋早於2017年設立全球首位人工智能部長,其後推出《UAE AI Strategy 2031》,並透過杜拜國際金融中心(DIFC)建立AI Campus,積極吸引全球AI企業及創投基金落戶,目標是在金融科技、智慧城市及人工智能應用方面建立國際影響力。由此可見,無論是新加坡還是杜拜,都不是單純發展人工智能技術,而是將AI視為未來經濟轉型及提升國際競爭力的重要戰略。 相比之下,香港近年亦積極推動創科發展,包括建設人工智能超算中心、推動「InnoHK」科研平台,以及配合北部都會區發展創新科技產業。這些措施方向正確,亦展現政府推動AI發展的決心。然而,香港仍需面對幾項結構性的挑戰,包括高端AI人才供應仍然不足、科研成果商品化速度有待提升、國際科技企業研發中心數目有限,以及本地創投市場近年較為審慎。這些因素都可能影響跨國企業部署高增值AI項目的意願。 不過,香港真正需要思考的,並不是如何複製新加坡或追趕杜拜,而是如何發揮自身獨特優勢。香港擁有世界級金融市場、普通法制度、成熟的金融監管體系,以及全球最大的離岸人民幣市場,同時肩負「背靠祖國、聯通世界」的重要角色。與其競逐成為AI工程師最多的城市,香港更應致力發展成全球領先的AI金融創新中心,把人工智能深度應用於銀行、保險、資產管理、跨境支付、監管科技、綠色金融等高增值領域,建立其他城市難以取代的競爭優勢。 除此之外,香港更需要重新思考自己在全球AI治理中的角色。未來國際競爭,不只是誰擁有最先進的大型語言模型,更重要的是誰能建立值得世界信任的制度與標準。歐盟推出《AI Act》,美國持續完善AI安全政策,新加坡亦發展AI Verify等治理框架,均說明人工智能競爭正逐步由技術層面延伸至制度層面。如果香港只著眼於AI應用,而未能積極參與規則制定,未來便可能只能跟隨其他司法管轄區的標準。相反,若能結合普通法制度、金融監管經驗及國際化優勢,在金融AI治理、跨境數據流動、AI風險管理及數碼信任等領域建立具有國際認受性的制度,香港便有機會由AI應用者逐步發展成AI規則塑造者(Rule Shaper),進一步提升國際影響力。 當然,要實現這個願景,政策配套仍然不可或缺。香港除了持續培育跨學科AI人才,亦需要加快科研成果商品化,完善高效能算力及數據基建,建立更具國際公信力的AI治理制度,同時大力協助中小企數碼轉型。畢竟,香港九成以上企業屬於中小企,若人工智能只能惠及少數大型企業,整體經濟競爭力便難以真正提升。唯有讓AI成為所有企業提升效率、創新及拓展市場的共同工具,香港才能建立真正具韌性的AI經濟。 回顧香港過去數十年的成功,每一次重大轉型,都不是依靠既有優勢,而是敢於把握全球經濟變革所帶來的新機遇。今天,人工智能正重新塑造金融、商業、教育及公共服務,也重新定義城市之間的競爭。匯豐選擇新加坡設立全球AI卓越中心,只是一個值得深思的案例;真正值得香港關注的是,未來十年,還會有多少跨國企業在部署下一代技術時,作出類似的選擇。 因此,香港真正需要守護的,不只是國際金融中心的地位,更是未來的創新能力與國際話語權。歷史固然賦予香港獨特優勢,但未來能否繼續保持領先,將取決於今天是否願意持續投資人才、科研、生態系統及制度建設。 匯豐的根在香港,但企業的未來永遠向着最具創新力的地方生長。 歷史可以成就一座城市,但唯有創新才能延續一座城市的競爭力。真正決定香港未來的,不是我們曾經擁有甚麼,而是今天願意投資甚麼;不是我們曾經創造過多少輝煌,而是我們是否有勇氣在人工智能時代,再次成為改變未來的引領者。 如果說過去六十年,香港憑藉金融連接世界;那麼未來六十年,香港更應以人工智能連接世界,以創新定義未來,以制度贏得信任,以人才創造價值。唯有如此,香港才能在全球AI競賽中,不只是保持競爭力,更能成為全球AI金融創新的重要樞紐,並在國際人工智能治理體系中,發揮更積極、更具影響力的角色。

【職場 Hacker】運用SHOW 框架:如何打造個人品牌
Advice Columnist

【職場 Hacker】運用SHOW 框架:如何打造個人品牌

以下故事,純屬虛構,如有雷同,實屬巧合 Sarah 是一位資深顧問,專業能力很強,但她有一個問題:沒有人知道她。 「Kenneth,我做了很多專案,也幫客戶解決了不少問題,」Sarah 說。「但當別人有需要時,第一時間總不會想起我。我應該怎樣提升自己的能見度?」 「你需要的不是單純曝光,」我說。「你需要讓別人看見清晰、可信,而且有證據的專業價值。SHOW 框架可以幫你。」 什麼是 SHOW 框架? SHOW 是 MAKER 層中 Exposure(曝光展示)模組的實踐框架,幫助你把專業能力轉化為別人看得見、找得到和願意相信的個人品牌。 SHOW 代表四個步驟: Sarah 的 SHOW 策略 我用 SHOW 框架幫 Sarah 將多年累積的專業能力,整理成別人容易理解與信任的個人品牌。 S – Signal(信號) 我先問 Sarah:「別人第一次認識你時,你希望他們記住甚麼?」 Sarah 說:「我希望他們知道,我不是一般顧問;我擅長用數據協助企業看清轉型問題,並把策略真正落實。」 我告訴她:「這就是你的專業信號。你不需要向所有人介紹所有能力;你要讓目標客戶一聽便明白,你為誰解決甚麼問題。」 於是,Sarah 把自我介紹整理為一句清楚的定位:「我協助企業以數據釐清轉型問題,並將策略轉化為可執行的行動。」 H – Hub(中心) 第二步,是為這個定位建立一個中心。 Sarah 過去的經驗散落在不同簡報、舊履歷和通訊錄中。別人即使聽過她,也很難快速找到她的案例、觀點和聯絡方式。 我建議她先把 LinkedIn 個人頁面當作主中心:清楚寫上專業定位、整理代表案例、列出可提供的服務方向,並放置聯絡方法。 我告訴她:「你的 Hub 不一定要很複雜,但必須讓有需要的人,一進來便找到你是誰、做過甚麼,以及如何與你聯絡。」 O – Output(成果) 第三步,是持續讓專業成果被看見。 Sarah 不再只在完成專案後把經驗留在公司內部。她開始將不涉客戶機密的學習整理成短文、分享簡報和實用工具。 她每週在 […]

ESG 政策與物業管理的進化:從綠色建築到社區參與
Advice Columnist

ESG 政策與物業管理的進化:從綠色建築到社區參與

隨著ESG(環境、社會及管治)政策成為全球共識,物業管理早已不再局限於傳統日常營運與保安清潔,而是可持續發展、實踐「碳中和2050」目標的關鍵樞紐。ESG報告已成為上市公司與房地產基金的常規披露項目,物管團隊不再只是單純的設施維護者,更是碳數據蒐集、減碳目標執行與成效匯報的核心單位,因此需要建立標準化碳審查、能源及廢物監控機制,以便追溯各項樓宇指標可。 香港已訂立在2035年前將碳排放較2005年水平減半,並定下在2050年或之前,商業及住宅樓宇分別減少三至四成及兩至三成用電的方向,物業管理正是推動「節能綠建」與「全民減廢」的前線核心力量。要實踐這些目標,不能只依賴新建大廈的綠色設計,更要透過持續的物業營運管理,把減碳理念融入日常營運的每個細節,從冷凍機組、升降機、公共照明的節能調校,到分類回收、廚餘收集、減少一次性用品等安排,同時配合「全民減廢.資源循環.零廢堆填」的政策方向,減低堆填區溫室氣體排放。 物管團隊可借助分項電錶、感應裝置、物聯網及人工智能去監察用電模式,優化設備運作時段,在盡量不影響住戶舒適度的前提下節省能源;另一方面, BEAM Plus為物管提供系統化的可持續管理框架,透過節能改造、高效設備更換、隔熱改善及光伏系統安裝等工程,長遠可壓縮營運開支,達成業主、住戶及物管公司三贏的局面。硬件升級以外,社區參與這項軟實力同樣舉足輕重,管理公司可透過環保工作坊、零碳挑戰、二手市集等活動,推廣節能減廢的生活模式,引導業戶改變生活習慣,令ESG由制度條文,扎根成為社區共同的生活價值。 優質的綠色管理有助實現環境效益與資產價值同步提升,物業管理者必須具備將ESG融入資產全生命週期管理的宏觀思維,善用科技與物聯網進行智慧化能源管理與風險監控,並協調業主、租戶、政府及供應商等,共同構建可持續發展的共融社區,引領香港物業管理走向更加綠色、智慧與具社會責任的新時代,為行業與社會創造長遠價值。 香港房屋經理學會前任主席 鄭玉琴女士