如何给 JavaScript 函数添加参数校验?

在 JavaScript 中,对函数参数进行校验是确保代码健壮性和防止错误的重要手段。参数校验不仅能提高代码的可读性,还能帮助捕获潜在的错误。下面,我们将结合实际项目代码示例,讲解如何给 JavaScript 函数添加参数校验。

常见的参数校验方式

  1. 基本类型校验:校验参数的类型是否符合预期。
  2. 参数值范围校验:校验参数值是否在指定范围内。
  3. 参数个数校验:校验传入的参数个数是否正确。
  4. 自定义校验:对更复杂的业务逻辑进行校验。

示例 1:基本类型校验

假设我们有一个函数,要求传入的参数是一个数字:

function square(number) {// 参数类型校验if (typeof number !== 'number') {throw new Error('参数必须是数字');}return number * number;
}// 调用
console.log(square(4));   // 输出: 16
console.log(square('4')); // 抛出错误: 参数必须是数字

解释: 我们使用 typeof 来检查传入的 number 是否为数字类型。如果不是数字类型,抛出一个错误,提示开发者进行修正。

示例 2:参数个数校验

假设我们有一个函数,它期望两个参数:一个数字和一个字符串:

function greet(name, age) {// 参数个数校验if (arguments.length !== 2) {throw new Error('必须传入两个参数:名字和年龄');}// 参数类型校验if (typeof name !== 'string' || typeof age !== 'number') {throw new Error('第一个参数应该是字符串,第二个参数应该是数字');}console.log(`Hello ${name}, you are ${age} years old.`);
}// 调用
greet('Alice', 30);       // 输出: Hello Alice, you are 30 years old.
greet('Alice');           // 抛出错误: 必须传入两个参数:名字和年龄
greet('Alice', '30');     // 抛出错误: 第一个参数应该是字符串,第二个参数应该是数字

解释: 我们使用 arguments.length 来检查传入参数的个数。如果参数个数不符合预期,就抛出错误。然后,我们进一步使用 typeof 来检查每个参数的类型。

示例 3:参数值范围校验

假设我们有一个函数,它要求传入的数字在特定范围内:

function setAge(age) {// 参数类型校验if (typeof age !== 'number') {throw new Error('参数必须是数字');}// 参数值范围校验if (age < 0 || age > 120) {throw new Error('年龄必须在 0 到 120 之间');}console.log(`Your age is set to ${age}`);
}// 调用
setAge(25);    // 输出: Your age is set to 25
setAge(150);   // 抛出错误: 年龄必须在 0 到 120 之间
setAge(-5);    // 抛出错误: 年龄必须在 0 到 120 之间

解释: 我们首先检查传入参数是否为数字类型,然后验证 age 是否在合法的范围内(0 到 120)。如果不在范围内,就抛出错误。

示例 4:复杂的自定义校验

在一些更复杂的场景中,可能需要对参数进行更复杂的校验,比如正则表达式验证、对象结构校验等。例如,一个要求传入邮箱地址的函数:

function setEmail(email) {// 参数类型校验if (typeof email !== 'string') {throw new Error('参数必须是字符串');}// 正则表达式校验邮箱格式const emailRegex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;if (!emailRegex.test(email)) {throw new Error('无效的邮箱地址');}console.log(`Your email is set to ${email}`);
}// 调用
setEmail('alice@example.com');  // 输出: Your email is set to alice@example.com
setEmail('alice.com');          // 抛出错误: 无效的邮箱地址

解释: 我们使用正则表达式来校验邮箱的格式是否正确。正则表达式非常适合用于对字符串进行格式校验。

示例 5:结合解构的参数校验

在现代 JavaScript 中,我们常常使用解构赋值来传递多个参数。如果参数较多,解构赋值使得代码更加简洁,但也需要进行相应的参数校验:

function createUser({ name, age, email }) {// 参数解构与类型校验if (typeof name !== 'string') {throw new Error('name 必须是字符串');}if (typeof age !== 'number' || age < 0 || age > 120) {throw new Error('age 必须是数字,且在 0 到 120 之间');}if (typeof email !== 'string' || !email.includes('@')) {throw new Error('email 必须是有效的邮箱地址');}console.log(`User created: ${name}, ${age}, ${email}`);
}// 调用
createUser({ name: 'Alice', age: 30, email: 'alice@example.com' });  // 输出: User created: Alice, 30, alice@example.com
createUser({ name: 'Alice', age: -5, email: 'alice@example.com' });  // 抛出错误: age 必须是数字,且在 0 到 120 之间
createUser({ name: 'Alice', age: 30, email: 'aliceexample.com' });  // 抛出错误: email 必须是有效的邮箱地址

解释: 通过解构,我们可以方便地提取传入的参数,并进行一系列的校验。每个参数的类型和有效性都需要进行校验,如果不符合要求,就抛出相应的错误。

使用外部库进行参数校验

除了手动编写校验逻辑,我们还可以使用一些流行的外部库来简化参数校验的过程。例如,JoiYup 等库可以帮助我们更加方便地进行数据验证。

示例 6:使用 Joi 进行参数校验
const Joi = require('joi');const schema = Joi.object({name: Joi.string().min(3).max(30).required(),age: Joi.number().integer().min(0).max(120).required(),email: Joi.string().email().required()
});function createUser(data) {const { error } = schema.validate(data);if (error) {throw new Error(error.details[0].message);}console.log('User created:', data);
}// 调用
createUser({ name: 'Alice', age: 30, email: 'alice@example.com' }); // User created: { name: 'Alice', age: 30, email: 'alice@example.com' }
createUser({ name: 'Al', age: 150, email: 'alice@example.com' });   // 抛出错误: "age" must be less than or equal to 120

解释: 通过 Joi,我们可以定义一个模式并验证数据。Joi 提供了丰富的功能,允许我们进行多种类型的校验,并返回详细的错误信息。

总结

通过这些方法,我们可以有效地为 JavaScript 函数添加参数校验,确保函数在执行时接收到有效且符合要求的参数:

  1. 基本类型校验:使用 typeofinstanceof 进行类型检查。
  2. 参数个数校验:通过 arguments.length 检查传入的参数个数。
  3. 参数值范围校验:验证参数是否在有效的范围内。
  4. 自定义校验:使用正则表达式等方式进行格式或值的校验。
  5. 解构赋值校验:对解构后的参数进行类型检查。
  6. 外部库:使用如 JoiYup 等库进行更复杂的校验。

通过这些校验,可以避免许多潜在的错误,使代码更加健壮且易于维护。

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

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

相关文章

php7.4安装pg扩展-contos7

今天接到一个需求&#xff0c;就是需要用thinkphp6链接pg(postgresql)数据库。废话不多说&#xff0c;直接上操作步骤 一、安装依赖 yum install -y sqlite-devel libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libcurl libcurl-devel libjpeg libjpeg-dev…

CentOS7.X 安装RustDesk自建服务器实现远程桌面控制

参照文章CentOS安装RustDesk自建服务器中间总有几个位置出错&#xff0c;经实践做个记录防止遗忘 一 环境&工具准备 1.1 阿里云轻量服务器、Centos7系统、目前最高1.1.11版本rustdesk-server-linux-amd64.zip 1.2 阿里云轻量服务器–安全组–开放端口&#xff1a;TCP(21…

TCP Analysis Flags 之 TCP Spurious Retransmission

前言 默认情况下&#xff0c;Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态&#xff0c;并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时&#xff0c;会对每个 TCP 数据包进行一次分析&#xff0c;数据包按照它们在数据包列表中出现的顺序进行处理。可…

Java线程的interrupt中断、wait-notify/all(源码级分析)

实例方法&#xff1a; interrupt()方法是设置结束阻塞(sleep、wait等)&#xff0c;并且设置中断标记true isInterrupted()判断当前是否中断 静态方法&#xff1a; Thread.interrupted():调用这个方法的线程中断标记位还原为false 那么好&#xff0c;既然上面的方法作用是清…

Burp Suite 实战指南:Proxy 捕获与修改流量、HTTP History 筛选与分析

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

12月第1周AI资讯

阅读时间:3-4min 更新时间:2024.12.2-2024.12.6 目录 OpenAI CEO Sam Altman 预告“12天OpenAI”系列活动 腾讯HunyuanVideo:130亿参数的开源视频生成模型 李飞飞的World Labs发布空间智能技术预览版 中科院联手腾讯打造“AI带货王”AnchorCrafter OpenAI CEO Sam Alt…

从零开始学TiDB(1) 核心组件架构概述

首先TiDB深度兼容MySQL 5.7 1. TiDB Server SQL语句的解析与编译&#xff1a;首先一条SQL语句最先到达的地方是TiDB Server集群&#xff0c;TiDB Server是无状态的&#xff0c;不存储数据&#xff0c;SQL 发过来之后TiDB Server 负责 解析&#xff0c;优化&#xff0c;编译 这…

记录一次使用git无权限的问题排查

正常的配置了公私钥之后&#xff0c;在gitlab中也存储了配对的公钥&#xff0c;但当使用git clone 时&#xff0c;总是报无权限 由于在这台机器中添加了多个公私钥&#xff0c;有点复杂&#xff0c;我们可以使用命令 ssh -vvvT 调试一下 ssh -vvvT yourGitlabAddr

python调用GPT-4o实时音频 Azure OpenAI GPT-4o Audio and /realtime

发现这块网上信息很少&#xff0c;记录一下 微软azure入口 https://learn.microsoft.com/zh-cn/azure/ai-services/openai/realtime-audio-quickstart?pivotsprogramming-language-ai-studio sdk文档 https://github.com/azure-samples/aoai-realtime-audio-sdk?tabread…

fastadmin 后台插件制作方法

目录 一&#xff1a;开发流程 二&#xff1a;开发过程 &#xff08;一&#xff09;&#xff1a;后台功能开发 &#xff08;二&#xff09;&#xff1a;功能打包到插件目录 &#xff08;三&#xff09;&#xff1a;打包插件 &#xff08;四&#xff09;&#xff1a;安装插件…

Kafka单机及集群部署及基础命令

目录 一、 Kafka介绍1、kafka定义2、传统消息队列应用场景3、kafka特点和优势4、kafka角色介绍5、分区和副本的优势6、kafka 写入消息的流程 二、Kafka单机部署1、基础环境2、iptables -L -n配置3、下载并解压kafka部署包至/usr/local/目录4、修改server.properties5、修改/etc…

Docker部署的gitlab升级的详细步骤(升级到17.6.1版本)

文章目录 一、Gitlab提示升级信息二、老版本的docker运行gitlab命令三、备份老版本Gitlab数据四、确定升级路线五、升级(共分3个版本升级)5.1 升级第一步(17.1.2 > 17.3.7)5.2 升级第二步(17.3.7 > 17.5.3)5.3 升级第三步(17.5.3 > 17.6.1) 六、web端访问gitlab服务 一…

在Java的xml的sql语句里面的某一个参数是list集合的时候

经常在Java里面&#xff0c;遇到这样的问题&#xff0c;sql的一个查询语句&#xff0c;它的某一个参数是一个List集合&#xff0c;然而&#xff0c;在xml.mapper文件里面的时候&#xff0c;不知道如何去组成这个查询语句&#xff0c;不知道兄弟们是否经常忘记如何去写这个语句&…

前端技术(23) : 聊天页面

来源: GPT生成之后微调 效果图 HTML代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>聊天</t…

内存图及其画法

所有的文件都存在硬盘上&#xff0c;首次使用的时候才会进入内存 进程&#xff1a;有自己的Main方法&#xff0c;并且依赖自己Main运行起来的程序。独占一块内存区域&#xff0c;互不干扰。内存中有一个一个的进程。 操作系统只认识c语言。操作系统调度驱动管理硬件&#xff0…

树与图深度优先遍历——acwing

题目一&#xff1a;树的重心 846. 树的重心 - AcWing题库 分析 采用暴力枚举&#xff0c;试探每个点&#xff0c;除去之后&#xff0c;连通分量最大值是多少&#xff0c; 各个点的最大值找最小的 因为可以通过 dfs 来得到 根u以下点数&#xff0c;以及可以求各分树的点数&am…

Qt Qtablewidget 标题 QHeaderView 增加可选框 QcheckBox

创建自定义QHeaderView #pragma once#include <QObject> #include <QHeaderView> #include <QPainter> #include <QMouseEvent>class SSHeaderView : public QHeaderView {Q_OBJECTprivate:bool isChecked;int m_checkColIdx; public:SSHeaderView(i…

Data Uncertainty Learning in Face Recognition 论文阅读

Data Uncertainty Learning in Face Recognition 论文阅读 Abstract1. Introduction2. Related Work3. Methodology3.1. Preliminaries3.2. Classification-based DUL for FR3.3. Regression-based DUL for FR3.4. Discussion of Related Works 4. Experiments4.1. Datasets an…

基础算法——搜索与图论

搜索与图论 图的存储方式2、最短路问题2.1、Dijkstra算法&#xff08;朴素版&#xff09;2.2、Dijkstra算法&#xff08;堆优化版&#xff09;2.3、Bellman-Ford算法2.4、SPFA求最短路2.5、SPFA判负环2.6、Floyd算法 图的存储方式 2、最短路问题 最短路问题可以分为单源最短路…

典型常见的知识蒸馏方法总结一

来源&#xff1a;https://github.com/HobbitLong/RepDistiller收录的方法 NeurIPS2015: Distilling the Knowledge in a Neural Network 知识蒸馏开山之作&#xff0c;从logits中蒸馏知识&#xff0c;KL散度损失 ICLR2015&#xff1a;FitNets: Hints for Thin Deep Nets A h…