Javascript中这两个条件语句有什么区别?
function comparisonTest() {
var value = "A value";
var compare1 = 5;
var compare2 = "String";
var compare3 = false;
if (value == compare1 || value == compare2 || value == compare3) console.write("True");
else console.write("False");
}
这样可以正常工作 - 它返回false,因为值不匹配。但是,当我将条件更改为以下...
function comparisonTest() {
var value = "A value";
var compare1 = 5;
var compare2 = "String";
var compare3 = false;
if (value == compare1 || compare2 || compare3) console.write("True");
else console.write("False");
}
总是返回True
。我认为可能会有一种更短的方式来编写多个比较的条件(尽管循环可以正常工作),但这显然不是解决这个问题的方法。
幕后发生了什么,或者说,它是如何被解释的,以便在第二种情况下它总是返回真实?我声明的值都不是1
或true
,所以这绝对不是问题。
答案 0 :(得分:2)
那是因为:
if (value == compare1 || compare2 || compare3)
与此相同:
if ((value == compare1) || compare2 || compare3)
并且,您会看到compare2
是满足||
运算符的真值。请参阅this MDN article on operator precedence了解为什么==
首先得到评估,这会使您的第一个代码块生效,但让您的第二个评估像我所展示的那样。
如果您想将所有这些内容与value
进行比较,则必须像在第一个代码块中那样以简单的方式编写它,并将每个代码块分别与value
进行比较。
您可能还希望更频繁地考虑使用===
,这样您就不必担心可能的类型转换使得事情变得平等而您从不打算平等。我在自己的编码中有一个指南,总是使用===
和!==
,除非有明确的理由想要进行类型转换。我相信这可以节省一些意外的错误。有关详细信息,请参阅here。
答案 1 :(得分:2)
这是另一种选择:
function comparisonTest() {
var value = "A value";
var answers = [5, "String", false];
/* IE may requires shim found here:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
*/
if (answers.indexOf(value) === -1) {
// False
} else {
// True
}
}
答案 2 :(得分:1)
不幸的是,我不相信在JavaScript中编写条件的方法很短。
第二个示例返回true的原因是,当您评估compare2
时,这是JavaScript中的truthy
值。
我推荐这个post关于JavaScript中的truthy和falsey值
另外,您可能希望了解JavaScript中==
和===
之间的区别