【JavaScript】5个技巧让你更好的编写 JavaScript(ES6) 的条件语句

JavaScript 中的类与继承:从 ES5 到 ES6 在 JavaScript 中,类(Class)是用于创建对象的蓝图或模板。类通过 class 关键字定义,并且可以包含构造函数(constructor)以及其他方法。构造函数是用于初始化新创建对象的特殊方法。类的引入使得 JavaScript 的面向对象编程更加直观和结构化。 阅读详情

使用 JavaScript 时,我们经常需要处理很多条件语句,这里分享5个小技巧,可以让你编写更好/更清晰的条件语句。

1.使用 Array.includes 来处理多个条件

我们来看看下面的例子:

// condition
function test(fruit) {
  if (fruit == 'apple' || fruit == 'strawberry') {
    console.log('red');
  }
}

乍一看,上面的例子看起来似乎没什么问题。 但是,如果我们还有更多的红色水果呢?比如樱桃(cherry)和蔓越莓(cranberries)。 我们是否要用更多的 || 操作符来扩展该语句呢?

我们可以使用 Array.includes 重写上面的条件语句。

function test(fruit) {
  // 条件提取到数组中
  const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];

  if (redFruits.includes(fruit)) {
    console.log('red');
  }
}

我们将红色水果(条件)提取到一个数组中。这样做,可以让代码看起来更整洁。

2.减少嵌套,提前使用 return 语句

让我们扩展前面的示例,再包含另外两个条件:

  • 如果没有提供水果,抛出错误

  • 接受水果 quantity(数量)参数,如果超过 10,则并打印相关信息。

    function test(fruit, quantity) {
    const redFruits = [‘apple’, ‘strawberry’, ‘cherry’, ‘cranberries’];

    // 条件 1:fruit 必须有值
    if (fruit) {
      // 条件 2:必须为红色
      if (redFruits.includes(fruit)) {
        console.log('red');
    
        // 条件 3:数量必须大于 10
        if (quantity > 10) {
          console.log('big quantity');
        }
      }
    } else {
      throw new Error('No fruit!');
    }
    

    }

    // 测试结果
    test(null); // 抛出错误:No fruits
    test(‘apple’); // 打印:red
    test(‘apple’, 20); // 打印:red,big quantity

看看上面的代码,我们有:

– 1 个 if / else 语句过滤掉无效条件

– 3 层 if 语句嵌套(分别是条件1,2和3)

我个人遵循的一般规则是 在发现无效条件时提前 return。

/* 在发现无效条件时提前 return */

function test(fruit, quantity) {
  const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];

  // 条件 1:提前抛出错误
  if (!fruit) throw new Error('No fruit!');

  // 条件2:必须为红色
  if (redFruits.includes(fruit)) {
    console.log('red');

    // 条件 3:数量必须大于 10
    if (quantity > 10) {
      console.log('big quantity');
    }
  }
}

这样做,我们可以减少一个嵌套层级。 这种编码风格很好,特别是当你的 if 语句很长时(想象一下,你需要滚动到最底部才知道那里有一个 else 语句,这样代码的可读性就变得很差了)。

如果通过反转条件并提前 return ,我们可以进一步减少嵌套。 请查看下面的条件 2 ,看看我们是如何做到的:

/* 在发现无效条件时提前 return */

function test(fruit, quantity) {
  const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];

  if (!fruit) throw new Error('No fruit!'); // 条件 1:提前抛出错误
  if (!redFruits.includes(fruit)) return;  // 条件 2:当 fruit 不是红色的时候,提前 return

  console.log('red');

  // 条件 3:必须是大量存在
  if (quantity > 10) {
    console.log('big quantity');
  }
}

通过反转条件2的条件,我们的代码现在没有嵌套语句了。 当我们有很长的逻辑代码时,这种技巧非常有用,我们希望在条件不满足时停止下一步的处理。

然而,这并不是严格的规定。问问自己,这个版本(没有嵌套)是否要比前一个版本(条件 2 有嵌套)的更好、可具可读性?

对我来说,我会选择前一个版本(条件 2 有嵌套)。 这是因为:

  • 代码简短直接,嵌套 if 更清晰
  • 反转条件可能会引发更多的思考过程(增加认知负担)

因此,始终追求更少的嵌套,提前 return,但是不要过度。但不要过度。如果您感兴趣,这里有一篇文章和 StackOverflow 的讨论, 进一步讨论这个话题:

3.使用函数的默认参数 和 解构

我想下面的代码可能看起来很熟悉,我们在使用 JavaScript 时总是需要检查 null / undefined 值并分配默认值:

function test(fruit, quantity) {
  if (!fruit) return;
  const q = quantity || 1; // 如果没有提供 quantity 参数,则默认为 1

  console.log(`We have ${q} ${fruit}!`);
}

// 测试结果
test('banana'); // We have 1 banana!
test('apple', 2); // We have 2 apple!

实际上,我们可以通过分配默认函数参数来消除变量 q 。

function test(fruit, quantity = 1) { // i如果没有提供 quantity 参数,则默认为 1
  if (!fruit) return;
  console.log(`We have ${quantity} ${fruit}!`);
}

// 测试结果
test('banana'); // We have 1 banana!
test('apple', 2); // We have 2 apple!

更简单直观不是吗? 请注意,每个函数参数都有自己的默认值。 例如,我们也可以为 fruit 分配一个默认值:function test(fruit = 'unknown', quantity = 1)。

注:如果你还不了解 ES6 中函数默认参数的新特性,可以查看 JavaScript 函数中默认参数 了解更多详情。

如果我们的 fruit 是一个 Object 对象怎么办? 我们可以指定默认参数吗?

function test(fruit) { 
  // 如果有值,则打印 fruit.name
  if (fruit && fruit.name)  {
    console.log (fruit.name);
  } else {
    console.log('unknown');
  }
}

//测试结果
test(undefined); // unknown
test({ }); // unknown
test({ name: 'apple', color: 'red' }); // apple

看看上面的例子,我们想要的是如果 fruit.name 可用则打印水果名称,否则将打印 unknown 。我们可以使用默认函数参数和解构(destructing) 来避免 fruit && fruit.name 这样的检查。

// 解构 —— 只获得 name 属性
// 参数默认分配空对象 {}
function test({name} = {}) {
  console.log (name || 'unknown');
}

//测试结果
test(undefined); // unknown
test({ }); // unknown
test({ name: 'apple', color: 'red' }); // apple

由于我们只需要来自 fruit 的 name 属性,我们可以使用 {name} 来解构参数,然后我们可以在代码中使用 name 作为变量来取代fruit.name。

我们还将空对象 {} 指定为默认值。 如果我们不这样做,你将在执行行测试时遇到test(undefined) – Cannot destructure property name of 'undefined' or 'null'.(无法解析’undefined’或’null’的属性名称)。 因为 undefined中 没有 name 属性。

如果您不介意使用第三方库,有几种方法可以减少空检查:

  • 使用 Lodash get 函数
  • 使用 Facebook 开源的 idx 库(需搭配 Babeljs)

注:如果你还不了解 ES6 中 destructure(解构) 的新特性,可以查看 https://www.html.cn/archives/tag/解构 这些文章了解更多详情。

以下是使用Lodash的示例:

// 引入 lodash 库,我们将获得 _.get()
function test(fruit) {
  console.log(_.get(fruit, 'name', 'unknown'); // 获取 name 属性,如果没有分配,则设为默认值 unknown
}

//测试结果
test(undefined); // unknown
test({ }); // unknown
test({ name: 'apple', color: 'red' }); // apple

您可以在这里 运行演示代码 。此外,如果你喜欢函数式编程(FP),您可以选择使用Lodash fp ,Lodash的函数式能版本(方法名更改为 get 或 getOr)。

4.选择 Map / Object 字面量,而不是Switch语句

让我们看看下面的例子,我们想根据颜色打印水果:

function test(color) {
  // 使用 switch case 语句,根据颜色找出对应的水果
  switch (color) {
    case 'red':
      return ['apple', 'strawberry'];
    case 'yellow':
      return ['banana', 'pineapple'];
    case 'purple':
      return ['grape', 'plum'];
    default:
      return [];
  }
}

//测试结果
test(null); // []
test('yellow'); // ['banana', 'pineapple']

上面的代码似乎没有错,但我觉得它很冗长。使用具有更清晰语法的 object 字面量可以实现相同的结果:

// 使用对象字面量,根据颜色找出对应的水果
  const fruitColor = {
    red: ['apple', 'strawberry'],
    yellow: ['banana', 'pineapple'],
    purple: ['grape', 'plum']
  };

function test(color) {
  return fruitColor[color] || [];
}

或者,您可以使用 Map 来实现相同的结果:

// 使用 Map ,根据颜色找出对应的水果
  const fruitColor = new Map()
    .set('red', ['apple', 'strawberry'])
    .set('yellow', ['banana', 'pineapple'])
    .set('purple', ['grape', 'plum']);

function test(color) {
  return fruitColor.get(color) || [];
}

Map 是 ES2015(ES6) 引入的新的对象类型,允许您存储键值对。

我们是不是应该禁止使用 switch 语句呢? 不要局限于此。 就个人而言,我尽可能使用对象字面量,但我不会设置硬规则来阻止使用 switch ,是否使用应该根据你的场景而决定。

Todd Motto 有一篇文章深入地研究了 switch语句与对象字面量,你可以在 这里 阅读。

重构语法

对于上面的示例,我们实际上可以使用 Array.filter 来重构我们的代码,以实现相同的结果。

 const fruits = [
    { name: 'apple', color: 'red' }, 
    { name: 'strawberry', color: 'red' }, 
    { name: 'banana', color: 'yellow' }, 
    { name: 'pineapple', color: 'yellow' }, 
    { name: 'grape', color: 'purple' }, 
    { name: 'plum', color: 'purple' }
];

function test(color) {
  // 使用 Array filter  ,根据颜色找出对应的水果

  return fruits.filter(f => f.color == color);
}

总有不止一种方法可以达到相同的效果。对于这个例子我们展示了 4 种实现方法。编码很有趣!

5. 使用 Array.every 和 Array.some 来处理全部/部分满足条件

最后一个小技巧更多地是利用新的(但不是那么新的)Javascript Array函数来减少代码行。查看下面的代码,我们想检查所有水果是否都是红色的:

const fruits = [
    { name: 'apple', color: 'red' },
    { name: 'banana', color: 'yellow' },
    { name: 'grape', color: 'purple' }
  ];

function test() {
  let isAllRed = true;

  // 条件:所有的水果都必须是红色
  for (let f of fruits) {
    if (!isAllRed) break;
    isAllRed = (f.color == 'red');
  }

  console.log(isAllRed); // false
}

代码太长了!我们可以使用 Array.every 减少行数:

const fruits = [
    { name: 'apple', color: 'red' },
    { name: 'banana', color: 'yellow' },
    { name: 'grape', color: 'purple' }
  ];

function test() {
  // 条件:简短方式,所有的水果都必须是红色
  const isAllRed = fruits.every(f => f.color == 'red');

  console.log(isAllRed); // false
}

干净多了对吧?类似的,如果我们想要检查是否有至少一个水果是红色的,我们可以使用 Array.some 仅用一行代码就实现出来。

const fruits = [
    { name: 'apple', color: 'red' },
    { name: 'banana', color: 'yellow' },
    { name: 'grape', color: 'purple' }
];

function test() {
  // 条件:是否存在红色的水果
  const isAnyRed = fruits.some(f => f.color == 'red');

  console.log(isAnyRed); // true
}

总结

让我们一起生成更多可读代码。我希望你能在本文中学到一些新东西。

就这样。编码快乐!

详解JavaScript中ES5和ES6的类、继承之间区别和联系 导读: 很多JavaScript的初学者(比如说我)在刚开始学习这门语言的时候,往往会对函数、对象、类、继承这些概念感到迷茫和疑惑,感觉他们彼此之间长得十分相似,这就导致很难分清他们什么时候该怎么用。特别是JavaScript中有了原型这个概念之后,就觉得更加混乱了。本篇文章我就从一个初学者的角度身份来去梳理一下这些概念和用法之间的区别与联系,力图能让同样是初学者的你很好的分清这些概念之间的用法。 ES5中类、对象和原型 ES5没有真正定义类的关键字,它通过函数首字母大写的方式来告诉别人这是一个类,.. 阅读详情

相关推荐

Elasticsearch(ES)多条件(日期,时段,时分,mac。。)过滤实现案例(2.3.3版本)

Elasticsearch(ES)多条件过滤实现案例(2.3.3版本),POST代码,查询过滤,多种条件。

5个技巧让你更好的编写 JavaScript(ES6) 中条件语句

使用 JavaScript 时,我们经常需要处理很多条件语句,这里分享5个小技巧,可以让你编写更好/更清晰的条件语句。 1.使用 Array.includes 来处理多个条件 我们来看看下面的例子: JavaScript 代码: // condition function test(fruit) { if (fruit == 'apple' || fruit == 'strawberr...

良_123的专栏 553

别再为EPI形变头疼了!FSL的topup+eddy实战保姆级教程(含AP/PA数据采集要点)

本文详细介绍了如何使用FSL的topup和eddy工具解决EPI形变问题,包括数据采集要点、参数设置和实战操作步骤。通过AP/PA双编码数据和精确的形变场估计,有效矫正MRI图像中的几何畸变,提升弥散数据质量。特别适合需要处理高场强MRI数据的研究人员和技术人员。

weixin_28725949的博客 399

es多条件数据查询

在使用match和rang组合查询时 GET vdc/kline/_search { "query": { "bool": { "must": [ {"match": {"baseCurrency": "btc"}}, {"match": {"quoteCurrency": "usdt"}}, {"match": {"platformName": "ZB网"}} ],"range": { "time": {

qq_34819372的博客 3920

国家大地2000坐标系投影坐标转高德地图经纬度坐标-【高斯投影坐标】

国家大地2000坐标系投影坐标转换成高德经纬度坐标显示画图。

devil_zhuzhu的博客 1万+

Xilinx FPGA 100G RDMA开发实战:基于AXI Lite配置的ROCE V2高速通信系统搭建

本文详细介绍了在Xilinx FPGA上搭建100G ROCE V2高速通信系统的实战过程。通过分析RDMA技术优势与FPGA实现的必要性,重点阐述了基于AXI Lite接口配置ERNIC IP核的关键步骤,包括硬件系统构建、驱动开发及与商用网卡的互通测试,旨在实现兼具高性能与灵活性的网络加速方案。

js777的博客 575

includes如何匹配多个条件

includes如何匹配多个条件 正常情况 let a = 'This is my apple' a.includes('apple') // true 如上所示,一般咱们是这么使用includes的,是匹配一种的情况 但如果是一个不确定的字符串 let pathname = window.location.pathname // 这里是不确定的url路由链接 let condition = ['router1', 'router2', 'router3'] // 这里是你想要匹配的多个条件 if(c

zqq1009的博客 4994

Pywinauto与Inspect.exe完美搭配:解决Windows应用UI自动化中的元素定位难题

本文详细介绍了如何将Pywinauto与Inspect.exe结合,以解决Windows应用UI自动化中的核心难题——元素定位。通过实战指南,阐述了如何利用Inspect.exe在UIA模式下精准侦察控件属性,并将这些信息转化为Pywinauto的稳健定位策略,从而高效自动化WPF、WinForms等现代框架构建的复杂桌面应用。

weixin_29297127的博客 519

JavaScript(ES6) 中条件语句

1.使用 Array.includes 来处理多个条件 function test(fruit) { if (fruit == 'apple' || fruit == 'strawberry') { console.log('red'); } } 优化变成 ->> function test(fruit) { // 条件提取到数组中 const redFr...

青天悬河 1054

影刀RPA进阶:Excel多条件筛选与数据提取实战

本文详细介绍了如何利用影刀RPA实现Excel多条件筛选与数据提取的自动化。通过拆解文本、数值、日期及颜色筛选等核心指令,并结合实战案例,指导用户构建稳健的销售数据提取机器人,从而高效处理复杂数据报表,提升工作效率。

onion的博客 527

《算法第四版》学习心得一——怎么学算法

 一、算法的两个核心 算法的核心内容实际上有两个: 算法的概念和思路。 算法的编程实现。 两者相互关联影响,缺一不可。 不理解基本概念和思路,就算把实现代码背下来,也无济于事,因为脑袋里依然是一片模糊。理解了概念和思路,不去用代码实现,脑袋里有的只是概念,无法根据真实需求实现解决方案。 二、学算法需要什么基础 首先,必须要有一定的编程语言基础,要理解语言中最基本的概念:数据类型,类,成...

illikang的博客 3909

ElasticSearch之script语法使用

script参数能够自由定义需要比较运算的字段

勤于笔记,成于点滴。 5147

100天精通Python(基础篇)——第20天:pip命令大全

pip升级命令:python -m pip install --upgrade pip pip install name //这里的name是要安装的第三方库名 pip install name -i http://mirrors.aliyun.com/pypi/simple/ 国内镜像源 阿里云:http://mirrors.aliyun.com/pypi/simple/ (推荐使用) 清华大学:https://pypi.tuna.tsinghua.edu.cn/simple 豆瓣:http:/

努力让自己发光,对的人才能迎着光而来 18万+

五个技巧写出更好的js条件语句

解决JavaScript中不必要的条件嵌套,多余判定,参数设置,以及参数不确定性。 <script> 'use strict'; //1.使用Array.includes来处理多重条件 /** * 如果我们要找到符合我们需要的鞋子 * 符合的有"Asics" , "Nike" , "Adidas" ...

Minyoung 的博客 579

大厂面试级C#上位机完整项目(终极版):工业级Modbus协议封装 + 标准多线程采集 + 全链路异常处理

(Modbus统一通信接口)、(采集服务接口)职责:定义所有核心操作的标准接口,屏蔽底层差异(RTU/TCP、串口/TCP),面向接口编程的核心体现。新增协议/采集方式,只需实现接口,核心代码零改动。/// 自定义Modbus通信异常类 - 大厂标准,区分通信异常和其他异常/// 包含异常信息+内部异常,可溯源完整错误堆栈,面试必写本次项目是对标大厂工控上位机岗位的终极版实战项目,所有代码、架构、设计都遵循大厂标准,覆盖了面试官考察的所有核心考点✅ 纯手写Modbus协议,体现你对协议底层的吃透。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 857

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ES5 vs ES6:JavaScript 演进之路

ES5 vs ES6:JavaScript 演进之路

qq_20236937的博客 1803

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ES6与JavaScript之间的关系

js与node.js JS是由ES(ECMAScript)、DOM(浏览器文档对象)、BOM(浏览器对象模型)组成。 其中Node.Js就只有ES,目前浏览器比较流行的版本就是ES6(ES2015),老浏览器的版本基本上都是ES5。所以alert和document不能在Node运行(因为Node没有dom和bom)。 ECMAScript 6简介 ECMAScript 6.0(以下简称ES6)是J...

qq_43542074的博客 5601

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【JS笔记】JavaScript语法快速上手— ES5和ES6(五)

【JS笔记】JavaScript语法 快速上手— ES5和ES6(五)

leo的博客 991

从脚本到工程化:ES5 与 ES6 重塑 JavaScript 的十年

JavaScript经历了从ES5到ES6的重大变革:ES5(2009)为JS建立了基本规范,引入严格模式、数组方法、JSON支持等基础功能,使其从松散脚本迈向工程化雏形;而ES6(2015)则带来let/const、模块化、箭头函数等现代化特性,彻底解决了作用域、异步编程等核心问题。两个版本共同塑造了现代JavaScript——ES5奠定基础规范,ES6提供工程化能力,使JS从简单的网页脚本进化为支持大型应用开发的成熟语言。如今ES6已成为前端开发标配,但其核心思想仍建立在ES5的基础之上。

qq_43548436的博客 1170

JavaScript 与 ES5 与 ES6 与 Node.js 之间的关系

参考自:https://es6.ruanyifeng.com/#docs/intro JavaScript 由Netscape 公司创造,1996 年 11 月,决定将 JavaScript 提交给标准化组织 ECMA,希望这种语言能够成为国际标准。之后,由ECMA发布的JavaScript就叫做ECMAScript了,简称ES。 1、ECMAScript 和 JavaScript 的关系 ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现。 2、ES.

青蛙king的博客 1089

JavaScript ES5 vs ES6 核心特性对比

ES6(ECMAScript 2015)引入了大量现代化语法和新特性,使 JavaScript 更加简洁、易读、易维护。以下是 ES5 与 ES6 的核心特性详细对比。特性ES5ES6变量声明var(函数作用域)letconst(块级作用域)函数function声明箭头函数、默认参数、剩余参数字符串拼接、转义模板字符串、插值、多行对象完整写法属性简写、方法简写、计算属性数组mapfilterreducefindincludesArray.from、扩展运算符异步回调函数Promise(后续)

csdn_silent的博客 1349

JS中ES5和ES6中set和get方法

描述: JS中ES5和ES6中set和get方法   ES5 情况一:对象已经创建,需要给上面添加setget方法 /* * 如果使用defineProperty定义setget,默认configurable: false,enumerable: false * * * */ var o...

进击的葱 1万+

从ES5到ES6+:JavaScript语法演进与实现解析

本文探讨了JavaScript从ES5到ES6+的语法演进,重点介绍了ES6+中的新特性及其在ES5中的实现方式。ES6+引入了let和const、箭头函数、解构赋值、模板字符串和类等语法糖,显著提升了代码的简洁性和可维护性。文章还分析了这些新特性在ES5中的模拟实现,帮助开发者理解其底层机制。ES6+的推出不仅改进了语法,还推动了模块化、异步编程等现代开发模式的应用,标志着JavaScript语言的一次重要跃迁。

qq_64546210的博客 1384
上一篇: 【GIT】本地创建一个 git 仓库,并推送到远程仓库
下一篇: 【IDE】 IntelliJ IDEA 复制粘贴卡死问题
tanpenggood
博客等级 码龄9年 129粉丝 197原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值