当前位置: 首页 > news >正文

写点东西《Javascript switch 语句的替代方法》

写点东西《Javascript switch 语句的替代方法》

  • 那么 switch 语句有什么问题?
  • Object Literal 查找的替代方法
  • 将我们学到的东西变成一个实用函数
  • 您需要的一切都在一个地方# [](#javascript-version) Javascript 版本
  • Tyepscript version
  • 🌟更多精彩

在这里插入图片描述

本文扩展了 Todd Motto 关于用对象字面量替换 switch 语句的想法。这是过时、笨拙且冗长的 switch 语句的一种非常简洁美观的替代方法。在本文的最后,您将获得一个基于 Todd 解决方案的实用程序函数,该函数对开发人员更加友好,因此请坚持到最后!

如果您对技术细节不感兴趣,只想了解实用程序函数,请向下滚动到最后一节(您需要的一切都在一个地方)。

那么 switch 语句有什么问题?

虽然 switch 语句在某些情况下很有用,但许多人认为它不是 Javscript 最适合其用途的设计。它不如其他结构灵活、可读和可维护。

例如,对 switch 语句的主要批评之一是其贯穿行为。如果您忘记在 case 的末尾包含 break 语句,则控制权将贯穿到下一个 case ,从而导致意外行为,如下面的示例所示。这可能会使代码更容易出错且更难维护。

switch (fruit) {case 'apple':console.log('Apple selected');// Missing break statement, falls through to the next casecase 'orange':console.log('Orange selected');break;case 'banana':console.log('Banana selected');break;default:console.log('Unknown fruit');
}

在这个示例中,如果 fruit 为 'apple' ,则 "Apple selected""Orange selected" 都将被记录。

Object Literal 查找的替代方法

switch 语句相比,Object Literal 更灵活、更具表现力。

以下是如何使用它们仅返回 string 值。

const getDate (unit) {var date = {'year': '2024','month': 'January','day': '21','default': 'Default value'};return (date[unit] || date['default']);
}var month = getDate('month');
console.log(month); // January

有时我们需要编写更复杂的代码,而仅返回 string 是不够的。我们可以进一步改进上述代码,在其中使用函数而不是字符串,以便我们可以包含更复杂的代码。

const getDate (unit) {var date = {'year': () => {// do more complicated stuff here// just returning a string in this casereturn '2024';},'month': () => {return 'January';},'day': () => {return '21';},'default': () => {return 'Default value'}};// we return the Object literal's function invokedreturn (date[unit] || date['default'])();
}var month = getDate('month');
console.log(month); // January

但是如果我们想要一个贯穿行为呢?我们可以轻松地使用对象字面量来实现这一点,它更具可读性、声明性和更不易出错。它还不会涉及添加或删除 break ,而这是我们正在寻找的。

const getDayType (day) {const isWeekDay = () => {return 'Weekday';}const isWeekEnd = () => {return 'Weekend';}var days = {'monday': isWeekDay,'tuesday': isWeekDay,'wednesday': isWeekDay,'thursay': isWeekDay,'friday': isWeekDay,'saturday': isWeekEnd,'sunday': isWeekEnd,  'default': () => {return 'Default value'}};// we return the Object literal's function invoked  return (days[day] || days['default'])();
}var dayType = getDayType('sunday');
console.log(dayType); // WeekEnd

将我们学到的东西变成一个实用函数

既然我们已经学会了如何使用 Object Literal 而不是 switch ,那么让我们根据学到的知识构建一个实用函数,以进一步简化我们的生活。

我们称我们的函数为 switchCase 。它接收一个具有 2 个属性的对象: casesdefaultCase 。Cases 是将容纳我们案例的对象字面量,而 defaultCase 是…嗯,默认案例。

const switchCase = ({cases, defaultCase}) {}

switchCase 是一个返回回调函数的高阶函数。回调函数接收 switch 表达式。

const switchCase = ({cases, defaultCase}) {return (expression) => {}
}

现在,回调函数需要做的就是返回调用的对象字面量函数。

const switchCase = ({cases, defaultCase}) {return (expression) => {return (cases[expression] || defaultCase)();}
}

就是这样!现在让我们看一个如何使用它的示例。

let date = new Date()const today = switchCase({cases: {year: () => date.getFullYear(),month: () => date.getMonth() + 1,day: () => date.getDate()},defaultCase: () => date
})today('year') // current year
today('month') // current month
today('day') // current day
today('century') // default case - returns the current date Object

对于 typescript 用户,我们可以利用泛型来允许以后要调用该函数的用户指定他们希望对象字面量函数返回的类型。

type SwitchCase<T> = {cases: {[key: string]: () => T},defaultCase: () => T
} const switchCase = <T,>({cases, defaultCase}: SwitchCase<T>) => {return (expression: string) => {return (cases[expression] || defaultCase)()}
}

这就是我们如何使用它的方式。请注意,我们不必总是指定类型,因为 Typescript 会自动推断它,除非它是多个类型的联合,如下所示。

let date = new Date()const today = switchCase<number | Date>({cases: {year: () => date.getFullYear(),month: () => date.getMonth() + 1,day: () => date.getDate()},defaultCase: () => date
})today('year') // current year
today('month') // current month
today('day') // current day
today('century') // default case - returns the current date Object

您需要的一切都在一个地方# Javascript 版本

实用程序函数:

const switchCase = ({cases, defaultCase}) => (expression) => (cases[expression] || defaultCase)()

用法: Tyepscript 版本

let date = new Date()const today = switchCase({cases: {year: () => date.getFullYear(),month: () => date.getMonth() + 1,day: () => date.getDate()},defaultCase: () => date
})today('year') // current year
today('month') // current month
today('day') // current day
today('century') // default case - returns the current date Object

Tyepscript version

实用功能:

const switchCase = <T,>({cases, defaultCase}: {cases: {[key: string]: () => T}, defaultCase: () => T}) => (expression: string) => (cases[expression] || defaultCase)()

用法:

let date = new Date()const today = switchCase<number | Date>({cases: {year: () => date.getFullYear(),month: () => date.getMonth() + 1,day: () => date.getDate()},defaultCase: () => date
})today('year') // current year
today('month') // current month
today('day') // current day
today('century') // default case - returns the current date Object

🌟更多精彩

点击👉这里~~

相关文章:

写点东西《Javascript switch 语句的替代方法》

写点东西《Javascript switch 语句的替代方法》 那么 switch 语句有什么问题&#xff1f; Object Literal 查找的替代方法 将我们学到的东西变成一个实用函数 您需要的一切都在一个地方# [](#javascript-version) Javascript 版本Tyepscript version&#x1f31f;更多精彩 本文…...

python学习笔记10(循环结构2)

&#xff08;一&#xff09;循环结构2 1、扩展模式 语法&#xff1a; for 循环变量 in 遍历对象&#xff1a; 语句块1 else: 语句块2 说明&#xff1a;else在循环结束后执行&#xff0c;通常和break和continue结合使用 2、无限循环while while 表达式&#xff1a; 语句块…...

Codefroces 191A - Dynasty Puzzles

思路 d p dp dp d p i , j dp_{i,j} dpi,j​ 表示以 i i i 开始以 j j j 结尾的最长长度。方程&#xff1a; d p j , r m a x ( d p j , l , d p j , l l e n g t h l , r ) dp_{j,r}max(dp_{j,l}\;,\;dp_{j,l}length_{l,r}) dpj,r​max(dpj,l​,dpj,l​lengthl,r​) 有点区…...

HIVE中关联键类型不同导致数据重复,以及数据倾斜

比如左表关联键是string类型&#xff0c;右表关联键是bigint类型&#xff0c;关联后会出现多条的情况 解决方案&#xff1a; 关联键先统一转成string类型再进行关联 原因&#xff1a; 根据HIVE版本不同&#xff0c;数据位数上限不同&#xff0c; 低版本的超过16位会出现这种…...

CRM系统是如何解决企业的痛点的?

在当今竞争激烈的商业世界中&#xff0c;客户关系管理&#xff08;CRM&#xff09;数字化转型已经成为大企业成功的重要秘诀。大型跨国公司如亚马逊、苹果和微软等已经在CRM数字化方面走在了前列&#xff0c;实现了高度个性化的客户体验&#xff0c;加强了客户忠诚度。 然而&a…...

系统架构14 - 软件工程(2)

需求工程 需求工程软件需求两大过程三个层次业务需求(business requirement)用户需求(user requirement)功能需求 (functional requirement)非功能需求 概述活动阶段需求获取基本步骤获取方法 需求分析三大模型数据流图数据字典DD需求定义方法 需求验证需求管理需求基线变更控制…...

vue封装接口

目录 封装接口前缀 配置逻辑 接口存放文件 配置代理 获取数据方法 封装接口前缀 config.js const serverConfig {baseURL: "https://xxx.xxxxxxxx.com/api", // 请求基础地址,可根据环境自定义useTokenAuthorization: false, // 是否开启 token 认证};export …...

Dell戴尔XPS 8930笔记本电脑原装Win10系统 恢复出厂预装OEM系统

链接&#xff1a;https://pan.baidu.com/s/1eaTQeX-LnPJwWt3fBJD8lg?pwdajy2 提取码&#xff1a;ajy2 原厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、MyDell等预装程序 文件格式&#xff1a;esd/wim/swm 安装方式&am…...

elasticsearch的拼音分词器安装

安装拼音分词器 第一步&#xff1a;下载 要实现根据字母做补全&#xff0c;就必须对文档按照拼音分词。在 GitHub 上恰好有 elasticsearch 的拼音分词插件。地址&#xff1a; 仓管的主页&#xff1a; https://github.com/infinilabs/analysis-pinyin 仓管的版本页 https:…...

2024阿里云优惠,云服务器61元一年起

2024年最新阿里云主机价格&#xff0c;最低配置2核2G3M起步&#xff0c;只要61元一年&#xff0c;还可以在阿里云CLUB中心领券 aliyun.club 专用满减优惠券。 1、云服务器ECS经济型e实例2核2G、3M固定带宽99元一年 2、轻量应用服务器2核2G3M带宽轻量服务器一年61元 3、阿里云轻…...

基于SpringBoot+Vue实现的社区养老管理平台(源码+数据库脚本+设计文档+部署视频)

系统介绍 基于SpringBootVue实现的社区养老服务管理平台采用springboot以及vue框架技术&#xff0c;实现了社区养老管理系统&#xff0c;实现了对养老院的员工、管理员对入住的老人及其健康档案实现信息化管理。 技术选型 开发工具&#xff1a;idea2020.3Webstorm2020.3(其他…...

【漏洞复现】CloudPanel makefile接口远程命令执行漏洞(CVE-2023-35885)

文章目录 前言声明一、CloudPanel 简介二、漏洞描述三、影响版本四、漏洞复现五、修复建议 前言 CloudPanel 是一个基于 Web 的控制面板或管理界面&#xff0c;旨在简化云托管环境的管理。它提供了一个集中式平台&#xff0c;用于管理云基础架构的各个方面&#xff0c;包括 &a…...

【Spring Boot 3】【Redis】集成Redisson

【Spring Boot 3】【Redis】集成Redisson 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花…...

YOLOv8改进 | Conv篇 | 2024.1月最新成果可变形卷积DCNv4(适用检测、Seg、分类、Pose、OBB)

一、本文介绍 本文给大家带来的改进机制是2024-1月的最新成果DCNv4,其是DCNv3的升级版本,效果可以说是在目前的卷积中名列前茅了,同时该卷积具有轻量化的效果!一个DCNv4参数量下降越15Wparameters左右,。它主要通过两个方面对前一版本DCNv3进行改进:首先,它移除了空间聚…...

理解反向代理

反向代理是一个不可或缺的组件。 它在客户端和服务器之间充当中介&#xff0c;提高了安全性、负载平衡和应用性能。 一、反向代理简介 反向代理是一种服务器&#xff0c;它位于客户端和后端服务器之间。与常见的&#xff08;正向&#xff09;代理不同&#xff0c;反向代理代表…...

Haar小波下采样模块

论文原址&#xff1a;Haar wavelet downsampling: A simple but effective downsampling module for semantic segmentation - ScienceDirect 原文代码&#xff1a;HWD/HWD.py at main apple1986/HWD (github.com) 介绍 深度卷积神经网络 &#xff08;DCNN&#xff09; 通…...

k8s的包管理工具helm

Helm是什么? 之前的这篇文章介绍了一开始接触k8s的时候接触到的几个命令工具 kubectl&kubelet&rancher&helm&kubeadm这几个命令行工具是什么关系&#xff1f;-CSDN博客 Helm 是一个用于管理和部署 Kubernetes 应用程序的包管理工具。它允许用户定义、安装和…...

《WebKit 技术内幕》学习之八(1):硬件加速机制

《WebKit 技术内幕》之八&#xff08;1&#xff09;&#xff1a;硬件加速机制 1 硬件加速基础 1.1 概念 这里说的硬件加速技术是指使用GPU的硬件能力来帮助渲染网页&#xff0c;因为GPU的作用主要是用来绘制3D图形并且性能特别好&#xff0c;这是它的专长所在&#xff0c;它…...

【Linux对磁盘进行清理、重建、配置文件系统和挂载,进行系统存储管理调整存储结构】

Linux 调整存储结构 前言一、查看磁盘和分区列表二、创建 ext4 文件系统&#xff0c;即&#xff1a;格式化分区为ext4文件系统。1.使用命令 mkfs.ext4 (make file system)报错如下&#xff1a;解决办法1&#xff1a;&#xff08;经测试&#xff0c;不采用&#xff09;X解决办法…...

RT-DETR算法优化改进:DCNv4更快收敛、更高速度、更高性能,效果秒杀DCNv3、DCNv2等 ,助力检测

💡💡💡本文独家改进:DCNv4更快收敛、更高速度、更高性能,完美和RT-DETR结合,助力涨点 DCNv4优势:(1) 去除空间聚合中的softmax归一化,以增强其动态性和表达能力;(2) 优化存储器访问以最小化冗余操作以加速。这些改进显著加快了收敛速度,并大幅提高了处理速度,DC…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

go 里面的指针

指针 在 Go 中&#xff0c;指针&#xff08;pointer&#xff09;是一个变量的内存地址&#xff0c;就像 C 语言那样&#xff1a; a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10&#xff0c;通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...