Javascript 逻辑运算符:多个 ||句法困境
Javascript logical operators: multiple || syntax dilemma
var choice1 = prompt("Enter choice 1");
var choice2 = prompt("Enter choice 2");
if (choice1 === "x" && choice2 === ("a" || "b" || "c")) {
alert("Good job!");
}
假设用户输入 x
用于 choice1
和 c
用于选择 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
return 类型的表达式,值为第一个 not null
或 not undefined
值。
因此,在您的情况下 choice2 === ("a" || "b" || "c")
与写作 choice2 === "a"
相同。
(object || object) 语法类似于 null 检查运算符,不适用于 javascript.
中的条件检查
所以
console.log(null || "b")
会记录 b
console.log(undefined || "b")
会记录 b
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!");
}
括号中的内容首先得到评估,因此 ("a" || "b" || "c")
将评估为 "a",因为您实际上说的是 return "a" 或 "b" 或 "c" 所以它 returns "a" 因为那是第一个。
我相信您期望的是 ("a" || "b" || "c")
执行某种设置操作,但 JavaScript 没有该功能,因此您的代码 choice2 === ("a" || "b" || "c")
只有在以下情况下才会为真用户选择了 "a"
。将多个值与choice2进行比较的最好方法是将"a"、"b"和"c"存储在一个数组中,看里面是否存在choice2。 ["a","b","c"].indexOf(choice2) != -1
.
在大多数语言中,您甚至无法比较三个字符串,但 JavaScript 会尽其所能不抛出异常,以免网站用户意识到存在问题与页面,因此它将尝试比较三个字符串,就像您比较三个布尔值一样,但不是 returning 一个布尔值,而是 return 一个字符串。我会完全避免这种语法,因为它会使大多数不熟悉 JavaScript.
奇怪方式的开发人员感到困惑
var choice1 = prompt("Enter choice 1");
var choice2 = prompt("Enter choice 2");
if (choice1 === "x" && choice2 === ("a" || "b" || "c")) {
alert("Good job!");
}
假设用户输入 x
用于 choice1
和 c
用于选择 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
return 类型的表达式,值为第一个 not null
或 not undefined
值。
因此,在您的情况下 choice2 === ("a" || "b" || "c")
与写作 choice2 === "a"
相同。
(object || object) 语法类似于 null 检查运算符,不适用于 javascript.
中的条件检查所以
console.log(null || "b")
会记录 bconsole.log(undefined || "b")
会记录 bconsole.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!");
}
括号中的内容首先得到评估,因此 ("a" || "b" || "c")
将评估为 "a",因为您实际上说的是 return "a" 或 "b" 或 "c" 所以它 returns "a" 因为那是第一个。
我相信您期望的是 ("a" || "b" || "c")
执行某种设置操作,但 JavaScript 没有该功能,因此您的代码 choice2 === ("a" || "b" || "c")
只有在以下情况下才会为真用户选择了 "a"
。将多个值与choice2进行比较的最好方法是将"a"、"b"和"c"存储在一个数组中,看里面是否存在choice2。 ["a","b","c"].indexOf(choice2) != -1
.
在大多数语言中,您甚至无法比较三个字符串,但 JavaScript 会尽其所能不抛出异常,以免网站用户意识到存在问题与页面,因此它将尝试比较三个字符串,就像您比较三个布尔值一样,但不是 returning 一个布尔值,而是 return 一个字符串。我会完全避免这种语法,因为它会使大多数不熟悉 JavaScript.
奇怪方式的开发人员感到困惑