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
的表达式返回值为第一个not null
或not undefined
值。
所以,在你的情况下choice2 === ("a" || "b" || "c")
和写choice2 === "a"
是一样的。
|| object(语法类似于 null check 运算符,而不是 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"))
只有当选择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 奇怪方式的开发人员感到困惑。
- 铬:“;未捕获的语法错误:意外的标记:"
- jQuery语法添加了var
- Javascript未捕获语法错误意外的标识符错误
- 为什么忽略了eval()代码中的语法错误
- 难以访问的JS环境中的语法错误
- 如何告诉MathJax对下标使用替代语法
- Javascript语法向设置发出sessionStorage值
- 未捕获的语法错误:意外的标记{
- 使用$scope方法时的ControllerAs语法
- "未捕获的语法错误:意外的标记}"
- javascript自执行函数-不同的语法
- 函数的Javascript语法
- WinJS内联绑定语法
- 使用JS函数来使用另一个函数的语法?node.js
- 未捕获的语法错误:无法在“文档”上执行“查询选择器”
- 有没有针对带有表的JavaScript的Markdown语法解析器
- 在递归生成器函数中,yield后面的*(星号/星号)语法意味着什么
- React JS:未捕获(在承诺中)语法错误:在位置 0 的 JSON 中意外<令牌
- 当使用控制器作为语法时,如何从父指令继承属性
- Javascript 逻辑运算符:多个 ||语法困境