Javascript: 为什么要将逻辑运算符与比较运算符一起使用?

Javascript: Why use Logical Operators along with Comparison Operator?

为什么我们将逻辑运算符与比较运算符一起使用?我对编码还是很陌生,每当我的讲师给我们一些例子时,他们总是这样写:

if (totalMark >= 0 && totalMark < 40) {
  finalGrade = "F";
  document.getElementById("final_grade").value = finalGrade;
  }

为什么不直接使用比较运算符?

if (0 <= totalMark < 40) {
  finalGrade = "F";
  document.getElementById("final_grade").value = finalGrade;
  }

使用一种比另一种有什么优势还是完全一样?

因为第二个并不像您想象的那样工作。

对于第二个,首先只检查 0<=x 条件。如果那是真的,那么第二部分并不重要。

let x = 20;
if(0 <= x < 40) { console.log("yo2"); }
if(0 <= x < 10) { console.log("yo"); }

if (0 <= totalMark < 40) {

这与您认为的不同。您期望它检查 totalMark 是否在 [0, 40) 的范围内。但它真正要做的是一次评估它的一部分。它将检查 0 <= totalMark 并获得 truefalse.

假设 totalMark 是一个负数,那么你从这篇文章中得到 false。接下来要比较的是 false < 40。这没有多大意义,但 javascript 会尽力而为。遵循 javascript 类型强制转换的晦涩规则,false 被视为 0,因此它检查 0 < 40true。因此,当 totalMark 为负数时,0 <= totalMark < 40 解析为 true。事实上,如果你遍历其他可能性,它将 总是 结果 true.

简而言之,这些比较运算符一次只能看2个东西。然后使用 &&|| 构建更大的东西。

比较 0 <= totalMark < 40 不符合您的预期。

它首先计算0 <= totalMark(假设totalMark = 10)变成true。然后它比较true < 40。在这里它将 true 转换为一个数字并且 1 < 40 变为真。

因此感觉更像是随机行为,而不是您想要的比较。例如,您可以尝试以下示例:

const totalMark = 10

if (0 < totalMark < 20) console.log('0 < ... < 20')
if (20 > totalMark > 5) console.log('20 > ... > 5')

0 <= totalMark < 40 检查 totalMark 是否在某些语言的区间 [0, 40) 中——例如 CoffeeScript 和 Python——但不在 JavaScript 中(如解释的在其他答案中)。

确实,您 can see CoffeeScript 将此代码编译为 JavaScript 代码 0 <= totalMark && totalMark < 40