将 != 运算符与 || 一起使用时的困惑JavaScript 中的运算符

Posted

技术标签:

【中文标题】将 != 运算符与 || 一起使用时的困惑JavaScript 中的运算符【英文标题】:Confusion when using the != operator with the || operator in JavaScript 【发布时间】:2022-01-01 15:17:23 【问题描述】:

我是 javascript 和编程新手。我正在编写一个玩石头剪刀布的程序,我想在用户未能输入正确选择时捕捉到。

这是我的 userChoice() 函数,带有一个 if 语句来捕获不正确的选择。

function userChoice() 
  let choice = prompt('Choose rock, paper, or scissors.', 'rock')
  // Convert user input to lowercase
  choice = choice.toLowerCase()
  // If the user doesn't choose 'rock', 'paper', or 'scissors'... 
  if (choice != 'rock' ||
      choice != 'paper' ||
      choice != 'scissors') 
        alert('Please choose a valid choice.') // ... ask them to make a valid choice. 
        return userChoice(); // call the userChoice() function again.
   else 
    console.log(`Player1 chooses $choice`)
    return userChoice()
  

当我按照写的方式调用函数时,它总是触发 if 语句。

只有在我使用 || 时才会这样做运算符来定义多个 != 比较。如果我只使用一个 != 比较,没有 ||运算符,它工作正常。

if (choice != 'rock') // Works fine!

看来我不是很了解如何使用||和 != 在一起。

编辑:我以为 ||测试第一个假值, && 测试第一个真值。我把它倒过来了,应该用 && 来找到第一个假值。感谢您指出我的错误。

【问题讨论】:

你说的是“如果它不是石头、不是纸或者不是剪刀”,这总是正确的,因为即使它是石头,它也不是剪刀。你应该使用“如果它不是石头而且它不是纸而且它不是剪刀”。并且是 &&,而不是 ||。 您可以使用array#includes 来检查值是否介于石头、纸和剪刀之间。!['rock', 'paper', 'scissors'].includes(choice) 想想逻辑 ...A not equal 1 OR A not equal 2 总是正确的,因为A 一次只能等于一个值 【参考方案1】:

你写下你的条件的方式总是正确的,因为它不可能同时是所有这三件事。

在英语中,它的意思是“如果它不是石头,或者不是剪刀,或者不是纸……”

如果是石头就不是剪刀,如果是剪刀就不是纸,等等,所以你的测试总是正确的。

你想要 AND:“如果不是石头,也不是剪刀,也不是纸……”

这很容易被绊倒,因为我们倾向于认为“如果它不是石头、纸或剪刀”,但这里的逻辑是独立测试每个比较并对它们进行 OR 运算。


或者你可以这样做:

const options = ["rock", "paper", "scissors"];

if (!options.includes(userChoice)) 
   …

【讨论】:

你可以像用英语一样写它,首先检查它是否是这些值之一,然后否定它。 (德摩根定律。)if (!(choice == "rock" || choice == "paper" || choice == "scissors")) ... 谢谢你,非常清楚。还要感谢替代更清洁的方法,当我了解有关数组的更多信息时,我会更多地研究它。

以上是关于将 != 运算符与 || 一起使用时的困惑JavaScript 中的运算符的主要内容,如果未能解决你的问题,请参考以下文章

将placement new 与存储类一起使用时的额外构造

将 Rollup、ES 模块、TypeScript 和 JSX 连接在一起时的令人困惑的行为

与 ? 一起使用时的逗号运算符优先级: 运算符 [重复]

使用“:”(冒号)时的运算符优先顺序

在 Java 中使用 if 与三元运算符时的“错误”返回类型

将 JWT 令牌与 dropwizard 一起使用?我已经有 db auth,但对使用令牌感到困惑