返回顶部
首页 > 资讯 > 精选 >JavaScript语法和React JSX语法的逻辑判断优化技巧有哪些
  • 424
分享到

JavaScript语法和React JSX语法的逻辑判断优化技巧有哪些

2023-06-27 11:06:28 424人浏览 薄情痞子
摘要

小编给大家分享一下javascript语法和React jsX语法的逻辑判断优化技巧有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!JavaScript 语法篇嵌套层级优化function supply(fr

小编给大家分享一下javascript语法和React jsX语法的逻辑判断优化技巧有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

JavaScript 语法篇

嵌套层级优化

function supply(fruit, quantity) {    const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];    // 条件 1: 水果存在    if(fruit) {        // 条件 2: 属于红色水果        if(redFruits.includes(fruit)) {            console.log('红色水果');            // 条件 3: 水果数量大于 10 个            if (quantity > 10) {                console.log('数量大于 10 个');            }        }    } else {        throw new Error('没有水果啦!');    }}

分析上面的条件判断,存在三层 if 条件嵌套。

如果提前 return 掉无效条件,将 if else的多重嵌套层次减少到一层,更容易理解和维护。

function supply(fruit, quantity) {    const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];    if(!fruit) throw new Error('没有水果啦'); // 条件 1: 当 fruit 无效时,提前处理错误    if(!redFruits.includes(fruit)) return; // 条件 2: 当不是红色水果时,提前 return        console.log('红色水果');        // 条件 3: 水果数量大于 10 个    if (quantity > 10) {        console.log('数量大于 10 个');    }}

多条件分支的优化处理

当需要枚举值处理不同的业务分支逻辑时, 第一反应是写下 if else ?我们来看一下:

function pick(color) {  // 根据颜色选择水果  if(color === 'red') {      return ['apple', 'strawberry'];   } else if (color === 'yellow') {      return ['banana', 'pineapple'];  } else if (color === 'purple') {      return ['grape', 'plum'];  } else {      return [];  }}

在上面的实现中:

  • if else 分支太多

  • if else 更适合于条件区间判断,而 switch case 更适合于具体枚举值的分支判断

使用 switch case 优化上面的代码后:

function pick(color) {  // 根据颜色选择水果  switch (color) {    case 'red':      return ['apple', 'strawberry'];    case 'yellow':      return ['banana', 'pineapple'];    case 'purple':      return ['grape', 'plum'];    default:      return [];  }}

switch case 优化之后的代码看上去格式整齐,思路很清晰,但还是很冗长。继续优化:

  • 借助 Object{ key: value } 结构,我们可以在 Object 中枚举所有的情况,然后将 key 作为索引,直接通过 Object.key 或者 Object[key] 来获取内容

const fruitColor = {                                                                            red: ['apple', 'strawberry'],    yellow: ['banana', 'pineapple'],    purple: ['grape', 'plum'],}function pick(color) {    return fruitColor[color] || [];}
  • 使用 Map 数据结构,真正的 (key, value) 键值对结构 ;

const fruitColor = new Map().set('red', ['apple', 'strawberry']).set('yellow', ['banana', 'pineapple']).set('purple', ['grape', 'plum']);function pick(color) {  return fruitColor.get(color) || [];}

优化之后,代码更简洁、更容易扩展。

为了更好的可读性,还可以通过更加语义化的方式定义对象,然后使用 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 pick(color) {  return fruits.filter(f => f.color == color);}

使用数组新特性简化逻辑判断

巧妙的利用 es6 中提供的数组新特性,也可以让我们更轻松的处理逻辑判断。

多条件判断

编码时遇到多个判断条件时,本能的写下下面的代码(其实也是最能表达业务逻辑的面向过程编码)。

function judge(fruit) {  if (fruit === 'apple' || fruit === 'strawberry' || fruit === 'cherry' || fruit === 'cranberries' ) {    console.log('red');  }}

但是当 type 未来到 10 种甚至更多时, 我们只能继续添加 || 来维护代码么 ?

试试 Array.includes ~

// 将判断条件抽取成一个数组const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];function judge(type) {    if (redFruits.includes(fruit)) {        console.log('red');     }}

判断数组中是否所有项都满足某条件

const fruits = [    { name: 'apple', color: 'red' },    { name: 'banana', color: 'yellow' },    { name: 'grape', color: 'purple' }  ];function match() {  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 match() {  // 条件:所有水果都必须是红色  const isAllRed = fruits.every(f => f.color == 'red');  console.log(isAllRed); // false}

判断数组中是否有某一项满足条件

Array.some ,它主要处理的场景是判断数组中是否有一项满足条件。

如果想知道是否有红色水果,可以直接使用 Array.some 方法:

const fruits = [    { name: 'apple', color: 'red' },    { name: 'banana', color: 'yellow' },    { name: 'grape', color: 'purple' }  ];// 条件:是否有红色水果 const isAnyRed = fruits.some(f => f.color == 'red');

还有许多其他数组新特性,比如 Array.findArray.sliceArray.findIndexArray.reduceArray.splice 等,在实际场景中可以根据需要选择使用。

函数默认值

使用默认参数

const buyFruit = (fruit,amount) => {     if(!fruit){        return  }  amount = amount || 1;  console.log(amount)}

我们经常需要处理函数内部的一些参数默认值,上面的代码大家都不陌生,使用函数的默认参数,可以很好的帮助处理这种场景。

const buyFruit = (fruit,amount = 1) => {     if(!fruit){        return  }  console.log(amount,'amount')}

我们可以通过 Babel 的转译来看一下默认参数是如何实现的。

JavaScript语法和React JSX语法的逻辑判断优化技巧有哪些

从上面的转译结果可以发现,只有参数为 undefined 时才会使用默认参数。

测试的执行结果如下:

buyFruit('apple','');  // amountbuyFruit('apple',null);  //null amountbuyFruit('apple');  //1 amount

所以使用默认参数的情况下,我们需要注意的是默认参数 amount=1 并不等同于 amount || 1

使用解构与默认参数

当函数参数是对象时,我们可以使用解构结合默认参数来简化逻辑。

Before:

const buyFruit = (fruit,amount) => {    fruit = fruit || {};    if(!fruit.name || !fruit.price){        return;    }    ...  amount = amount || 1;  console.log(amount)}

After:

const buyFruit = ({ name,price }={},amount) => {  if(!name || !prices){      return;  }  console.log(amount)}

复杂数据解构

当处理比较简的对象时,解构与默认参数的配合是非常好的,但在一些复杂的场景中,我们面临的可能是更复杂的结构。

const oneComplexObj = {    firstLevel:{        secondLevel:[{            name:"",            price:""        }]    }}

这个时候如果再通过解构去获取对象里的值。

const {    firstLevel:{        secondLevel:[{name,price]=[]    }={}} = oneComplexObj;

可读性就会比较差,而且需要考虑多层解构的默认值以及数据异常情况。

这种情况下,如果项目中使用 lodash 库,可以使用其中的 lodash/get 方法。

import lodashGet from 'lodash/get';const { name,price} = lodashGet(oneComplexObj,'firstLevel.secondLevel[0]',{});

策略模式优化分支逻辑处理

策略模式:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

使用场景:策略模式属于对象行为模式,当遇到具有相同行为接口、行为内部不同逻辑实现的实例对象时,可以采用策略模式;或者是一组对象可以根据需要动态的选择几种行为中的某一种时,也可以采用策略模式;这里以第二种情况作为示例:

Before:

const TYPE = {    JUICE:'juice',    SALAD:'salad',    JAM:'jam'}function enjoy({type = TYPE.JUICE,fruits}){  if(!fruits || !fruits.length) {        console.log('请先采购水果!');           return;    }  if(type === TYPE.JUICE) {    console.log('榨果汁中...');      return '果汁';  }  if(type === TYPE.SALAD) {      console.log('做沙拉中...');      return '拉沙';  }  if(type === TYPE.JAM) {    console.log('做果酱中...');      return '果酱';  }  return;}enjoy({type:'juice',fruits});

使用思路:定义策略对象封装不同行为、提供策略选择接口,在不同的规则时调用相应的行为。

After:

const TYPE = {    JUICE:'juice',    SALAD:'salad',    JAM:'jam'}const strategies = {    [TYPE.JUICE]: function(fruits){        console.log('榨果汁中...');        return '果汁';    },    [TYPE.SALAD]:function(fruits){        console.log('做沙拉中...');        return '沙拉';    },    [TYPE.JAM]:function(fruits){        console.log('做果酱中...');        return '果酱';    },}function enjoy({type = TYPE.JUICE,fruits}) {    if(!type) {        console.log('请直接享用!');           return;    }    if(!fruits || !fruits.length) {        console.log('请先采购水果!');           return;    }    return strategies[type](fruits);}enjoy({type:'juice',fruits});

框架篇之 React JSX 逻辑判断优化

JSX 是一个看起来很像 XMLJavaScript 语法扩展。一般在 React 中使用 JSX 来描述界面信息,ReactDOM.render()JSX 界面信息渲染到页面上。

JSX 中支持 JavaScript 表达式,日常很常见的循环输出子组件、三元表达式判断、再复杂一些直接抽象出一个函数。

JSX 中写这么多 JavaScript 表达式,整体代码看起来会有点儿杂乱。试着优化一下!

JSX-Control-Statements

JSX-Control-Statements 是一个 Babel 插件,它扩展了 JSX 的能力,支持以标签的形式处理条件判断、循环。

If 标签

<If> 标签内容只有在 conditiontrue 时才会渲染,等价于最简单的三元表达式。

Before:

{ condition() ? 'Hello World!' : null }

After:

<If condition={ condition() }>Hello World!</If>

注意:<Else /> 已被废弃,复杂的条件判断可以使用 <Choose> 标签。

Choose 标签

<Choose> 标签下包括至少一个 <When> 标签、可选的 <Otherwise> 标签。

<When> 标签内容只有在 conditiontrue 时才会渲染,相当于一个 if 条件判断分支。

<Otherwise> 标签则相当于最后的 else分支。

Before:

{ test1 ? <span>IfBlock1</span> : test2 ? <span>IfBlock2</span> : <span>ElseBlock</span> }

After:

<Choose>  <When condition={ test1 }>    <span>IfBlock1</span>  </When>  <When condition={ test2 }>    <span>IfBlock2</span>  </When>  <Otherwise>    <span>ElseBlock</span>  </Otherwise></Choose>

For 标签

<For> 标签需要声明 ofeach 属性。

of 接收的是可以使用迭代器访问的对象。

each 代表迭代器访问时的当前指向元素。

Before:

{  (this.props.items || []).map(item => {      return <span key={ item.id }>{ item.title }</span>  })}

After:

<For each="item" of={ this.props.items }>   <span key={ item.id }>{ item.title }</span></For>

注意:<For> 标签不能作为根元素。

With 标签

<With> 标签提供变量传参的功能。

Before:

renderFoo = (foo) => {    return <span>{ foo }</span>;}// JSX 中表达式调用{    this.renderFoo(47)}

After:

<With foo={ 47 }>  <span>{ foo }</span></With>

使用这几种标签优化代码,可以减少 JSX 中存在的显式 JavaScript 表达式,使我们的代码看上去更简洁,但是这些标签封装的能力,在编译时需要转换为等价的 JavaScript 表达式。

看完了这篇文章,相信你对“JavaScript语法和React JSX语法的逻辑判断优化技巧有哪些”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: JavaScript语法和React JSX语法的逻辑判断优化技巧有哪些

本文链接: https://lsjlt.com/news/309901.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JavaScript语法和React JSX语法的逻辑判断优化技巧有哪些
    小编给大家分享一下JavaScript语法和React JSX语法的逻辑判断优化技巧有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!JavaScript 语法篇嵌套层级优化function supply(fr...
    99+
    2023-06-27
  • JavaScript条件语句优化的技巧有哪些
    这篇文章主要介绍了JavaScript条件语句优化的技巧有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript条件语句优化的技巧有哪些文章都会有所收获,下面我们一起来看看吧。1、Array.i...
    99+
    2023-07-02
  • Vue中JSX语法和模板语法的区别有哪些
    这篇文章主要介绍“Vue中JSX语法和模板语法的区别有哪些”,在日常操作中,相信很多人在Vue中JSX语法和模板语法的区别有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue中JSX语法和模板语法的区别...
    99+
    2023-07-05
  • Go语言编程中的算法优化技巧有哪些?
    随着计算机技术的不断发展,算法优化已成为编程中不可或缺的一部分。在Go语言编程中,算法优化技巧也是非常重要的。本文将介绍Go语言编程中的算法优化技巧。 一、使用切片而非数组 在Go语言中,切片(slice)是一种动态数组,可以根据需要动态...
    99+
    2023-08-02
    编程算法 文件 分布式
  • CSS语法的常用技巧有哪些
    这篇文章主要为大家展示了“CSS语法的常用技巧有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“CSS语法的常用技巧有哪些”这篇文章吧。盒模型content-...
    99+
    2024-04-02
  • c语言素数的判断方法有哪些
    判断一个数是否为素数的常见方法有以下几种:1. 蛮力法:该方法是最简单直接的方法,即对于给定的数n,从2开始遍历到n-1,判断n是否...
    99+
    2023-10-20
    c语言
  • c语言判断整数的方法有哪些
    C语言判断整数的方法有以下几种:1. 使用取模运算符(%)判断余数是否为0的方法。如果一个整数除以2的余数为0,则该整数是偶数;否则...
    99+
    2023-08-09
    c语言
  • c语言质数判断的方法有哪些
    C语言质数判断的方法主要有以下几种:1. 穷举法:对于给定的数n,从2开始逐个判断n是否能被2到n-1之间的数整除,如果存在能整除的数,则n不是质数;如果不存在能整除的数,则n是质数。2. 埃氏筛法:先将2到n之间的所有数标记为质数,然...
    99+
    2023-08-11
    c语言
  • 详解JavaScript中if语句优化和部分语法糖小技巧推荐
    目录前言if else 基本使用简化if判断和优化代码单行if else使用&& || 优化使用三目运算符优化合并if使用includes 或者indexof使用sw...
    99+
    2024-04-02
  • sql语句的优化方法有哪些
    小编给大家分享一下sql语句的优化方法有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!sql语句优化的几种方法有:1、统一S...
    99+
    2024-04-02
  • MySQL语句优化的方法有哪些
    有以下几种常见的MySQL语句优化方法:1. 添加索引:通过为经常用于查询的列添加索引,可以提高查询的性能。索引可以加快查询的速度,...
    99+
    2023-09-16
    MySQL
  • sql语句优化的方法有哪些
    优化SQL语句的方法有以下几种:1. 使用合适的索引:通过为表中的列创建索引,可以加快查询的速度。需要根据查询的需求和数据的特点选择...
    99+
    2023-09-05
    sql
  • python实用的快捷语法技巧有哪些
    本篇内容主要讲解“python实用的快捷语法技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python实用的快捷语法技巧有哪些”吧!前言你知道a**3是什么意思吗?你知道怎么打印模块路...
    99+
    2023-06-29
  • C++语法和设计模式的性能优化技巧
    在 c++++ 开发中,通过优化语法和设计模式,可以提升代码效率:1. 避免不必要的拷贝和移动;2. 使用内联函数;3. 应用智能指针;4. 利用设计模式(如单例、工厂方法和观察者)。 ...
    99+
    2024-05-13
    c++ 设计模式
  • 网站导航的优化方法和设置技巧有哪些
    这篇文章将为大家详细讲解有关网站导航的优化方法和设置技巧有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。网站导航的优化方法和设置技巧 清晰的网站导航系统是网站设计的重要目标,对网站信息架构、用户体验影...
    99+
    2023-06-10
  • MySQL优化语句执行的方法有哪些
    这篇文章主要介绍“MySQL优化语句执行的方法有哪些”,在日常操作中,相信很多人在MySQL优化语句执行的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL优...
    99+
    2024-04-02
  • go语言性能优化的方法有哪些
    Go语言的性能优化方法如下: 使用并发:利用Go语言的goroutine特性,将程序中的瓶颈并行化。通过使用协程,可以充分利用多...
    99+
    2023-10-22
    go语言
  • java和javascript在语法上的区别有哪些
    本篇内容主要讲解“java和javascript在语法上的区别有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java和javascript在语法上的区别有...
    99+
    2024-04-02
  • 大数据接口的加载在 GO 语言中有哪些优化技巧?
    随着大数据时代的到来,越来越多的企业和机构都开始将大数据应用于业务中。而处理大数据所需要的技术,也逐渐成为了企业和机构必备的核心技能之一。在这样的背景下,GO 语言作为一种高效、简洁、易于学习的编程语言,也成为了越来越多企业和机构选择的工具...
    99+
    2023-06-17
    接口 load 大数据
  • 编程中的算法优化:GO语言和JavaScript有何不同?
    算法优化是程序员们经常面对的问题。无论是在开发大型应用程序还是小型脚本中,算法优化都是让程序高效运行的关键。GO语言和JavaScript都是流行的编程语言,它们之间有着很多相似之处,但在算法优化方面也存在一些显著的不同。 GO语言是一种...
    99+
    2023-10-15
    编程算法 javascript git
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作