【玩转 JS 函数式编程_004】1.4 如何应对 JavaScript 的不同版本

news2024/12/23 15:13:24

本节目录

    • 1.4 如何应对 JavaScript 的不同版本 How do we work with JavaScript?
      • 1.4.1. 使用转译工具 Using transpilers
      • 1.4.2. 应用在线环境 Working online
      • 1.4.3. 测试环境 Testing

1.4 如何应对 JavaScript 的不同版本 How do we work with JavaScript?

上面介绍的语言特性都很不错,但正如前文提到的那样,适用性最广的 JavaScript 的版本,往往并不是最新的 ES13,而更有可能是早期的 JS5。这当中 Node.js 算个例外。它基于 Chrome 浏览器的 V8 高性能 JavaScript 引擎。该引擎已经实现了多项 ES13 特性。尽管如此,截至目前(2023 年 5 月),V8 引擎对 ES13 特性的覆盖率仍达不到 100%,总会有一些特性缺失(更多 Node.jsV8 信息,详见 https://nodejs.org/en/learn/getting-started/ecmascript-2015-es6-and-beyond)。这种情况今后肯定会改变,因为 Internet Explorer 浏览器将逐渐淡出人们的视野(对它的支持已于 2022 年 6 月正式结束),取而代之的,是共享 Chrome 引擎的 Microsoft Edge 浏览器。无论如何,就目前而言,我们仍须同旧的、效率较低的 JS 引擎打交道。

怎样在当前可用的早期版本中尝鲜新的语言特性呢?或者,如果您的大多数用户使用的是旧版浏览器,不支持您推崇备至的那些花哨的特性,该如何是好?让我们来看看一些现成的解决方案。

若要在尝试任何特定的新特性之前进行选择,可以查看 https://compat-table.github.io/compat-table/es6/ 上的兼容性列表(如 图1.1 所示);查看 Node.js 规范,详见 http://node.green/。

图 1.1 JavaScript 的最新特性可能无法全面支持,使用前需要检查一下

【图 1.1 JavaScript 的最新特性可能无法全面支持,使用前需要检查一下】

1.4.1. 使用转译工具 Using transpilers

为了解决可用性和兼容性的问题,可以使用一些 转译工具transpilers)。转译器将您的原始 ES10 代码(可能涉及最新的 JavaScript 特性)转换为等效的 JS5 代码。这是一个从源码到源码(source-to-source)的转换,而不是编译过程使用的源码到对象(source-to-object)的方式。编码时可以用高级 ES10 特性,而用户的浏览器接收的是 JS5 代码。尽管浏览器在桌面端和移动端采用新标准尚需时日,转译器可以让您同步到即将发布的语言版本。

关于 transpiler 一词的来历,它是 translatecompiler 的结合体。类似的组合在技术领域屡见不鲜:电邮 emailelectronicmail 的组合)、表情符号 emoticonemotionicon 的组合)、恶意软件 malwaremalicioussoftware 的组合)以及字母数字 alphanumericalphabeticnumeric 的组合)……不一而足。

最常见的 JavaScript 转译器是 Babel(详见 https://babeljs.io/)和 Traceur(详见 https://github.com/google/traceur-compiler)。结合 npmwebpack 等工具,相关配置十分轻松,可将代码自动转译成终端用户需要的版本。您也可以在线转译,如 图 1.2 所示的 Babel 在线转译环境示例:

图 1.2 Babel 在线转译器将 ES10 代码转译为兼容的等效 JS5 代码示意图

【图 1.2 Babel 在线转译器将 ES10 代码转译为兼容的等效 JS5 代码示意图】

如果喜欢 Traceur,可以在 https://google.github.io/traceur-compiler/demo/repl.html# 进行尝试,不过需要在开发者控制台查看转译后的代码结果(图 1.3 为转译后的代码示例)。选中 EXPERIMENTAL 选项来启用 ES10 特性:

图 1.3 Traceur 转译工具是 ES10 转 JS5 的另一种行之有效的替代方案

【图 1.3 Traceur 转译工具是 ES10 转 JS5 的另一种行之有效的替代方案】

小贴士

了解转译工具也是学习新语言特性的绝佳途径。在左边敲入代码即可在右边得到等效的转译代码。此外,还可以使用命令行工具来转译源代码,对比查看输出的结果。

最后还有一种方案:选用 MicrosoftTypeScript(http://www.typescriptlang.org/),而不是 JavaScript。它是 JavaScript 的超集,可以被编译为 JS5 的代码。TypeScript 的主要优点是能够向 JavaScript 选择性地添加静态类型检查,这有助于在编译时检测某些代码问题。注意:与 BabelTraceur 一样,并非所有 ES10 语言特性都支持。

除了 TypeScript,还可以使用 FacebookFlow 进行类型检查(详见 https://flow.org)。

若选用 TypeScript,可以利用其 playground 训练场模块进行线上功能测试(详见 http://www.typescriptlang.org/play/)。TypeScript 可以对类型检查的严格程度进行配置,也可以实时运行代码,如 图 1.4 所示:

图 1.4 TypeScript 新增的类型检查特性有助于更安全地编写代码

【图 1.4 TypeScript 新增的类型检查特性有助于更安全地编写代码】

通过使用 TypeScript,可以规避掉一些常见的类型方面的错误。当下有个积极的趋势,是大多数工具(框架、库等)正在慢慢朝这个方向发展,从而使今后的编码工作越来越轻松。

1.4.2. 应用在线环境 Working online

网上有不少工具可以用来测试 JavaScript 代码,比如 JSFiddle(https://jsfiddle.net/)、CodePen(https://jsbin.com/)等等。您需要设定是否使用 Babel 或 Traceur,否则新语言特性将不生效。如 图 1.5 中的 JSFiddle 示例:

图 1.5 JSFiddle 可以在无需引入其他工具的情况下试验新的 JavaScript 特性(带 HTML 及 CSS)

【图 1.5 JSFiddle 可以在无需引入其他工具的情况下试验新的 JavaScript 特性(带 HTML 及 CSS)】

这些工具的应用为我们快速尝试新特性、试验新功能提供了新的途径——这一点我可以保证,因为本书大部分代码就是采用这种方式进行测试的结果!

1.4.3. 测试环境 Testing

本书也会涉及测试方面的知识,毕竟易于测试是函数式编程的主要优点。本书之前的版本用的测试框架为 Jasmine (https://jasmine.github.io/),这一版改用 Facebook 的 Jest(jestjs.io/)框架——一款基于 Jasmine 构建的新测试框架。

Jest 以其卓越的易用性与广泛的适用性而持续受到热捧:无论是前端应用还是后端代码,几乎不需要什么配置就能进行同等效果的测试(更多安装配置详情,可参阅 jestjs.io/docs/getting-started)。本书不会对每一段代码编写测试用例,但遵循 测试驱动开发(test-driven development, 即 TDD) 的观点,大多数情况还是会考虑测试的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

netty之Netty传输文件、分片发送、断点续传

前言 1:在实际应用中我们经常使用到网盘服务,他们可以高效的上传下载较大文件。那么这些高性能文件传输服务,都需要实现的分片发送、断点续传功能。 2:在Java文件操作中有RandomAccessFile类,他可以支持文件的定位读取…

【递归】13. leetcode 1457. 二叉树中的伪回文路径

1 题目描述 题目链接:二叉树中的伪回文路径 2 解答思路 第一步:挖掘出相同的子问题 (关系到具体函数头的设计) 第二步:只关心具体子问题做了什么 (关系到具体函数体怎么写,是一个宏观的过…

【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化

【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化 阿里 MySQL 命名规范MySQL8 DDL的原子化 阿里 MySQL 命名规范 【强制】表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价…

使用 Elastic 将 AI 摘要添加到你的网站

作者:来自 Elastic Gustavo Llermaly 我们目前所知道的搜索(搜索栏、结果、过滤器、页面等)已经取得了长足的进步,并实现了多种不同的功能。当我们知道找到所需内容所需的关键字或知道哪些文档包含我们想要的信息时,尤…

云计算SLA响应时间的matlab模拟与仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 用matlab模拟,一个排队理论。输入一堆包,经过buffer(一个或者几个都行)传给server,这些包会在buffer里…

热网无线监测系统/config.aspx接口存在反射性XSS漏洞

漏洞描述 热网无线监测系统/config.aspx接口存在反射性XSS漏洞 漏洞复现 FOFA body"Downloads/HDPrintInstall.rar" || body"skins/login/images/btn_login.jpg" POC IP/config.aspx POC <script>alert(1)</script> 点击确认成功弹窗1

C++继承与菱形继承(一文了解全部继承相关基础知识和面试点!)

目的减少重复代码冗余 Class 子类(派生类) &#xff1a; 继承方式 父类&#xff08;基类&#xff09; 继承方式共有三种&#xff1a;公共、保护、私有 父类的私有成员private无论哪种继承方式都不可以被子类使用 保护protected权限的内容在类内是可以访问&#xff0c;但是在…

kubernetes-强制删除命名空间

一、故障现象 1、删除命名空间卡住、强制删除也卡住 2、其他终端显示命名空间下无资源 二、处理步骤 1、kubectl get namespace cilium-test -o json > temp.json 获取你需要删除的命名空间json描述文件。 2、修改finalize字段 3、替换 kubectl replace --raw "/api/v1…

csdn加目录,标题

最简单的办法是&#xff0c; 目录 先写文章&#xff0c; 在给需要加标题的&#xff0c; 给他添加格式为标题一&#xff0c; 在点目录 先写文章&#xff0c; 在给需要加标题的&#xff0c; 给他添加格式为标题一&#xff0c; 最后点目录就会生成目录在文章前面了&#x…

AMD GPU推理:三步让你了解AI推理的游戏规则

我们常听到“AI推理”这个词,但很多朋友可能只了解个大概。如果你对AI有基本的认识,可能会好奇:AMD的GPU怎么在推理中大展拳脚?它跟常见的NVIDIA相比又如何?今天,我们就来聊聊这个问题。你可能在考虑选购GPU或者在项目中使用AMD,本文将带你从实际应用出发,一步步拆解。…

云原生(四十一)| 阿里云ECS服务器介绍

文章目录 阿里云ECS服务器介绍 一、云计算概述 二、什么是公有云 三、公有云优缺点 1、优点 2、缺点 四、公有云品牌 五、市场占有率 六、阿里云ECS概述 七、阿里云ECS特点 阿里云ECS服务器介绍 一、云计算概述 云计算是一种按使用量付费的模式&#xff0c;这种模式…

Stable Diffusion绘画 | 来训练属于自己的模型:炼丹参数调整--步数设置与计算

要想训练一个优质的模型&#xff0c;一定要认识和了解模型训练中&#xff0c;参数的作用和意义。 整个模型训练的过程&#xff0c;参数并不是一成不变的&#xff0c;也没有固定的模板&#xff0c; 当我们修改了模型训练里面的某个参数&#xff0c;很可能就需要连带其他一系列…

USB外设的Device与Host的差异

USB&#xff0c;Universal Serial Bus。 USB协会&#xff1a; USB-IF协会认证&#xff1a;USB IF全称USB Implementers Forum&#xff0c;是由一群开发通用串行总线规范的公司创立的非营利性组织。USB-IF组织的成立旨在推广通用串行总线技术并提供相应的技术规范&#xff0c;…

手机使用指南:如何在没有备份的情况下从 Android 设备恢复已删除的联系人

在本指南中&#xff0c;您将了解如何从 Android 手机内存中恢复已删除的联系人。Android 诞生、见证并征服了 80% 的智能手机行业。有些人可能将此称为“非常大胆的宣言”&#xff0c;但最近的统计数据完全支持我们的说法。灵活性、高度改进的可用性和快速性是 Android 操作系统…

【C语言】内存函数的使用和模拟实现

文章目录 一、memcpy的使用和模拟实现二、memmove的使用和模拟实现三、memset的使用四、memcmp的使用 一、memcpy的使用和模拟实现 在之前我们学习了使用和模拟实现strncpy函数&#xff0c;它是一个字符串函数&#xff0c;用来按照给定的字节个数来拷贝字符串&#xff0c;那么问…

“衣依”服装销售平台:Spring Boot框架的设计与实现

3系统分析 3.1可行性分析 通过对本“衣依”服装销售平台实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本“衣依”服装销售平台采用JAVA作为开发语言&#xff…

TOGAF框架在企业数字化转型中从理论到实践的全面应用指南

数字化转型的背景与意义 随着全球技术的快速发展&#xff0c;数字化已成为现代企业生存和发展的核心驱动力。企业数字化转型不仅意味着引入新技术&#xff0c;还要求在业务模式、组织架构和运营方式上进行深度变革。然而&#xff0c;数字化转型的实施通常面临诸多挑战&#xf…

Scrapy 爬虫的大模型支持

使用 Scrapy 时&#xff0c;你可以轻松使用大型语言模型 (LLM) 来自动化或增强你的 Web 解析。 有多种使用 LLM 来帮助进行 Web 抓取的方法。在本指南中&#xff0c;我们将在每个页面上调用一个 LLM&#xff0c;从中抽取我们定义的一组属性&#xff0c;而无需编写任何选择器或…

Python和C++混淆矩阵地理学医学物理学视觉语言模型和算法模型评估工具

&#x1f3af;要点 优化损失函数评估指标海岸线检测算法评估遥感视觉表征和文本增强乳腺癌预测模型算法液体中闪烁光和切伦科夫光分离多标签分类任务性能评估有向无环图、多路径标记和非强制叶节点预测二元分类评估特征归因可信性评估马修斯相关系数对比其他准确度 Python桑…

骨传导耳机哪款好?全网最全的5大精品骨传导耳机测评报告分享

在追求高效运动体验与听觉享受的现代生活里&#xff0c;骨传导耳机以其独特的设计和创新技术吸引了众多用户的目光。相较于传统入耳式耳机&#xff0c;骨传导耳机通过振动头部骨骼而非耳膜来传输声音&#xff0c;不仅提供了更好的佩戴舒适度&#xff0c;还能在一定程度上保持对…