首页 > 解决方案 > 逻辑运算困境

问题描述

我试图将一些表单验证添加到我之前正在处理的简单表单中,并编写了以下代码段

      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

有人可以向我解释这里发生了什么吗?我很困惑。

标签: javascriptoperatorslogical-operators

解决方案


<=!不是运算符。它是两个运算符:

因此,表达式

"s".length <=! 0

可以更清楚地重写为:

"s".length <= !0

读作“字符串s的长度应小于或等于非零”。


该值0falsy,因此用 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) );


推荐阅读