Javascript逻辑运算符:多个||语法困境

时间:2015-02-24 12:01:14

标签: javascript syntax logical-operators

var choice1 = prompt("Enter choice 1");
var choice2 = prompt("Enter choice 2");

if (choice1 === "x" && choice2 === ("a" || "b" || "c")) {
  alert("Good job!");
}

假设用户输入x的{​​{1}}和选择2的choice1

上面是一个突出我的问题的简单示例。我知道它不起作用,但我的问题是为什么? Javascript不会将c中的多个||语句与()进行比较。为什么不?我认为choice2的逻辑与choice2==="a"的类型和值("b")相同。

我开始工作的方式是:

"c"

请帮助我理解为什么在使用多个(choice1 === "x" && ((choice2 === "a") || (choice2 === "b") || (choice3 === "c"));时,您需要明确写出每个||方案,而不是在我尝试顶级时将一堆放在||中。感谢。

4 个答案:

答案 0 :(得分:4)

它只是没有那样工作,你不能使用OR将一个值与多个其他值进行比较,你必须单独比较每个值。

你最接近的是使用Array.indexOf

if ( ['a', 'b', 'c'].indexOf(choice2) != -1 )

它不起作用的原因是因为OR和AND检查了真值,所以

('a' || 'b' || 'c') // return "a"

a是一个真正的值,所以OR永远不会继续,它不必,它已经有一个真值,所以表达式是真的,你离开了{{ 1}},其余的被丢弃

答案 1 :(得分:0)

在JavaScript中,如果你这样做

var a = null;
var b = {};
var c = "haha"

var d = a || b || c;

d的值为b。类型var1 || var2 || var3的表达式返回值为not nullnot undefined的值。

因此,在您的情况下,choice2 === ("a" || "b" || "c")与撰写choice2 === "a"相同。

答案 2 :(得分:0)

(object || object)语法类似于null check operator而不是javascript中的条件检查。

所以

  1. console.log(null || "b")会记录b

  2. console.log(undefined || "b")会记录b

  3. console.log(("a" || "b"))会记录

  4. console.log(null || "b")
    console.log(undefined || "b")
    console.log(("a" || "b"))

    只有当choice2为“a”且choice1为“x”时,你的condintion(下面)才有效。

    if (choice1 === "x" && choice2 === ("a" || "b" || "c")) {
      alert("Good job!");
    }
    

答案 3 :(得分:0)

括号中的内容首先得到评估,因此("a" || "b" || "c")将评估为“a”,因为您实际上说的是返回“a”或“b”或“c”,因此它返回“a”,因为这是第一次。

我相信您所期望的是("a" || "b" || "c")进行某种设置操作,但JavaScript没有该功能,因此如果用户选择{{1},您的代码choice2 === ("a" || "b" || "c")将永远为真}}。将多个值与choice2进行比较的最佳方法是在数组中存储“a”,“b”和“c”,并查看是否存在choice2。 "a"

在大多数语言中,你甚至无法比较三个字符串,但JavaScript会尽一切可能不抛出异常,因此它不会导致网站用户意识到页面存在问题所以它会尝试比较三个字符串,就像比较三个布尔值,但不返回布尔值,而是返回一个字符串。我会完全避免使用这种语法,因为它会让大多数不熟悉JavaScript奇怪方式的开发人员感到困惑。