首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于逻辑运算符的理解问题&&兼

关于逻辑运算符的理解问题&&兼
EN

Stack Overflow用户
提问于 2019-07-07 12:25:07
回答 4查看 68关注 0票数 3

关于React.js教程中的代码片段,我有一个问题。我是JavaScript的初学者,如果这是个愚蠢的问题,请原谅我。

代码语言:javascript
运行
复制
function calculateWinner(squares) {
  const lines = [
    [0, 1, 2],
    [3, 4, 5],
    [6, 7, 8],
    [0, 3, 6],
    [1, 4, 7],
    [2, 5, 8],
    [0, 4, 8],
    [2, 4, 6],
  ];
  for (let i = 0; i < lines.length; i++) {
    const [a, b, c] = lines[i];
    if (squares[a] && squares[a] === squares[b] && squares[a] === squares[c]) {
      return squares[a];
    }
  }
  return null;
}

这个函数的目的是评估抽搐脚趾游戏的胜利者.平方参数获得一个包含9个值的数组,其类型为null"X""O"

假设数组的前三个值是"X",则if语句将解析为"X" && "X" === "X" && "X" === "X"。这将导致"X" === "X" === "X"。所以它应该返回true和玩家玩的"X“已经赢了。

但是,例如,如果我在JSBin中尝试,console.log("X" === "X" === "X")就会返回false。我只是不明白,因为在我看来,"X"等于"X",等于"X"

有人能解释我的推理错误在哪里吗?

非常感谢!

塞巴斯蒂安贝尔

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-07-07 12:46:19

您围绕&&操作符的推理是正确的。

问题在于您对===运算符的理解。在数学中,您可以以预期的方式使用相等(x =x= x),并且您将有一个正确的(true)语句。但在编程中,它不是这样工作的。

对每个操作符进行逐个评估。

所以你一开始:

代码语言:javascript
运行
复制
"X" === "X" === "X"

这将作为两个单独的语句进行评估。左边的运算符首先为该运算符求值(这称为运算符的结合性 )。您可以在第一个语句周围加上括号,使其显式化,如下所示:

代码语言:javascript
运行
复制
("X" === "X") === "X"

对括号中的语句进行计算,留下:

代码语言:javascript
运行
复制
true === "X"

这现在计算为false,因为true不等于"X"

我建议您不要使用,尝试以这种方式使用相等运算符(a === b === c)。其他等式操作符(如!== )也是如此。这不是一种典型的编程模式,很可能会让其他程序员感到困惑,就像它使您感到困惑一样。

要测试三个项的相等性,请始终使用&&操作符,如下所示:a === b && b === c。这表明,每个等式测试都是一个接一个地进行的。

票数 0
EN

Stack Overflow用户

发布于 2019-07-07 12:31:04

假设数组的前三个值是"X",if语句将解析为"X“& "X”=== "X“&& "X”=== "X“。这将导致"X“=== "X”X“=== "X”。

不,这会导致"X" && true && true

代码语言:javascript
运行
复制
if (squares[a] && squares[a] === squares[b] && squares[a] === squares[c])
//  ^^^^^^^^^^    ^^^^^^^^^^^^^^^^^^^^^^^^^    ^^^^^^^^^^^^^^^^^^^^^^^^^
//     "X"                 true                          true

&&评估它的左手操作数,如果结果是假的,则得到这个假值.如果左操作数的值为真,&&将计算其右操作数,并将该值作为其结果。

因此,"X" && true && true计算为true && true,后者计算为true

相反,===运算符计算它的左操作数,然后计算它的右操作数,然后计算它的右操作数,并比较结果是否严格相等(相同的类型和值)。它也是从左到右结合的,所以"X" === "X" === "X"("X" === "X") === "X",它是true === "X",是false,因为true"X"不完全相等。

" falsy“--当在布尔上下文中使用时(例如,if条件),如果值强制到false,它就是falsy。虚假的值是0""nullundefinedNaN,当然还有false。所有其他的价值观都是真实的--他们强迫true

票数 8
EN

Stack Overflow用户

发布于 2019-07-07 12:29:48

因为===是一个二进制运算符(它一次只能在两个操作数上工作)。

代码语言:javascript
运行
复制
"X" === "X" === "X"

等于

代码语言:javascript
运行
复制
(("X" === "X") === "X")

(首先,在前两个操作数之间计算第一个===,然后将结果与第三个操作数进行比较。)

这相当于

代码语言:javascript
运行
复制
true === "X"

当然,也就是false

如果您想测试逻辑表达式的正确性,则需要完全复制它、&&和所有内容:

代码语言:javascript
运行
复制
console.log("X" && "X" === "X" && "X" === "X"); // true

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56922135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档