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
并获得 true
或 false
.
假设 totalMark 是一个负数,那么你从这篇文章中得到 false
。接下来要比较的是 false < 40
。这没有多大意义,但 javascript 会尽力而为。遵循 javascript 类型强制转换的晦涩规则,false
被视为 0
,因此它检查 0 < 40
即 true
。因此,当 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
。
为什么我们将逻辑运算符与比较运算符一起使用?我对编码还是很陌生,每当我的讲师给我们一些例子时,他们总是这样写:
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
并获得 true
或 false
.
假设 totalMark 是一个负数,那么你从这篇文章中得到 false
。接下来要比较的是 false < 40
。这没有多大意义,但 javascript 会尽力而为。遵循 javascript 类型强制转换的晦涩规则,false
被视为 0
,因此它检查 0 < 40
即 true
。因此,当 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
。