试图了解React JS示例中使用的逻辑运算符(a& a = a b&& a === C)

时间:2017-11-20 13:12:41

标签: javascript reactjs logical-operators

有人可以,请举例说明以上内容。 当你把它改成(a === b === C)时会发生什么。 一直试图在reactjs.org中更好地理解这种逻辑,虽然运作良好,但逻辑的工作方式仍然不清楚

从React教程

复制的示例代码

`

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],
    ];
    //alert(lines.length);
    for (let i = 0; i < lines.length; i++) {
        const [a, b, c] = lines[i];
        //alert(squares[a]);
        if (squares[a] && squares[a] === squares[b] && squares[a] === squares[c]) {
            return squares[a];
        }
    }
    return null;
}

`

来自ReactJS.org  https://codepen.io/prgriffithsdev/pen/EbQZeR

8 个答案:

答案 0 :(得分:4)

JavaScript的if语句(以及其他流量控制结构)强制值,如果它们还不是布尔值。这条线

if (squares[a] && squares[a] === squares[b] && squares[a] === squares[c]) {

将三个表达式与&&连接在一起,它们对它们进行逻辑AND。这三个表达式是:

  • squares[a]
  • squares[a] === squares[b]
  • squares[a] === squares[c]

&&只需要两个操作数(两边都有)。其结果是评估第一个操作数是否为 truthy 的结果,或者如果第一个操作数是 falsy 则评估其第二个操作数的结果。真实价值是任何不虚假的价值。虚假值为0""NaNnullundefined,当然还有false

如果squares[a] && squares[a] === squares[b]的两个操作数都评估为真值,那么r将是真实的,如果它们的 评估为虚假值,则为假。

然后在r && squares[a] === squares[c]中使用了结果(让我们称之为if),如果两个操作数都具有真值并且如果它们中的任何一个是假的,那么这也是真实的。

完成所有操作后,if将truthy / falsy结果强制转换为boolean(truthy =&gt; true,falsy =&gt; false),如果条件为true则分支到( a === b ===C)的正文中是a === b === C

  

当您将其更改为a === b

时会发生什么

它会停止工作,因为true没有按照您的想法行事。它会false rr === C(称之为C),然后{A,B,C,D} <-> {D,E,F} => true。除非{A,B,C} <-> {D,E,F} => false是布尔值,否则将为false。

答案 1 :(得分:0)

squares[a] && squares[a] === squares[b] && squares[a] === squares[c]

在上面的陈述中,square [a]应该等于square [b]和square [c],也应该是truthy值。

Truthy值: https://developer.mozilla.org/en-US/docs/Glossary/Truthy

如果你改变它square[a] === square[b] === square[c],那么它将首先比较前两个,结果布尔值将与square[c]进行比较

例如,如果

square[a] = 1;
square[b] = 1;
square[c] = 1;

然后将评估第一个square[a] === square[b],它将返回true。然后将评估true === square[c],它将返回`false。

答案 2 :(得分:0)

foo === bar === baz并不意味着“如果foo,bar和baz相同。”

首先评估表达式的第一部分,所以想一想:

(foo === bar) === baz

foo === bar评估的内容是什么? truefalse。因此它变为true === bazfalse === baz

另一方面,

foo === bar && foo === baz表示“如果foo,bar和baz相同。”

答案 3 :(得分:0)

如果您不了解逻辑门(即&&,||),请先阅读有关逻辑门的信息,或者您知道上面提到的这种逻辑

if (squares[a] && squares[a] === squares[b] && squares[a] === squares[c])

似乎并不容易,然后理解此逻辑,然后尝试理解以下与上面相同的逻辑

if (squares[a] === squares[b] && squares[b] === squares[c])

也许有帮助。

答案 4 :(得分:0)

我发现(squares[a] && (squares[a] === squares[b]) && (squares[a] === squares[c])) 这将是代表我理解的答案的好方法。 因此,当squares[a] is not null and squares[a]===squares[b] and squares[a]===squares[c]时,结果为true并执行返回值..

这有点令人困惑。.感谢大家的帮助

答案 5 :(得分:0)

var a=null, b=null ,c=null;

if(a === b && a === c)   // it gives true
    console.log("true 1 case")

if(a && a === b && a === c)
    console.log("true 2 case")

If you are using 1st condition then it gives true in all null values
so they use (a && a) because to get actual value ('X' or 'O').

答案 6 :(得分:0)

如果这是您第一次使用 javascript/react,那么您可能很难像我和这个问题的作者一样理解井字游戏的例子。 我来自 C++ 和 java,所以很自然地,代码一开始没有意义。经过一个小时的尝试解决这个问题,这就是我必须考虑的事情才能让它有意义。

if 语句在做什么:

(squares[a]) && (squares[a] == squares[b]) && (squares[a] == squares[c])

第一个表达式 squares[a] 等价于 squares[a] != null

另外两个只是相互比较。

答案 7 :(得分:0)

 for (let i = 0; i < lines.length; i++) {
   const [a, b, c, d] = lines[i];
 if (squares[a] && squares[a] === squares[b] && squares[a] === squares[c] && squares[a] === squares[d]) {
   return squares[a];
   }
 }

上面的代码对我来说适用于 React 教程的 4x4 网格。基本上,我添加了 squares[a] === squares[d]。希望这对使用 4x4 网格尝试本教程的人有所帮助。