Javascript 在另一个函数中多次调用的函数抛出TypeError:Cannotreadproperty';西服';未定义的

Javascript 在另一个函数中多次调用的函数抛出TypeError:Cannotreadproperty';西服';未定义的,javascript,undefined-variable,Javascript,Undefined Variable,我正在尝试创建一个函数,用于检查两副牌的顺序是否相同 我已经编写了一个助手函数cardEq,用来测试两张卡是否相同,并且它可以工作。它在deckEq功能中不起作用 //Card Struct //value 1 is ace, 11 is Jack, 12 is Queen, and 13 is King function Card(suit, value, color){ this.suit = suit, this.value = value, this.color = colo

我正在尝试创建一个函数,用于检查两副牌的顺序是否相同

我已经编写了一个助手函数cardEq,用来测试两张卡是否相同,并且它可以工作。它在deckEq功能中不起作用

//Card Struct
//value 1 is ace, 11 is Jack, 12 is Queen, and 13 is King
function Card(suit, value, color){
  this.suit = suit,
  this.value = value,
  this.color = color
}

//Check if two Cards are the same
function cardEq(card1, card2){
  if(card1.suit === card2.suit
     && card1.value === card2.value
     && card1.color === card2.color){
    return true;
  } else {return false;}
}

//Check if two Decks/arrays of Cards are in the same order
function deckEq(deck1, deck2){
  let i = 0;
  let flag = false;
  while (i < 53){
    let x = deck1[i];
    let y = deck2[i];
    if(cardEq(x, y) === true){
      flag = true;
      i = i + 1;
    } else {flag = false; break;}
  }
  return flag;
}
//卡结构
//值1是王牌,11是杰克,12是女王,13是国王
功能卡(套装、价值、颜色){
这套衣服,
this.value=value,
这个颜色
}
//检查两张卡是否相同
功能卡片EQ(卡片1、卡片2){
如果(card1.suit==card2.suit
&&card1.value==card2.value
&&card1.color==card2.color){
返回true;
}else{return false;}
}
//检查两副牌/两排牌的顺序是否相同
功能deckEq(deck1,deck2){
设i=0;
让flag=false;
而(i<53){
设x=1[i];
设y=2[i];
if(cardEq(x,y)==true){
flag=true;
i=i+1;
}else{flag=false;break;}
}
返回标志;
}
我希望它返回true或false,但它会抛出错误: TypeError:无法读取未定义的属性“suit” 在cardEq(回复:2:12) 在deckEq(回复:7:8)


编辑:我将while语句中的(I<53)更改为(I<52)。谢谢你抓到克里斯托弗和特拉克托53。我猜问题是函数调用了数组中不存在的项(第52个)上的cardEq。由于这是为了比较卡片组,因此它应该只运行到第51个元素(第52张卡片)。

仅当函数用作“”时,函数内部才起作用,这需要构造函数生成的对象的
新实例。这就是
将绑定到的对象,否则,
将绑定到
窗口
,并且
窗口
没有
suit
属性

//卡结构
//值1是王牌,11是杰克,12是女王,13是国王
功能卡(套装、价值、颜色){
这套衣服,
this.value=value,
这个颜色
}
//检查两张卡是否相同
功能卡片EQ(卡片1、卡片2){
如果(card1.suit==card2.suit
&&card1.value==card2.value
&&card1.color==card2.color){
返回true;
}else{return false;}
}
//检查两副牌/两排牌的顺序是否相同
功能deckEq(deck1,deck2){

让ceq=new cardEq(x,y);//正如@Christopher所推测的,问题是在deckEq中检查52张零基数组中的53张卡。将while循环语句更改为

  while (i < 52){
while(i<52){
要查看它在52卡组中是否正常工作-

“严格使用”;
//卡片结构
//值1是王牌,11是杰克,12是女王,13是国王
功能卡(套装、价值、颜色){
这套衣服,
this.value=value,
这个颜色
}
//检查两张卡是否相同
功能卡片EQ(卡片1、卡片2){
如果(card1.suit==card2.suit
&&card1.value==card2.value
&&card1.color==card2.color){
返回true;
}else{return false;}
}
//检查两副牌/两排牌的顺序是否相同
功能deckEq(deck1,deck2){
设i=0;
让flag=false;
而(i<52){
设x=1[i];
设y=2[i];
if(cardEq(x,y)==true){
flag=true;
i=i+1;
}else{flag=false;break;}
}
返回标志;
}
函数createDeck(){
const deck=[];
常量颜色=[“黑色”、“红色”、“红色”、“黑色”];
对于(变量i=0;i<52;++i){
var套件=数学楼层(i/13);
var值=i%13+1;
var color=颜色[套件];
推牌(新牌(套牌、价值、颜色));
}
返回甲板;
}
设deck1=createDeck();
设deck2=createDeck();
console.log(deckEq(deck1,deck2));//预期为true
deck2[42]=deck2[0];

console.log(deckEq(deck1,deck2));//期望false
只是一个想法,而应该是I<52,因为如果你在做一个标准的52卡组,组[52]将是未定义的,因为它从组[0]开始你如何构建你的牌组以及如何调用
deckEq
?@Thomas我有一个函数,可以创建一个卡数组,里面有52张卡。我在两个这样的数组上调用deckEq。
new careEq(x,y)
?cardEq是一个简单的比较器,没有构造函数。请注意,错误是无法在
未定义的
上查找
套件
。在Firefox中,报告为“card1”未定义。@Thomas
cardEq()
包含
,它在函数中用于创建实例属性。如果没有实例,则无法获取实例属性。因此,该函数需要用作构造函数。@traktor53 OP尚未提供他用于启动此代码的所有代码,因此,您获得该错误的事实意味着您尚未启动提供的代码所需的所有依赖对象。这是
Card
而不是
cardEq
。但是
Card
在代码段中的任何位置都不会被调用;也不会在您的代码段或OPs中被调用。