1

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。我认为可能会有一种更短的方式来编写多重比较的条件(尽管循环可以正常工作),但这显然不是解决这个问题的方法。

幕后发生了什么,或者更确切地说,它是如何被解释的,以便在第二种情况下它总是返回 true?我声明的值都不是1or true,所以这绝对不是问题。

4

3 回答 3

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
  }
}
于 2013-11-04T04:37:39.287 回答
2

那是因为:

if (value == compare1 || compare2 || compare3) 

与此相同:

if ((value == compare1) || compare2 || compare3)

而且,您会看到这compare2是一个满足||操作员的真实值。请参阅这篇关于运算符优先级的 MDN 文章,了解为什么==首先评估的原因使您的第一个代码块工作,但让您的第二个代码块像我展示的那样评估。


如果您想将所有这些都与 进行比较value,则必须像在第一个代码块中所做的那样,将它们分别与 进行比较value


您可能还想考虑===更频繁地使用,这样您就不必担心可能的类型转换会使事情变得平等,而您从未打算平等。我在自己的编码中有一个始终使用的准则,===除非!==有明确的理由需要类型转换。我相信这可以节省一些意外的错误。请参阅此处了解更多信息。

于 2013-11-04T00:06:40.980 回答
1

不幸的是,我不相信在 JavaScript 中编写条件语句的捷径。

第二个示例返回 true 的原因是因为当您评估compare2this 时,这是 JavaScript 中的一个truthy值。

我推荐这篇 关于 JavaScript 中真值和假值的文章

顺便说一句,您可能想研究一下JavaScript==之间的区别===

于 2013-11-04T00:07:53.963 回答