虽然写了不少前端代码,但是我真没搞懂什么是 JavaScript

在这里插入图片描述

追溯到 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年,最主流的浏览器及其市场占有率大致如下:

  1. Google Chrome: Chrome继续保持其作为最受欢迎的浏览器的地位,市场份额约为65.31%【11:0†source】。
  2. Safari: 作为苹果设备的默认浏览器,Safari的市场份额约为18.31%【11:0†source】。
  3. Microsoft Edge: Edge,基于Chromium的Microsoft浏览器,市场份额约为5.07%【11:0†source】。
  4. Firefox: 尽管经历了市场份额的波动,Firefox仍保持约3.04%的份额【11:0†source】。
  5. Samsung Internet: 主要在Samsung设备上使用,市场份额约为2.64%【11:0†source】。
  6. Opera: 市场份额约为2.48%【11:0†source】。

这些浏览器均采用了ECMAScript作为JavaScript的标准,但各自可能在实现上有所差异,尤其是在支持最新ECMAScript标准的特性方面。ECMAScript标准经历了多次迭代,从ES1发展到现在的ES2021(及更后续的版本),每个版本引入了新的特性和改进。主流浏览器通常会迅速采用新的ECMAScript标准,以确保开发者能够利用最新的语言特性来创建现代、高效的Web应用。然而,不同浏览器对这些标准的支持程度可能有所不同,因此开发者在开发跨浏览器兼容的应用时,仍需考虑这些差异。

四、JavaScript 的标准版本

JavaScript,作为网络开发中不可或缺的编程语言,随着时间的推移发展了多种标准。这些标准旨在确保不同浏览器和环境中的JavaScript代码能够以一致的方式运行。以下是JavaScript的几个关键标准及其之间的关系:

  1. 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/awaitArray.prototype.includes等新特性。
  2. JavaScript: 当我们通常提到JavaScript时,指的是基于ECMAScript标准实现的编程语言,它还可能包含一些额外的特性,这些特性依赖于它运行的环境。例如,浏览器环境中的JavaScript提供了操作DOM的API,而Node.js提供了服务器端编程的API。

  3. DOM (文档对象模型): DOM是一个与语言无关的接口,允许程序和脚本动态访问和更新文档的内容、结构和样式。尽管DOM不是JavaScript的一部分,但JavaScript经常用来操作DOM,实现动态的网页效果。

  4. BOM (浏览器对象模型): BOM提供了与浏览器交互的接口,允许JavaScript访问和操作浏览器窗口。BOM不是一个正式的标准,但它被各大浏览器支持,包括操作窗口、屏幕、位置、导航等功能。

  5. Web APIs: 随着Web技术的发展,许多新的API被引入来提供更丰富的功能,如fetch API用于网络请求、CanvasWebGL用于图形、Web Audio用于音频处理等。这些API通常通过浏览器提供,但它们并不属于ECMAScript标准的一部分。

JavaScript的生态系统是由这些不同的标准和API共同构建的,它们使得JavaScript能够跨浏览器和平台工作,支持从简单脚本到复杂应用程序的开发。随着技术的发展,新的标准和API将继续被引入,以支持更多的功能和更好的用户体验。

五、到底应该怎么写?

1. 在浏览器里运行

在开发运行于浏览器中的JavaScript代码时,推荐遵循的标准是最新的ECMAScript规范,或者至少是广泛支持的一个较新版本。截至目前(2024年),这意味着应该考虑使用ECMAScript 2021(ES12)或其后续版本,前提是目标浏览器支持这些特性。以下是采用最新或较新ECMAScript标准的几个原因:

  1. 新特性和语法改进:每个ECMAScript版本都引入了新特性和语法改进,这些改进旨在使代码更简洁、更易于阅读和维护。例如,async/await(在ES2017中引入)大大简化了异步编程,而可选链(?.)和空值合并运算符(??),在ES2020中引入,提高了处理变量可能为nullundefined的情况的效率和清晰度。

  2. 性能优化:新版标准通常包括性能优化,这可能是通过改进现有特性或引入更有效率的新特性来实现的。浏览器厂商也会针对最新标准中的特性进行优化。

  3. 更好的工具支持:随着标准的发展,开发工具(如编译器、转译器、代码编辑器)也会更新,以提供对新特性的支持。使用最新的标准可以确保开发者能够充分利用这些工具的能力。

  4. 提高兼容性:虽然最新特性的支持可能在老旧浏览器上有限,但现代构建工具(如Babel)允许开发者使用最新的JavaScript特性,同时通过将代码转译为向后兼容的版本来支持旧浏览器。这意味着开发者可以编写现代JavaScript代码,而不牺牲对旧浏览器的支持。

  5. 社区和生态系统的支持:随着新版本的标准被广泛采纳,JavaScript社区和生态系统(包括框架、库、工具)也会向这些新特性和最佳实践转移。遵循最新的标准有助于保持代码的相关性,并利用生态系统的集体知识和资源。

虽然,ES2015(ES6)依然是一个非常重要的版本,但随着时间的推移和新版本的发布,建议开发者采用最新的ECMAScript标准,或至少是一个被广泛支持且包含必要功能的较新版本。这样做不仅能提升开发效率和代码质量,还能确保在不断演进的Web平台上保持竞争力。

2. 在 Node.js 环境运行

如果您正在开发一个在Node.js环境中运行的JavaScript应用程序,考虑到Node.js的特性和使用场景,您应该遵循的最佳实践有所不同,但依然推荐使用最新的ECMAScript标准。Node.js通常较快地采用和支持最新的JavaScript特性,因为它不受浏览器兼容性问题的限制。以下是一些指导原则和建议:

  1. 检查Node.js版本的ECMAScript支持:Node.js的不同版本支持ECMAScript标准的不同特性。在选择使用特定JavaScript特性之前,最好检查您的目标Node.js版本支持哪些ECMAScript特性。可以通过Node.js官方文档或使用在线工具(如Node.green)来查找这些信息。

  2. 利用最新特性,但保持兼容性:使用最新的ECMAScript特性可以提高开发效率,改善代码的可读性和维护性。然而,如果您的应用需要在旧版本的Node.js上运行,您可能需要使用诸如Babel之类的转译工具,将新特性转译为向后兼容的代码。

  3. 考虑使用TypeScript:TypeScript提供了类型系统和对ECMAScript最新特性的支持,能够增加代码的可维护性和健壮性,特别是在大型项目或团队中。TypeScript可以编译成普通的JavaScript,因此您可以利用最新的JavaScript特性,同时享受静态类型检查的好处。

  4. 使用模块:从Node.js v12开始,Node.js对ECMAScript模块(ESM)提供了稳定支持。ESM可以帮助您组织和重用代码,同时也是现代JavaScript开发的一个重要部分。如果可能,尽量使用ESM而不是CommonJS模块。

  5. 跟踪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. 角色和优势

  1. 兼容性保证

    • 编译器可以将采用最新ECMAScript标准书写的代码转译为旧版本的JavaScript,这对于维持代码在旧浏览器或Node.js版本中的兼容性至关重要。这样,开发者可以自由使用最新的语言特性,而不必担心其在目标环境中是否可用。
  2. 环境特定的优化

    • 编译器能够根据目标环境(如不同的浏览器或Node.js版本)进行代码的特定优化。例如,它们可以根据执行环境的特性选择最高效的语法或API。
  3. 语言扩展

    • TypeScript等工具通过提供类型系统和其他语言特性,扩展了JavaScript的能力,提高了代码的健壮性和可维护性。编译器将TypeScript代码转译为普通JavaScript代码,确保了与现有JavaScript环境的兼容性。

2. 是否总是更好的选择?

采用TypeScript是否总是更好的选择,这取决于项目的具体需求和团队的偏好:

  • 优点

    • 类型安全:TypeScript的静态类型检查可以在编码阶段发现潜在的问题,减少运行时错误。
    • 最新特性:可以使用最新的JavaScript特性,同时保持对旧环境的兼容。
    • 工具支持:类型信息可以提升IDE和其他工具的能力,如自动完成、重构和代码导航。
  • 劣势

    • 学习曲线:对于新手来说,TypeScript引入的类型系统和一些高级特性可能会有一定的学习成本。
    • 编译时间:大型项目可能会经历较长的编译时间。
    • 可能的过度工程:在一些小型或短期项目中,TypeScript可能引入不必要的复杂性。

总结来说,编译器在开发Web和Node.js应用时扮演着极其重要的角色,它们提供了在使用最新ECMAScript特性的同时保持代码跨环境兼容性的能力。采用TypeScript能够带来很多好处,尤其是在大型项目或需要高度可维护性的场景中。然而,是否采用TypeScript应根据项目的具体需求、团队的技能水平以及预期的维护成本来决定。

总结

本文回顾了 JavaScript 发展的历史,以及在各种浏览器和 Node.js 环境中,事实上标准分裂的现状,但是编译器有着化腐朽为神奇的功效,可以通过指定目标运行环境的标准,来让编译器弥平环境差异。所以,建议我们总是采用最新的 ECMAScript 标准来编写自己的代码,以获得更多语法上的支持,提升编程的体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/431081.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SPC 之 I-MR 控制图

概述 1924 年,美国的休哈特博士应用统计数学理论将 3Sigma 原理运用于生产过程中,并发表了 著名的“控制图法”,对产品特性和过程变量进行控制,开启了统计过程控制新时代。 什么是控制图 控制图指示过程何时不受控制&#xff…

【pyinstaller打包记录】程序使用多进程,打包后,程序陷入死循环

简介 PyInstaller 是一个用于将 Python 程序打包成可执行文件(可执行程序)的工具。它能够将 Python 代码和其相关的依赖项(包括 Python 解释器、依赖的模块、库文件等)打包成一个独立的可执行文件,方便在不同环境中运行…

YOLOv8从入门到入土使用教程!(二)目标预测

⭐⭐⭐瞧一瞧看一看,新鲜的YOLOv9魔改专栏来啦!⭐⭐⭐ YOLOv9有效改进专栏汇总|未来更新卷积、主干、检测头注意力机制、特征融合方式等创新 一、本文介绍 本文将演示如何使用YOLOv8进行训练及预测!模型训练教程参考下文: YOLOv8从…

python实现常见一元随机变量的概率分布

一. 随机变量 随机变量是一个从样本空间 Ω \Omega Ω到实数空间 R R R的函数,比如随机变量 X X X可以表示投骰子的点数。随机变量一般可以分为两类: 离散型随机变量:随机变量的取值为有限个。连续型随机变量:随机变量的取值是连…

线上问题——学习记录幂等判断失效问题分析

一、业务流程 上图是对save和saveScore两个接口的流程抽象,save是上传答题数据,saveScore则是上传答题分数,为保证幂等和防止并发调用,这两个接口都加了分布式锁(还是两层哦)。第一层使用的是不同的锁&…

【C++】STL简介 | STL六大组件 | string类 | string类对象操作

目录 1. 什么是STL 2. STL的版本 3. STL的六大组件 4. STL的缺陷 5. 引出string类 6. 标准库中的string类 6.1 string类简介 6.2 string类对象的构造 6.3. string类对象的容量 6.4. string类对象的遍历 6.5. string类对象的修改 6.6. string类非成员函数 6.7. vs…

品优购首页制作

一,常用模块类名命名 二,快捷导航shortcut制作 三,header制作 3.1LOGO SEO优化 3.2 搜索模块定位 四, nav导航制作 五,footer底部制作 六,main主体模块制作 以前书写是模块化中的公共部分 main主体模块是…

GEE入门篇|图像分类(一):监督分类

在遥感中,图像分类是尝试将图像中的所有像素分类为有限数量的标记土地覆盖和/或土地利用类别。 生成的分类图像是从原始图像导出的简化专题图(图 1), 土地覆盖和土地利用信息对于许多环境和社会经济应用至关重要,包括自…

鸿蒙开发,对于前端开发来说,究竟是福是祸呢?

提前声明: 先说好哈,不要一上来就开喷,好吧,不感兴趣的话你可以不用看下文直接划走,直接喷俺有点承受不住,心脏不好。如果你感兴趣,你可以先把这篇文章看完,看完后感觉俺讲的还挺有道…

堆和二叉树的动态实现(C语言实现)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿&#x1…

Linux - 基础IO

1、回顾 1.1、来段代码回顾C文件接口 hello.c写文件 #include <stdio.h> #include <string.h> int main() {FILE *fp fopen("myfile", "w");if(!fp){printf("fopen error!\n");}const char *msg "hello bit!\n";int …

xss.haozi.me:0x03及04

这里有一个正则所以&#xff08;&#xff09;要用到实体编码 <a href"javascript:alert1">cc</a> 03 04都一样

在线客服系统部署ssl开启https无法自动获取提示消息解决办法

▇ 增加https无法收发消息&#xff1a; 严格按照教程修改 1./站点目录/public目录下,修改index.php define(whost,wss://kf.tpym.cn); define(wport,443); 2./站点目录/service 目录下,修改config.php // websocket 端口&#xff0c;客服系统网页会连这个端口 $websocket_…

防患未然,OceanBase巡检工具应用实践——《OceanBase诊断系列》之五

1. OceanBase为什么要做巡检功能 尽管OceanBase拥有很好的MySQL兼容性&#xff0c;但在长期的生产环境中&#xff0c;部署不符合标准规范、硬件支持异常&#xff0c;或配置项错误等问题&#xff0c;这些短期不会出现的问题&#xff0c;仍会对数据库集群构成潜在的巨大风险。为…

1999-2022年30省平均受教育年限(含原始数据和具体计算过程+计算结果)

1999-2022年30省平均受教育年限&#xff08;含原始数据和具体计算过程&#xff09; 1、时间&#xff1a;1999-2022年 2、范围&#xff1a;30省&#xff08;剔除西藏&#xff09; 3、计算方式&#xff1a;平均受教育年限&#xff08;未上学人数*0小学人数*6初中人数*9高中人数…

AI大模型的预训练、迁移和中间件编程

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

python.模块与包

1.模块是什么 本质上是一种python文件&#xff0c;以.py结尾&#xff0c;里面有类&#xff0c;函数&#xff0c;变量等&#xff0c;认为这是一个工具包&#xff0c;每个模块有不同的功能&#xff0c;导入后可以直接使用 2.模块的导入 方法1 import 模块名 使用&#xff1a…

展示模型展台的高度一般为多少---模大狮模型网

展示模型展台的高度一般取决于多个因素&#xff0c;包括展示物品的大小、展台的设计风格、展览场地的限制等。一般来说&#xff0c;展示模型展台的高度可以根据以下几点考虑&#xff1a; 展示物品的大小&#xff1a;如果展示物品比较大或需要竖立展示&#xff0c;展台的高度可能…

GraphGeo参文19:Auto-Encoding Variational Bayes

https://arxiv.org/abs/1312.6114 [19] Diederik P Kingma and Max Welling. 2014. Auto-encoding variational bayes. In ICLR. 【前言】:VAE模型是Kingma(也是Adam的作者)大神在2014年发表的文章,是一篇非常非常经典,且实现非常优雅的生成模型,同时它还为bayes概率图模型…

LVS负载均衡集群——NAT地址转换模式与DR直接路由

目录 一、LVS集群基本介绍 1、集群是什么&#xff1f; 2、集群的类型 ①负载均衡集群 ②高可用群集 ③高性能运算群集 3、负载均衡集群的结构 第一层&#xff0c;负载调度器 第二层&#xff0c;服务器池 第三层&#xff0c;共享存储 4、LVS负载均衡集群的三种工作模…