【问题标题】:Javascript logical operators: multiple || syntax dilemmaJavascript 逻辑运算符:多个 ||语法困境
【发布时间】:2015-02-24 12:01:13
【问题描述】:
var choice1 = prompt("Enter choice 1");
var choice2 = prompt("Enter choice 2");

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

假设用户输入x 代表choice1c 代表选项2。

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

我的工作方式是这样的:

(choice1 === "x" && ((choice2 === "a") || (choice2 === "b") || (choice3 === "c"));

请帮助我理解为什么在使用多个|| 时,您需要明确写出每个|| 场景,而不是在我尝试顶部时将一堆放在() 中。谢谢。

【问题讨论】:

    标签: javascript syntax logical-operators


    【解决方案1】:

    这种方式行不通,您不能使用 OR 将一个值与多个其他值进行比较,您必须单独比较每个值。

    你会得到最接近的是使用 Array.indexOf

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

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

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

    a 是一个真值,所以 OR 永远不会继续,它不必继续,它已经有一个真值,所以表达式为真,你剩下 a,其余的被丢弃

    【讨论】:

      【解决方案2】:

      在 JavaScript 中,如果你这样做

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

      d 的值将是 bvar1 || var2 || var3 类型的表达式返回第一个 not nullnot undefined 值的值。

      所以,在您的情况下,choice2 === ("a" || "b" || "c") 与编写 choice2 === "a" 相同。

      【讨论】:

        【解决方案3】:

        (object || object) 语法类似于 null 检查运算符,不适用于 javascript 中的条件检查。

        所以

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

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

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

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

        只有当choice2 为“a”且choice1 为“x”时,您的条件(如下)才有效。

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

        【讨论】:

          【解决方案4】:

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

          我相信您所期望的是 ("a" || "b" || "c") 执行某种设置操作,但 JavaScript 没有该功能,因此您的代码 choice2 === ("a" || "b" || "c") 只有在用户选择 "a" 时才会为真。将多个值与choice2 进行比较的最佳方法是将“a”、“b”和“c”存储在一个数组中,并查看其中是否存在choice2。 ["a","b","c"].indexOf(choice2) != -1.

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-09-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-01
            • 2020-10-02
            相关资源
            最近更新 更多