JS, ES, TS, Flow, Dart,我们用哪个?

在现代的Web开发世界中,有许多不同的概念和术语。编程语言也不例外。对于一个新手前端开发人员来说,理解各种技术通常是困难的,有时他无法准确地确定自己在使用什么语言进行编写。

在本文中,我们将讨论前端语言。它们是什么以及应该选择哪一个。

JavaScript

让我们从广为人知的JavaScript语言开始。这门语言首次出现于1996年,得益于NetscapeBrendan Eich,他在同名浏览器中实现了它。最初,该语言被称为Mocha,后来改名为LiveScript,但最终得到了现在的名字 - JavaScript。同年,微软也发布了一款名为JScript的直接类似品。JScript并没有被广泛传播,完全在.NET平台内使用(现在称为JScript.NET)。但是JavaScript相反,走向了大众。

  • 1996年11月,Netscape宣布与标准化组织ECMA International举行会议,以制定语言标准。

  • 1997年,第一版ECMA-262规范出现了。在6月的ECMA大会上发布了几个语言版本。参与组织之间在语言名称上发生了争论,特别是在Netscape和微软之间爆发了激烈的战斗。作为妥协,参与者们同意使用名称“ECMAScript”。多年后,Eich表示,“ECMAScript”这个名字与一种皮肤病(湿疹)有关。

  • 1998年,Netscape完全使该语言符合规范(JavaScript版本1.3)。

ECMAScript

随着时间的推移,ECMA-262规范得到了发展,JavaScript语言也随之发展。直到2009年,第5版规范才发布。当时发布的前一个版本是3.1版。由于变化太大,第4版从未发布。第4版计划于2008年10月发布。编辑部提供了类、模块、生成器等功能。这可能是自1999年以来的第一个重大语言变化。然而,2008年8月,编辑部被退回到开发中,并被纳入了代号为ECMAScript Harmony的项目,后来在2015年成为ECMAScript的第6版。

ES6 - ECMAScript2015

我们以ES6的缩写来了解ECMAScript的第6版。稍后,该标准更名为ECMAScript2015。有时,这个版本也被它的代号ECMAScript Harmony称呼。

从这个版本开始,习惯上区分出ECMAScript(ES)的概念。例如,类、模块、letconst、迭代器以及for..of循环、生成器(类似于Python语言)。

到目前为止,并不是所有的浏览器都完全实现了ECMAScript Harmony标准,因此,通常在商业开发中,该标准下的代码并不是以其纯粹形式交付的,而是预先转换(转译)为所有现代浏览器都原生支持的旧版ECMAScript 5。因此,大多数经过转译后的ES代码实际上是经典的JavaScript(ES5)。在Web开发中,存在一个“语法糖”的概念,这意味着我们编写的一些代码(在我们的案例中是ES代码)实际上将在以后被自动替换为其他更复杂但原生的构造。

此后,每年都会出版新版的ECMAScript至今。截至撰写本文时,存在以下版本。

ES7 - ECMAScript2016

块级作用域、解构、**操作符(类似于Math.pow,但语法更简单)、关键字async和await(作为下一个ES8的预览)、原型方法Array.prototype.includes

ES8 - ECMAScript2017

Object.valuesObject.entriesObject.getOwnPropertyDescriptorsasync/await(在生成器和promises中)以及一些其他用于并发的附加功能。

ES9 - ECMAScript2018

扩展/剩余操作符(…)、async迭代、Promise.prototype.finally以及一些对RegExp的添加。

ES10 - ECMAScript2019

Array.prototype.flatArray.prototype.flatMap、一些对Array.prototype.sort的更改(现在该方法保证具有相同权重的元素永远不会改变它们相对于彼此的起始位置)以及Object.fromEntries

ES11 - ECMAScript2020

首次出现了用于处理大数的BigInt类型,以及globalThis对象和nullish coalescing(??操作符)。

ES12 - ECMAScript2021

字符串现在具有replaceAll方法,还出现了Promise.anyAggregateError(一种新型错误,一次代表多个错误)、逻辑赋值(??=、&&=、||=)、WeakRefFinalizationRegistry(也许在另一篇文章中),数值分隔符(现在可以将数字指定为1_000_000)、改进的Array.prototype.sort算法。

ES13 - ECMAScript2022

现在可以为整个模块、类的公共和私有字段和方法(包括内部和静态的)指定await,类内部的静态块,#x in obj构造(检查对象中是否存在私有字段),RegExp中的索引子字符串,Error中的cause字段,StringArray和TypedArray中的at方法,Object.hasOwnObject.prototype.hasOwnProperty的替代方法)。

ES14 - ECMAScript2023

Array.prototypeTypedArray.prototype中的toSortedtoReversedwithfindLastfindLastIndex方法。还向Array.prototype添加了toSpliced方法。可执行脚本文件的#!(shebang)注释。允许在周集合中使用Symbols

ES.Next

未来版本的动态名称,尚未发布。这包括已完成阶段4的更改。

TypeScript

这门语言来自Microsoft。与ES类似,事实上,该语言是一种语法糖,不同之处在于没有任何浏览器完全或部分支持该语法。在执行之前,必须对语言进行编译,即将其转换为经典JavaScript(ES5)

这是因为该语言是强类型的,并在编译阶段进行类型检查,即使在执行之前也是如此。

该语言本身诞生于Microsoft的内部,用于解决他们自己的紧迫问题。一种功能强大但松散类型的语言并不适合在具有大型团队的大型项目上工作。微软花了两年时间在JavaScript的基础上开发了一个内部的超集。

TypeScript基于当时仍在讨论的ECMAScript Harmony的想法。特别是,引入类的想法看起来非常有前途,这与其他流行的编程语言相符。

TypeScript于2012年首次公开发布。尽管该语言受到了大家的欢迎,但现有的代码编辑器尚不支持预编译和TypeScript类型检查,这令人沮丧。仅仅两年后,在2014年,微软发布了TypeScript 1.0,并将其集成到了Visual Studio 2013 IDE中。

如今,该语言非常受欢迎,并且在许多公司中成为了标准。

Flow

与以上所有内容不同,Flow不是一种编程语言(不要与FLOW教育语言混淆)。在本质上,FlowFacebook开发的一个库,允许您向传统的JavaScript代码添加类型检查。与TypeScript类似,ECMAScript Harmony的想法和建议构成了其基础。
在语法上,Flow在许多方面与TypeScript类似,但由于Flow不像TypeScript那样预编译,因此某些结构被简化或完全缺失。相反,Flow会分析数据流,并基于此执行类型检查。实际上,这就是它得名的原因。
Flow并不像TypesScriptES那样受欢迎。Facebook于2014年开发了它,与TypeScript相对,它用于其内部开发。Flow得名于另一个流行的FacebookReact,其源代码使用Flow编写。通常,它与React一起使用最频繁。但即使在React领域,绝大多数开发人员也更喜欢ESTypeScript

Dart

这种语言与所有其他语言略有不同,因为该语言完全独立(即它不是JavaScript的语法糖),旨在成为传统JavaScript的替代品。自2011年以来,Google一直在开发它。第一个稳定版本于2013年发布,2014年ECMA批准了ECMA-408标准。截至目前,标准的最新第四版日期为2015年12月。
尽管有雄心勃勃的计划和IT巨头的能力,但这种语言的普及速度较慢。即使在Google内部,该语言也并不广泛使用,部分原因是仍然可能支持本机语言,主要仅限于Google Chrome浏览器的范围内。出于跨平台的目的,Google开发了dart2js编译器,它可以将Dart代码转换为JavaScript,但这并没有使该语言变得流行。毕竟,在编译的情况下,语言的所有优势都会丧失。
然而,该语言仍然在社区的关注范围内,并且我们将持续关注其发展。

在前端开发区分以下概念:

  • JavaScript(也称为ES5):传统的编程语言。几乎所有可执行的前端代码都以某种方式给出
  • ES(6 - Next):从第6版开始的ECMAScript标准版本。部分或完全由JS引擎支持,但实际上,在大多数情况下,它们会被转译(转换为ES5标准),这种方法称为“语法糖”
  • TypeScript : 一种强类型语言。它有自己的语法,但试图遵循ECMAScript规范。它比经典JavaScript具有许多优点,但不能独立执行,它需要预编译为JavaScriptES
  • Flow : 它不是一种编程语言。这是一种向常规JavaScript添加类型分析引擎的方法
  • Dart : 一种替代性的完整编程语言。它可以在兼容的客户端上独立执行(迄今为止,只有Google Chrome是其中之一),也可以转换为常规JavaScript