有人可以,请举例说明以上内容。 当你把它改成(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
答案 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
,""
,NaN
,null
,undefined
,当然还有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
r
或r === 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
评估的内容是什么? true
或false
。因此它变为true === baz
或false === 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 网格尝试本教程的人有所帮助。