追溯到 1998 年第一次拥有个人电脑开始,JavaScript 可能是我最早接触的编程语言,不过这么多年过去了,我现在又变得迷糊了,我反倒搞不清楚什么是 JavaScript 了。
一、历史
JavaScript最早是由Brendan Eich在1995年发明的。当时,他在网景通信(Netscape Communications)工作,目的是开发一种轻量级的脚本语言,让网页能够具有更多的交互性。最初这种语言被称为Mocha,后来改名为LiveScript,最终在1995年底被重新命名为JavaScript。
JavaScript的创建目的是为了在浏览器端执行脚本,实现网页的动态效果和用户交互。它的出现极大地推动了Web技术的发展,使得网页从静态文档转变为可以提供丰富交互体验的应用平台。随着时间的发展,JavaScript已经成为了Web开发中最重要的语言之一,其应用范围也从最初的客户端扩展到了服务器端(Node.js)和许多其他领域。
二、 开始标准化
关于JavaScript的标准化,它始于1996年,当时Netscape将JavaScript提交给了Ecma International(一个标准化组织)以制定语言标准。这导致了第一个版本的ECMAScript(ECMA-262标准)的创建,它在1997年6月被采纳。ECMAScript旨在确保各种实现JavaScript的环境之间的互操作性和标准化。从那时起,ECMAScript成为了JavaScript语言的官方标准,经历了多次更新以反映语言的发展和新增功能。
在IE 6盛行的时代(大约是2001年到2006年),确实存在几种竞争的浏览器,每种浏览器都有自己的JavaScript实现,这些实现尽管基于ECMAScript标准,但各自添加了一些专有的扩展,导致了跨浏览器兼容性问题。以下是当时几个主要浏览器的情况:
Internet Explorer 6 (IE6): IE6基于ECMAScript 3标准,但加入了大量的非标准扩展和对DOM的专有实现,这些特性在其他浏览器中不一定可用,导致了许多网站只能在IE上正常工作。
Firefox: 当时的Firefox是由Mozilla基金会开发的,它继承自Netscape Navigator的遗产。Firefox力求遵循标准,包括较新的ECMAScript版本和W3C的DOM标准,但也引入了一些Mozilla特有的JavaScript扩展。
Opera: Opera浏览器以其创新和对标准的快速采用而著称,包括对ECMAScript和DOM标准的支持。Opera也有一些自己的专有扩展,但总体上,它努力兼容Web标准。
当时,这种标准的多样性和专有扩展的存在导致Web开发者必须对不同的浏览器编写特定的代码或使用“hack”来确保他们的网站或Web应用可以在各种浏览器上正确运行。这个时期是Web开发中的“黑暗时代”,因为浏览器兼容性问题非常普遍。
随着时间的推移,Web标准得到了更广泛的接受和实施,尤其是随着HTML5和CSS3的出现,以及所有主要浏览器厂商对ECMAScript标准的更新采用,浏览器之间的差异和兼容性问题大大减少。
三、 事实标准
Chrome浏览器由Google开发,首次发布于2008年9月2日。它最初被设计为一款快速、简单、安全的浏览器,并很快以其卓越的性能、高效的JavaScript执行速度和创新的用户界面而著称。Chrome的发布标志着一个重要的转折点,因为它引入了多进程架构,提高了浏览器的稳定性和安全性,并推动了Web技术的一系列创新。
关于Chrome成为事实上的标准的时间点,这个过程是逐渐发生的,而不是某个具体时间点的事件。Chrome浏览器的市场份额从发布之初就持续增长,特别是在2010年代初期,它的增长速度显著加快。根据多个网站统计和分析服务的数据,Chrome在2012年左右成为最受欢迎的浏览器,超过了当时的主要竞争对手,如Internet Explorer和Firefox。
Chrome之所以能够成为事实上的标准,主要是因为它在速度、安全性、稳定性、以及对新Web标准的支持方面领先于其他浏览器。Google还通过Chrome Web Store推动了Web应用的发展,为开发者提供了一个平台,可以发布基于Web技术的应用和扩展。此外,Google积极参与Web标准的制定过程,并确保Chrome快速支持这些标准,这也加速了其在浏览器市场的主导地位。
随着时间的推移,Chrome不仅成为了最受欢迎的桌面浏览器,也在移动设备上获得了广泛的使用。它对Web开发者和最终用户而言都成为了一个重要的参考点,许多人将Chrome的行为和支持的特性视为开发和测试Web应用的标准。然而,这种主导地位也引发了关于市场垄断和Web生态多样性的担忧和讨论。
截至2024年,最主流的浏览器及其市场占有率大致如下:
- Google Chrome: Chrome继续保持其作为最受欢迎的浏览器的地位,市场份额约为65.31%【11:0†source】。
- Safari: 作为苹果设备的默认浏览器,Safari的市场份额约为18.31%【11:0†source】。
- Microsoft Edge: Edge,基于Chromium的Microsoft浏览器,市场份额约为5.07%【11:0†source】。
- Firefox: 尽管经历了市场份额的波动,Firefox仍保持约3.04%的份额【11:0†source】。
- Samsung Internet: 主要在Samsung设备上使用,市场份额约为2.64%【11:0†source】。
- Opera: 市场份额约为2.48%【11:0†source】。
这些浏览器均采用了ECMAScript作为JavaScript的标准,但各自可能在实现上有所差异,尤其是在支持最新ECMAScript标准的特性方面。ECMAScript标准经历了多次迭代,从ES1发展到现在的ES2021(及更后续的版本),每个版本引入了新的特性和改进。主流浏览器通常会迅速采用新的ECMAScript标准,以确保开发者能够利用最新的语言特性来创建现代、高效的Web应用。然而,不同浏览器对这些标准的支持程度可能有所不同,因此开发者在开发跨浏览器兼容的应用时,仍需考虑这些差异。
四、JavaScript 的标准版本
JavaScript,作为网络开发中不可或缺的编程语言,随着时间的推移发展了多种标准。这些标准旨在确保不同浏览器和环境中的JavaScript代码能够以一致的方式运行。以下是JavaScript的几个关键标准及其之间的关系:
-
ECMAScript (ES): ECMAScript是JavaScript语言的标准化规范。它由Ecma国际通过TC39委员会(技术委员会39)来制定和更新。这个标准定义了JavaScript语言的语法、类型、语句、关键字等核心特性。随着时间的推移,ECMAScript标准已经经历了多个版本的更新:
- ES1 (1997年): 第一个版本。
- ES2 (1998年): 主要是格式上的调整。
- ES3 (1999年): 添加了更多的语言特性,如正则表达式和try/catch异常处理。
- ES5 (2009年): 引入了严格模式、JSON支持等特性。
- ES6/ES2015: 是一个重大更新,引入了类、模块、箭头函数、Promises、模板字符串等现代JavaScript开发中常用的特性。
- ES2016及以后: 每年发布一个新版本,逐步引入如
async/await
、Array.prototype.includes
等新特性。
-
JavaScript: 当我们通常提到JavaScript时,指的是基于ECMAScript标准实现的编程语言,它还可能包含一些额外的特性,这些特性依赖于它运行的环境。例如,浏览器环境中的JavaScript提供了操作DOM的API,而Node.js提供了服务器端编程的API。
-
DOM (文档对象模型): DOM是一个与语言无关的接口,允许程序和脚本动态访问和更新文档的内容、结构和样式。尽管DOM不是JavaScript的一部分,但JavaScript经常用来操作DOM,实现动态的网页效果。
-
BOM (浏览器对象模型): BOM提供了与浏览器交互的接口,允许JavaScript访问和操作浏览器窗口。BOM不是一个正式的标准,但它被各大浏览器支持,包括操作窗口、屏幕、位置、导航等功能。
-
Web APIs: 随着Web技术的发展,许多新的API被引入来提供更丰富的功能,如
fetch
API用于网络请求、Canvas
和WebGL
用于图形、Web Audio
用于音频处理等。这些API通常通过浏览器提供,但它们并不属于ECMAScript标准的一部分。
JavaScript的生态系统是由这些不同的标准和API共同构建的,它们使得JavaScript能够跨浏览器和平台工作,支持从简单脚本到复杂应用程序的开发。随着技术的发展,新的标准和API将继续被引入,以支持更多的功能和更好的用户体验。
五、到底应该怎么写?
1. 在浏览器里运行
在开发运行于浏览器中的JavaScript代码时,推荐遵循的标准是最新的ECMAScript规范,或者至少是广泛支持的一个较新版本。截至目前(2024年),这意味着应该考虑使用ECMAScript 2021(ES12)或其后续版本,前提是目标浏览器支持这些特性。以下是采用最新或较新ECMAScript标准的几个原因:
-
新特性和语法改进:每个ECMAScript版本都引入了新特性和语法改进,这些改进旨在使代码更简洁、更易于阅读和维护。例如,
async/await
(在ES2017中引入)大大简化了异步编程,而可选链(?.
)和空值合并运算符(??
),在ES2020中引入,提高了处理变量可能为null
或undefined
的情况的效率和清晰度。 -
性能优化:新版标准通常包括性能优化,这可能是通过改进现有特性或引入更有效率的新特性来实现的。浏览器厂商也会针对最新标准中的特性进行优化。
-
更好的工具支持:随着标准的发展,开发工具(如编译器、转译器、代码编辑器)也会更新,以提供对新特性的支持。使用最新的标准可以确保开发者能够充分利用这些工具的能力。
-
提高兼容性:虽然最新特性的支持可能在老旧浏览器上有限,但现代构建工具(如Babel)允许开发者使用最新的JavaScript特性,同时通过将代码转译为向后兼容的版本来支持旧浏览器。这意味着开发者可以编写现代JavaScript代码,而不牺牲对旧浏览器的支持。
-
社区和生态系统的支持:随着新版本的标准被广泛采纳,JavaScript社区和生态系统(包括框架、库、工具)也会向这些新特性和最佳实践转移。遵循最新的标准有助于保持代码的相关性,并利用生态系统的集体知识和资源。
虽然,ES2015(ES6)依然是一个非常重要的版本,但随着时间的推移和新版本的发布,建议开发者采用最新的ECMAScript标准,或至少是一个被广泛支持且包含必要功能的较新版本。这样做不仅能提升开发效率和代码质量,还能确保在不断演进的Web平台上保持竞争力。
2. 在 Node.js 环境运行
如果您正在开发一个在Node.js环境中运行的JavaScript应用程序,考虑到Node.js的特性和使用场景,您应该遵循的最佳实践有所不同,但依然推荐使用最新的ECMAScript标准。Node.js通常较快地采用和支持最新的JavaScript特性,因为它不受浏览器兼容性问题的限制。以下是一些指导原则和建议:
-
检查Node.js版本的ECMAScript支持:Node.js的不同版本支持ECMAScript标准的不同特性。在选择使用特定JavaScript特性之前,最好检查您的目标Node.js版本支持哪些ECMAScript特性。可以通过Node.js官方文档或使用在线工具(如Node.green)来查找这些信息。
-
利用最新特性,但保持兼容性:使用最新的ECMAScript特性可以提高开发效率,改善代码的可读性和维护性。然而,如果您的应用需要在旧版本的Node.js上运行,您可能需要使用诸如Babel之类的转译工具,将新特性转译为向后兼容的代码。
-
考虑使用TypeScript:TypeScript提供了类型系统和对ECMAScript最新特性的支持,能够增加代码的可维护性和健壮性,特别是在大型项目或团队中。TypeScript可以编译成普通的JavaScript,因此您可以利用最新的JavaScript特性,同时享受静态类型检查的好处。
-
使用模块:从Node.js v12开始,Node.js对ECMAScript模块(ESM)提供了稳定支持。ESM可以帮助您组织和重用代码,同时也是现代JavaScript开发的一个重要部分。如果可能,尽量使用ESM而不是CommonJS模块。
-
跟踪Node.js的最新发展:Node.js社区非常活跃,Node.js本身也在不断地发展和改进。关注Node.js的最新版本和特性,可以帮助您充分利用Node.js环境的潜力,并确保您的应用能够高效运行。
总之,尽管Node.js允许您使用最新的JavaScript特性而无需担心浏览器兼容性问题,但仍然建议审慎选择要使用的特性,以确保您的应用在目标Node.js版本上能够顺畅运行。同时,考虑到项目的未来可维护性和潜在的环境升级,使用最新的ECMAScript标准和跟踪Node.js的更新是一种明智的做法。
六、编译器
在处理Web环境和Node.js环境的JavaScript代码方面,编译器(特别是现代JavaScript转译器如Babel,以及TypeScript)扮演着至关重要的角色。这些工具不仅使得开发者能够使用最新的JavaScript(ECMAScript)特性,而且确保了这些特性能够在不同的执行环境中稳定运行。以下是编译器在这两个环境中的主要角色和优势:
1. 角色和优势
-
兼容性保证:
- 编译器可以将采用最新ECMAScript标准书写的代码转译为旧版本的JavaScript,这对于维持代码在旧浏览器或Node.js版本中的兼容性至关重要。这样,开发者可以自由使用最新的语言特性,而不必担心其在目标环境中是否可用。
-
环境特定的优化:
- 编译器能够根据目标环境(如不同的浏览器或Node.js版本)进行代码的特定优化。例如,它们可以根据执行环境的特性选择最高效的语法或API。
-
语言扩展:
- TypeScript等工具通过提供类型系统和其他语言特性,扩展了JavaScript的能力,提高了代码的健壮性和可维护性。编译器将TypeScript代码转译为普通JavaScript代码,确保了与现有JavaScript环境的兼容性。
2. 是否总是更好的选择?
采用TypeScript是否总是更好的选择,这取决于项目的具体需求和团队的偏好:
-
优点:
- 类型安全:TypeScript的静态类型检查可以在编码阶段发现潜在的问题,减少运行时错误。
- 最新特性:可以使用最新的JavaScript特性,同时保持对旧环境的兼容。
- 工具支持:类型信息可以提升IDE和其他工具的能力,如自动完成、重构和代码导航。
-
劣势:
- 学习曲线:对于新手来说,TypeScript引入的类型系统和一些高级特性可能会有一定的学习成本。
- 编译时间:大型项目可能会经历较长的编译时间。
- 可能的过度工程:在一些小型或短期项目中,TypeScript可能引入不必要的复杂性。
总结来说,编译器在开发Web和Node.js应用时扮演着极其重要的角色,它们提供了在使用最新ECMAScript特性的同时保持代码跨环境兼容性的能力。采用TypeScript能够带来很多好处,尤其是在大型项目或需要高度可维护性的场景中。然而,是否采用TypeScript应根据项目的具体需求、团队的技能水平以及预期的维护成本来决定。
总结
本文回顾了 JavaScript 发展的历史,以及在各种浏览器和 Node.js 环境中,事实上标准分裂的现状,但是编译器有着化腐朽为神奇的功效,可以通过指定目标运行环境的标准,来让编译器弥平环境差异。所以,建议我们总是采用最新的 ECMAScript 标准来编写自己的代码,以获得更多语法上的支持,提升编程的体验。