所以我正在制作一个井字游戏。这个阵列是所有可能的胜利条件。
let array = [
{box1: "empty", box2: "empty", box3: "empty"},
{box1: "empty", box4: "empty", box7: "empty"},
{box1: "empty", box5: "empty", box9: "empty"},
{box2: "empty", box5: "empty", box8: "emtpy"},
{box3: "emtpy", box6: "emtpy", box9: "empty"},
{box3: "empty", box5: "empty", box7: "empty"},
{box4: "empty", box5: "empty", box6: "emtpy"},
{box7: "emtpy", box8: "empty", box9: "emtpy"}
];
下一段代码用于检查是否符合获胜条件。
for(let i = 0; i < array.length; i++){
if(Object.values(array[i]) === "o","o","o"){
console.log('o won');
} else if (Object.values(array[i]) === "x","x","x"){
console.log('x won');
} else if (Object.values(array[i]) === "empty","empty","empty"){
console.log('works as expected');
} else {
console.log('total fail');
}
}
当你运行它时,你会发现记录了“o won”。我很困惑为什么会这样做。 Object.values返回一个数组。当我使用严格等于比较这些值时,它似乎仍然在检查每个值是否为字符串而不是比较实际的字符串。
答案 0 :(得分:2)
您的代码使用逗号运算符,该运算符从左到右计算每个操作数并返回最后一个操作数。在下面的行中,最后一个操作数是&#34; o&#34;,一个非空字符串,当隐式转换为布尔值时为true。因此,这个表达式将永远为真:
if(Object.values(array[i]) === "o","o","o"){
逗号操作员:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator
要确定两个数组是否相等,可以使用如下函数:
function arraysEqual(a, b) {
return a.length == b.length && a.every(function(element, index) {
return element === b[index];
});
}
if (arraysEqual(myArray, ['x', 'x', 'x'])) {
// they're equal
}
答案 1 :(得分:1)
你不能像这样进行平等比较 - 你应该明确地测试每个单独的值,如下所示:
const arrayItem = {box1: "o", box2: "o", box3: "o"}
if(Object.values(arrayItem).every(item => item === "o")) console.log('o wins');
&#13;
数组(对象)引用内存位置,如果对象引用内存中的相同位置,则它们只被认为是相等的,所以即使语法正确,你也无法做到你原来的样子。试图做:
if(Object.values(array[i]) === ["o","o","o"])
因为新创建的["o","o","o"]
没有引用与array
变量中的对象相同的对象。
答案 2 :(得分:0)
为您的行使用括号。
for(let i = 0; i < array.length; i++){
if(Object.values(array[i]) === ["o","o","o"]){
console.log('o won');
} else if (Object.values(array[i]) === ["x","x","x"]){
console.log('x won');
} else if (Object.values(array[i]) === ["empty","empty","empty"]){
console.log('works as expected');
} else {
console.log('total fail');
}
}