我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JavaScript条件式和匹配条件的技巧

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JavaScript条件式和匹配条件的技巧

本篇内容主要讲解“JavaScript条件式和匹配条件的技巧”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript条件式和匹配条件的技巧”吧!

 介绍

如果你像我一样乐于见到整洁的代码,那么你会尽可能地减少代码中的条件语句。通常情况下,面向对象编程让我们得以避免条件式,并代之以继承和多态。我认为我们应当尽可能地遵循这些原则。

正如我在另一篇文章 JavaScript 整洁代码的***实践里提到的,你写的代码不单单是给机器看的,还是给“未来的自己”以及“其他人”看的。

从另一方面来说,由于各式各样的原因,可能我们的代码最终还是会有条件式。也许是修复 bug  的时间很紧,也许是不使用条件语句会对我们的代码库造成大的改动,等等。本文将会解决这些问题,同时帮助你组织所用的条件语句。

技巧

以下是关于如何构造 if...else 语句以及如何用更少的代码实现更多功能的技巧。阅读愉快!

1. 要事***。小细节,但很重要

不要使用否定条件式(这可能会让人感到疑惑)。同时,使用条件式简写来表示 boolean  值。这个无须再强调了,尤其是否定条件式,这不符合正常的思维方式。

不好的:

const isEmailNotVerified = (email) => {  // 实现  }  if (!isEmailNotVerified(email)) {  // 做一些事...  }  if (isVerified === true) {  // 做一些事...  }

好的:

const isEmailVerified = (email) => {  // 实现  }  if (isEmailVerified(email)) {  // 做一些事...  }  if (isVerified) {  // 做一些事...  }

现在,理清了上面的事情后,我们就可以开始了。

2. 对于多个条件,使用 Array.includes

假设我们想要在函数中检查汽车模型是 renault 还是 peugeot。那么代码可能是这样的:

const checkCarModel = (model) => {  if(model === 'renault' || model === 'peugeot') {  console.log('model valid');  }  }  checkCarModel('renault'); // 输出 'model valid'

考虑到我们只有两个模型,这么做似乎也还能接受,但如果我们还想要检查另一个或者是几个模型呢?如果我们增加更多 or  语句,那么代码将变得难以维护,且不够整洁。为了让它更加简洁,我们可以像这样重写函数:

const checkCarModel = (model) => {  if(['peugeot', 'renault'].includes(model)) {  console.log('model valid');  }  }  checkCarModel('renault'); // 输出 'model valid'

上面的代码看起来已经很漂亮了。为了更进一步改善它,我们可以创建一个变量来存放汽车模型:

const checkCarModel = (model) => {  const models = ['peugeot', 'renault'];  if(models.includes(model)) {  console.log('model valid');  }  }  checkCarModel('renault'); // 输出 'model valid'

现在,如果我们想要检查更多模型,只需要添加一个新的数组元素即可。此外,如果它很重要的话,我们还可以将 models  变量定义在函数作用域外,并在需要的地方重用。这种方式可以让我们集中管理,并使维护变得轻而易举,因为我们只需在代码中更改一个位置。

3. 匹配所有条件,使用 Array.every 或者 Array.find

在本例中,我们想要检查每个汽车模型是否都是传入函数的那一个。为了以更加命令式的方式实现,我们会这么做:

const cars = [  { model: 'renault', year: 1956 },  { model: 'peugeot', year: 1968 },  { model: 'ford', year: 1977 }  ];  const checkEveryModel = (model) => {  let isValid = true;  for (let car of cars) {  if (!isValid) {  break;  }  isValid = car.model === model;  }  return isValid;  }  console.log(checkEveryModel('renault')); // 输出 false

如果你更喜欢以命令式的风格行事,上面的代码或许还不错。另一方面,如果你不关心其背后发生了什么,那么你可以重写上面的函数并使用 Array.every 或者  Array.find 来达到相同的结果。

const checkEveryModel = (model) => {  return cars.every(car => car.model === model);  }  console.log(checkEveryModel('renault')); // 输出 false

通过使用 Array.find 并做轻微的调整,我们可以达到相同的结果。两者的表现是一致的,因为两个函数都为数组中的每一个元素执行了回调,并且在找到一个  falsy 项时立即返回 false。

const checkEveryModel = (model) => {  return cars.find(car => car.model !== model) === undefined;  }  console.log(checkEveryModel('renault')); // 输出 false

4. 匹配部分条件,使用 Array.some

Array.every  匹配所有条件,这个方法则可以轻松地检查我们的数组是否包含某一个或某几个元素。为此,我们需要提供一个回调并基于条件返回一个布尔值。

我们可以通过编写一个类似的 for...loop 语句来实现相同的结果,就像之前写的一样。但幸运的是,有很酷的 JavaScript  函数可以来帮助我们完成这件事。

const cars = [  { model: 'renault', year: 1956 },  { model: 'peugeot', year: 1968 },  { model: 'ford', year: 1977 }  ];  const checkForAnyModel = (model) => {  return cars.some(car => car.model === model);  }  console.log(checkForAnyModel('renault')); // 输出 true

5. 提前返回而不是使用 if...else 分支

当我还是学生的时候,就有人教过我:一个函数应该只有一个返回语句,并且只从一个地方返回。如果细心处理,这个方法倒也还好。我这么说也就意味着,我们应该意识到它在某些情况下可能会引起条件式嵌套地狱。如果不受控制,多个分支和  if...else 嵌套将会让我们感到很痛苦。

另一方面,如果代码库很大且包含很多行代码,位于深层的一个返回语句可能会带来问题。现在我们都实行关注点分离和 SOLID  原则,因此,代码行过多这种情况挺罕见的。

举例来解释这个问题。假设我们想要显示所给车辆的模型和生产年份:

const checkModel = (car) => {  let result; // 首先,定义一个 result 变量  // 检查是否有车  if(car) {  // 检查是否有车的模型  if (car.model) {  // 检查是否有车的年份  if(car.year) {  result = `Car model: ${car.model}; Manufacturing year: ${car.year};`;  } else {  result = 'No car year';  }  } else {  result = 'No car model'  }  } else {  result = 'No car';  }  return result; // 我们的单独的返回语句  }  console.log(checkModel()); // 输出 'No car'  console.log(checkModel({ year: 1988 })); // 输出 'No car model'  console.log(checkModel({ model: 'ford' })); // 输出 'No car year'  console.log(checkModel({ model: 'ford', year: 1988 })); // 输出 'Car model: ford; Manufacturing year: 1988;'

正如你所看到的,即使本例的问题很简单,上面的代码也实在太长了。可以想象一下,如果我们有更加复杂的逻辑会发生什么事。大量的 if...else  语句。

我们可以重构上面的函数,分解成多个步骤并稍做改善。例如,使用三元操作符,包括 && 条件式等。不过,这里我直接跳到***,向你展示借助现代  JavaScript 特性和多个返回语句,代码可以有多简洁。

const checkModel = ({model, year} = {}) => {  if(!model && !year) return 'No car';  if(!model) return 'No car model';  if(!year) return 'No car year';  // 这里可以任意操作模型或年份  // 确保它们存在  // 无需更多检查  // doSomething(model);  // doSomethingElse(year);  return `Car model: ${model}; Manufacturing year: ${year};`;  }  console.log(checkModel()); // 输出 'No car'  console.log(checkModel({ year: 1988 })); // 输出 'No car model'  console.log(checkModel({ model: 'ford' })); // 输出 'No car year'  console.log(checkModel({ model: 'ford', year: 1988 })); // 输出 'Car model: ford; Manufacturing year: 1988;'

在重构版本中,我们包含了解构和默认参数。默认参数确保我们在传入 undefined 时有可用于解构的值。注意,如果传入 null  ,函数将会抛出错误。这也是之前那个方法的优点所在,因为那个方法在传入 null 的时候会输出 'No car'。

对象解构确保函数只取所需。例如,如果我们在给定车辆对象中包含额外属性,则该属性在我们的函数中是无法获取的。

根据偏好,开发者会选择其中一种方式。实践中,编写的代码通常介于两者之间。很多人觉得 if...else  语句更容易理解,并且有助于他们更为轻松地遵循程序流程。

6. 使用索引或者映射,而不是 switch 语句

假设我们想要基于给定的国家获取汽车模型。

const getCarsByState = (state) => {  switch (state) {  case 'usa':  return ['Ford', 'Dodge'];  case 'france':  return ['Renault', 'Peugeot'];  case 'italy':  return ['Fiat'];  default:  return [];  }  }  console.log(getCarsByState()); // 输出 []  console.log(getCarsByState('usa')); // 输出 ['Ford', 'Dodge']  console.log(getCarsByState('italy')); // 输出 ['Fiat']

上诉代码可以重构,完全去除 switch 语句。

const cars = new Map()  .set('usa', ['Ford', 'Dodge'])  .set('france', ['Renault', 'Peugeot'])  .set('italy', ['Fiat']);  const getCarsByState = (state) => {  return cars.get(state) || [];  }  console.log(getCarsByState()); // 输出 []  console.log(getCarsByState('usa')); //输出 ['Ford', 'Dodge']  console.log(getCarsByState('italy')); // 输出 ['Fiat']

或者,我们还可以为包含可用汽车列表的每个国家创建一个类,并在需要的时候使用。不过这个就是题外话了,本文的主题是关于条件句的。更恰当的修改是使用对象字面量。

const carState = {  usa: ['Ford', 'Dodge'],  france: ['Renault', 'Peugeot'],  italy: ['Fiat']  };  const getCarsByState = (state) => {  return carState[state] || [];  }  console.log(getCarsByState()); // 输出 []  console.log(getCarsByState('usa')); // 输出 ['Ford', 'Dodge']  console.log(getCarsByState('france')); // 输出 ['Renault', 'Peugeot']

7. 使用自判断链接和空合并

到了这一小节,我终于可以说“***”了。在我看来,这两个功能对于 JavaScript 语言来说是非常有用的。作为一个来自 C#  世界的人,可以说我经常使用它们。

在写这篇文章的时候,这些还没有得到完全的支持。因此,对于以这种方式编写的代码,你需要使用 Babel  进行编译。你可以在自判断链接这里以及在空合并这里查阅。

自判断链接允许我们在没有显式检查中间节点是否存在的时候处理树形结构,空合并可以确保节点不存在时会有一个默认值,配合自判断链接使用会有不错的效果。

让我们用一些例子来支撑上面的结论。一开始,我们还是用以前的老方法:

const car = {  model: 'Fiesta',  manufacturer: {  name: 'Ford',  address: {  street: 'Some Street Name',  number: '5555',  state: 'USA'  }  }  }  // 获取汽车模型  const model = car && car.model || 'default model';  // 获取厂商地址  const street = car && car.manufacturer && car.manufacturer.address && car.manufacturer.address.street || 'default street';  // 请求一个不存在的属性  const phoneNumber = car && car.manufacturer && car.manufacturer.address && car.manufacturer.phoneNumber;  console.log(model) // 输出 'Fiesta'  console.log(street) // 输出 'Some Street Name'  console.log(phoneNumber) // 输出 undefined

因此,如果我们想要知道厂商是否来自 USA 并将结果打印,那么代码是这样的:

const checkCarManufacturerState = () => {  if(car && car.manufacturer && car.manufacturer.address && car.manufacturer.address.state === 'USA') {  console.log('Is from USA');  }  }  checkCarManufacturerState() // 输出 'Is from USA'

我无需再赘述如果对象结构更加复杂的话,代码会多么混乱了。许多库,例如 lodash,有自己的函数作为替代方案。不过这不是我们想要的,我们想要的是在原生  js 中也能做同样的事。我们来看一下新的方法:

// 获取汽车模型  const model = car?.model ?? 'default model';  // 获取厂商地址  const street = car?.manufacturer?.address?.street ?? 'default street';  // 检查汽车厂商是否来自 USA  const checkCarManufacturerState = () => {  if(car?.manufacturer?.address?.state === 'USA') {  console.log('Is from USA');  }  }

这看起来更加漂亮和简洁,对我来说,非常符合逻辑。如果你想知道为什么应该使用 ?? 而不是 || ,只需想一想什么值可以当做 true 或者  false,你将可能有意想不到的输出。

顺便说句题外话。自判断链接同样支持 DOM API,这非常酷,意味着你可以这么做:

const value = document.querySelector('input#user-name')?.value;

到此,相信大家对“JavaScript条件式和匹配条件的技巧”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JavaScript条件式和匹配条件的技巧

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

聊聊JavaScript条件判断的使用技巧

本篇文章给大家带来了关于JavaScript的相关知识,其中主要跟大家聊一聊有关JavaScript条件判断的使用技巧,感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。
2023-05-14

JavaScript条件判断的使用技巧有哪些

本文小编为大家详细介绍“JavaScript条件判断的使用技巧有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript条件判断的使用技巧有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。假如我
2023-07-05

JavaScript条件语句优化的技巧有哪些

这篇文章主要介绍了JavaScript条件语句优化的技巧有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript条件语句优化的技巧有哪些文章都会有所收获,下面我们一起来看看吧。1、Array.i
2023-07-02

Oracle怎么使用LIKE条件匹配VARCHAR列的值

Oracle的LIKE条件可通过通配符(%、_、[]、[^])匹配VARCHAR列值。语法为SELECT*FROMtable_nameWHEREcolumn_nameLIKEpattern。实例包括匹配前缀(如Jo%),后缀(如%son),特定字符串(如Mary),包含特定字符(如%o%),不包含特定字符(如NOTLIKE%a%)以及使用转义字符(如_John)和方括号(如[S|J]mith)。最佳实践包括使用索引、避免开头或结尾使用通配符、指定转义字符和考虑使用REGEXP_LIKE进行更复杂的模式匹配
Oracle怎么使用LIKE条件匹配VARCHAR列的值
2024-05-12

触发器中条件逻辑的优化技巧

在数据库中,触发器是一种自动执行的操作,当对某个表进行插入、更新或删除操作时,它将自动执行定义在触发器中的操作。触发器中的条件逻辑是触发器行为的关键部分,优化条件逻辑可以提高触发器的性能和效率。以下是一些优化触发器中条件逻辑的技巧:简化条件
触发器中条件逻辑的优化技巧
2024-09-26

递归查询的边界条件设置技巧

在编写递归查询时,正确设置边界条件是非常重要的。边界条件用于指定递归查询的终止点,以避免无限递归。以下是一些设置递归查询边界条件的技巧:选择合适的基本情况:确保你的递归函数有一个或多个基本情况,这些情况不需要递归调用。这些基本情况将作为递归
递归查询的边界条件设置技巧
2024-09-08

聚合函数与条件筛选的结合技巧

在使用聚合函数时,可以结合条件筛选来筛选需要计算的数据,以获得更精确的结果。以下是一些结合聚合函数和条件筛选的技巧:使用IF函数进行条件筛选:在聚合函数中,可以使用IF函数来进行条件筛选,只计算符合条件的数据。比如,计算某个字段中值大于10
聚合函数与条件筛选的结合技巧
2024-08-03

Linux小技巧,一条命令实现查找文件和改名

命令如下:[root@aws ~]# mkdir jiaguwen [root@aws ~]# touch jiaguwen.txt jiaguwen2.txt jiaguwen3.txt[root@aws ~]# cd jiaguwen[
2023-06-06

如果第一次匹配条件,如何跳过切片中的值

php小编香蕉将为大家介绍如何在切片中跳过第一次匹配条件的值。在开发过程中,我们经常需要处理数组或字符串的切片,但有时候我们希望在切片中跳过满足特定条件的第一个值。这可能是因为我们只关心后续的匹配结果,或者只需要处理特定位置之后的值。接下来
如果第一次匹配条件,如何跳过切片中的值
2024-02-08

javascript条件式访问属性和箭头函数的示例分析

这篇文章主要介绍了javascript条件式访问属性和箭头函数的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、条件式访问属性?. 是ES2020引入的新特性,是一
2023-06-25

JS相等比较运算符的匹配规则及if()条件的判断

本篇文章给大家介绍一下javascript比较运算符(“===”和“==”)的匹配规则,以及if()条件的判断结果,希望对大家有所帮助!
2022-11-22

揭秘:按特定条件进行排序的pandas技巧详解

Pandas排序技巧大揭秘:如何按照特定条件进行排序,需要具体代码示例在数据处理和分析过程中,排序是一项非常常见的操作。Pandas库是Python中用于数据分析的强大工具之一,其提供了丰富的排序函数,可以根据特定条件对数据进行排序。本文
揭秘:按特定条件进行排序的pandas技巧详解
2024-01-24

编程热搜

目录