在现代的Web开发世界中,有许多不同的概念和术语。编程语言也不例外。对于一个新手前端开发人员来说,理解各种技术通常是困难的,有时他无法准确地确定自己在使用什么语言进行编写。
在本文中,我们将讨论前端语言。它们是什么以及应该选择哪一个。
JavaScript
让我们从广为人知的JavaScript
语言开始。这门语言首次出现于1996年,得益于Netscape
的Brendan 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)
的概念。例如,类、模块、let
、const
、迭代器以及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.values
、Object.entries
、Object.getOwnPropertyDescriptors
、async/await
(在生成器和promises
中)以及一些其他用于并发的附加功能。
ES9 - ECMAScript2018
扩展/剩余操作符(…)、async
迭代、Promise.prototype.finally
以及一些对RegExp
的添加。
ES10 - ECMAScript2019
Array.prototype.flat
、Array.prototype.flatMap
、一些对Array.prototype.sort
的更改(现在该方法保证具有相同权重的元素永远不会改变它们相对于彼此的起始位置)以及Object.fromEntries
。
ES11 - ECMAScript2020
首次出现了用于处理大数的BigInt类型,以及globalThis
对象和nullish coalescing
(??操作符)。
ES12 - ECMAScript2021
字符串现在具有replaceAll
方法,还出现了Promise.any
、AggregateError(
一种新型错误,一次代表多个错误)、逻辑赋值(??=、&&=、||=)、WeakRef
和FinalizationRegistry
(也许在另一篇文章中),数值分隔符(现在可以将数字指定为1_000_000)、改进的Array.prototype.sort
算法。
ES13 - ECMAScript2022
现在可以为整个模块、类的公共和私有字段和方法(包括内部和静态的)指定await,类内部的静态块,#x in obj
构造(检查对象中是否存在私有字段),RegExp中的索引子字符串,Error
中的cause字段,String
、Array
和TypedArray中的at方法,Object.hasOwn
(Object.prototype.hasOwnProperty
的替代方法)。
ES14 - ECMAScript2023
Array.prototype
和TypedArray.prototype
中的toSorted
、toReversed
、with
、findLast
、findLastIndex
方法。还向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教育语言混淆)。在本质上,Flow
是Facebook
开发的一个库,允许您向传统的JavaScript
代码添加类型检查。与TypeScript
类似,ECMAScript Harmony
的想法和建议构成了其基础。
在语法上,Flow
在许多方面与TypeScript
类似,但由于Flow
不像TypeScript
那样预编译,因此某些结构被简化或完全缺失。相反,Flow会分析数据流,并基于此执行类型检查。实际上,这就是它得名的原因。Flow
并不像TypesScript
和ES
那样受欢迎。Facebook
于2014年开发了它,与TypeScript
相对,它用于其内部开发。Flow
得名于另一个流行的Facebook
库React
,其源代码使用Flow
编写。通常,它与React
一起使用最频繁。但即使在React领域,绝大多数开发人员也更喜欢ES
或TypeScript
。
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
具有许多优点,但不能独立执行,它需要预编译为JavaScript
或ES
- Flow : 它不是一种编程语言。这是一种向常规
JavaScript
添加类型分析引擎的方法 - Dart : 一种替代性的完整编程语言。它可以在兼容的客户端上独立执行(迄今为止,只有
Google Chrome
是其中之一),也可以转换为常规JavaScript