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

Javascript logical operators: multiple || syntax dilemma

本文关键字:语法 困境 多个 逻辑运算符 Javascript      更新时间:2024-04-28
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"));

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

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

最接近的是使用Array.indexOf

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

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

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

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

在 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"是一样的。

(object

|| object(语法类似于 null check 运算符,而不是 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"))

只有当选择2是"a",选择1是"x"时,你的条件(如下(才有效。

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

中的内容首先被计算,因此("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 奇怪方式的开发人员感到困惑。