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

js中 ^ !! ! 运算符的巧用 / 判断开始日和结束日案例 / 判断两个变量只有一个为空的情况

前言

今天敲代码的时候,遇到一个小问题。前端有两个输入框,一个是开始日,一个是结束日。现在需要判断用户输入的情况,大致上有以下四种:

  1. 都没有输入
  2. 只输入了一个
  3. 都输入了,但是开始日大于结束日
  4. 都输入了,且合法

因为不同情况下的错误信息显示不同,所以要区分判断。我重点把目光放在了第二种。

第二种情况的判断逻辑

最简单的方法也是最直观的方法:

if ((!start && end) || (start && !end))

但是这样并不精简,优雅。
群里有一位老哥提供了更加优美的代码:

!!(!a ^ !b)

下面来解释一下这种判断方法的原理。

^运算符
^运算符(位异或)用于对两个二进制操作数逐位进行比较,并根据如表格所示的换算表返回结果。

第一个数的位值第二个数的位值运算结果
110
101
011
001

可以看到,位异或的作用就是逐位判断两个变量的位值。
代入到判断逻辑中,!a!b都已经被强制转换成了Boolean,所以它们的true、false状态就是简单的1或者0,二者如果状态相同,说明两个日期都输入了或者都没输入,这种情况为前言中的1、3、4情况,二者状态不同,说明只输入了一个日期,这种情况为第二种情况。

再看前面的!!这个其实是因为js中值没有类型,连续两次!!强制将结果转化为Boolean类型。在其他判断空值的情况下,我们可以利用这个运算符,快速判断控制:

// complicate
if (a === null || a === undefined || a === '') {}
// simple
if (!!a) {}

回到我们的case中,第二种情况的判断逻辑可以精简成这样:

if (!(!start ^ !end)) {
	// error 2
}

OK!感谢群里老哥的教导,今天的分享就到这里。

相关文章:

  • 【Java to Architect】Blocking Queue 阻塞队列应对并发
  • 【Java to Architect】HashSet TreeSet 集合 红黑树
  • 【Salesforce】【LWC】响应式验证标准查找输入框
  • 最长递增子序列问题(LIS) 动态规划 JavaScript
  • 位屏蔽(Bitmasking)中屏蔽字赋值语句 mask | (1 << j) 的解释
  • 【Java to Architect】synchronized保证内存可见性 demo的另一种解法
  • 利用位屏蔽和动态规划解决最小代价任务分配问题 Bitmasking Dynamic Programming
  • 算法:回溯法(backtracking)解决寻找给定字符串的所有排序(permutations)问题
  • 算法: 动态规划 寻找2D矩阵中到达某一坐标的最小代价路径
  • 算法:动态规划 寻找2D矩阵中到达某一坐标的可能路径总数
  • 算法:动态规划 寻找2D矩阵中到达某一坐标的可能路径总数进阶版(添加路障)
  • 算法: 动态规划,二维矩阵代价最值进阶版 两条行进路径,一次相交,求解最大代价
  • Programming Languages And Lambda calculi 1.1 定义集合
  • 算法: 动态规划 编辑距离 Edit Distance / Levenshtein Distance
  • 【Salesforce】【Apex】Trigger中不通过soql查询记录类型的开发名称
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • angular学习第一篇-----环境搭建
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • Codepen 每日精选(2018-3-25)
  • css系列之关于字体的事
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • java8-模拟hadoop
  • JavaScript DOM 10 - 滚动
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • MySQL几个简单SQL的优化
  • Puppeteer:浏览器控制器
  • React as a UI Runtime(五、列表)
  • Redis学习笔记 - pipline(流水线、管道)
  • use Google search engine
  • vuex 学习笔记 01
  • 分享一份非常强势的Android面试题
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 技术:超级实用的电脑小技巧
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 突破自己的技术思维
  • 最简单的无缝轮播
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #大学#套接字
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (30)数组元素和与数字和的绝对差
  • (42)STM32——LCD显示屏实验笔记
  • (笔试题)分解质因式
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)Linux下编译安装log4cxx
  • (转)平衡树
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .net 程序发生了一个不可捕获的异常