javascript - 逻辑运算困境
问题描述
我试图将一些表单验证添加到我之前正在处理的简单表单中,并编写了以下代码段
if (!lesson.title && lesson.title.trim().length == 0) throw Error("Kindly provide a lesson title");
然后我想到尝试一些非常规的东西,而不是逻辑“长度等于零”,我想尝试“长度不等于或小于零”,然后我想出了以下片段
if (!lesson.title && lesson.title.trim().length <=! 0) throw Error("Kindly provide a lesson title");
令我惊讶的是,我工作了,但我并不真正理解其背后的逻辑,所以我尝试了几个断言结果:
"s".length <=! 0 // TRUE
"sm".length <=! 0 // FALSE
"s".length =! 0 || "s".length < 0 // TRUE
"s".length =! 0 && "s".length < 0 // FALSE
"sm".length =! 0 && "sm".length < 0 // FALSE
"sm".length =! 0 || "sm".length < 0 // TRUE
有人可以向我解释这里发生了什么吗?我很困惑。
解决方案
<=!
不是运算符。它是两个运算符:
因此,表达式
"s".length <=! 0
可以更清楚地重写为:
"s".length <= !0
读作“字符串s的长度应小于或等于非零”。
该值0
是falsy,因此用 NOT 反转它会产生 booleantrue
console.log( !0 )
现在我们可以将表达式重写为等价的:
"s".length <= true
接下来是关系运算符如何比较不同类型。简而言之,如果你比较一个数字和一个布尔值,那么布尔值将被强制转换为一个数字。值true
强制为1
console.log( Number(true) )
因此,表达式的最终重写为:
"s".length <= 1
最后,<=! 0
是一种非常迂回的错误比较方式。
而不是逻辑“长度等于零”,我想尝试“长度不等于或小于零”,然后我想出了以下片段
正如我们所见,没有“不等于或大于”。关系的相反运算符是:
==
<->!=
===
<->!==
>
<-><=
>=
<-><
如果您想要“不等于或小于”,则完全相反的是“大于”:
console.log( "5 <= 4", 5 <= 4 );
console.log( "5 > 4 ", 5 > 4 );
console.log( "5 <= 5", 5 <= 5 );
console.log( "5 > 5 ", 5 > 5 );
console.log( "5 <= 6", 5 <= 6 );
console.log( "5 > 6 ", 5 > 6 );
另一种选择是否定整个比较,这将给出相同的结果:
console.log( "5 <= 4", 5 <= 4 );
console.log( "5 > 4 ", !(5 <= 4) );
console.log( "5 <= 5", 5 <= 5 );
console.log( "5 > 5 ", !(5 <= 5) );
console.log( "5 <= 6", 5 <= 6 );
console.log( "5 > 6 ", !(5 <= 6) );
推荐阅读
- python - 计算两个不同数据帧中包含字符串的两列之间的字符串相似度
- python - 测试正态性的不同方法导致相同数据的不同输出
- postgresql - 如何从postgres jsonb嵌套数组中获取字段
- database - 确保 MongoDB 数据库目录具有正确的读/写权限
- .net-core - HtmlRendererCore.PdfSharpCore 版本 1.0.1“找不到合适的字体。”
- javascript - 如何在开发服务器中为 react-scripts 启动调用定义基本 URL
- html - nboots中两个div元素之间不必要的空格
- ios - 在旧 macOS 中运行旧 xcode 项目时遇到问题
- node.js - 如何从终端在 Linux 中手动安装 nodejs
- java - 是否可以检查方法是否在一组类中声明?