关于React.js教程中的代码片段,我有一个问题。我是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"。
有人能解释我的推理错误在哪里吗?
非常感谢!
塞巴斯蒂安贝尔
发布于 2019-07-07 12:46:19
您围绕&&操作符的推理是正确的。
问题在于您对===运算符的理解。在数学中,您可以以预期的方式使用相等(x =x= x),并且您将有一个正确的(true)语句。但在编程中,它不是这样工作的。
对每个操作符进行逐个评估。
所以你一开始:
"X" === "X" === "X"这将作为两个单独的语句进行评估。左边的运算符首先为该运算符求值(这称为运算符的结合性 )。您可以在第一个语句周围加上括号,使其显式化,如下所示:
("X" === "X") === "X"对括号中的语句进行计算,留下:
true === "X"这现在计算为false,因为true不等于"X"。
我建议您不要使用,尝试以这种方式使用相等运算符(a === b === c)。其他等式操作符(如!== )也是如此。这不是一种典型的编程模式,很可能会让其他程序员感到困惑,就像它使您感到困惑一样。
要测试三个项的相等性,请始终使用&&操作符,如下所示:a === b && b === c。这表明,每个等式测试都是一个接一个地进行的。
发布于 2019-07-07 12:31:04
假设数组的前三个值是"X",if语句将解析为"X“& "X”=== "X“&& "X”=== "X“。这将导致"X“=== "X”X“=== "X”。
不,这会导致"X" && true && true
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、""、null、undefined、NaN,当然还有false。所有其他的价值观都是真实的--他们强迫true。
发布于 2019-07-07 12:29:48
因为===是一个二进制运算符(它一次只能在两个操作数上工作)。
"X" === "X" === "X"等于
(("X" === "X") === "X")(首先,在前两个操作数之间计算第一个===,然后将结果与第三个操作数进行比较。)
这相当于
true === "X"当然,也就是false。
如果您想测试逻辑表达式的正确性,则需要完全复制它、&&和所有内容:
console.log("X" && "X" === "X" && "X" === "X"); // true
https://stackoverflow.com/questions/56922135
复制相似问题