// 删除手牌
proto.remove = function (handCards, _cards) {
let saveHandCards = this.deepCloneTL(handCards);//保存原先的牌
console.warn("删除手牌000:",JSON.stringify(handCards));
console.warn("删除手牌111:",JSON.stringify(_cards));
// console.warn("删除手牌111 typeof:",typeof (cards));
var cards = this.deepCloneTL(_cards);
let len = handCards.length;
if (typeof (cards) == 'number') {
if (cards == handCardshandCards.length - 1) {
return (handCards.pop(), true);
} else {
let pos = handCards.indexOf(cards);
if (pos == -1){
handCards = saveHandCards;//出错之后,不删除手牌
return false;
}
return (handCards.splice(pos, 1), true);
}
}
var length = cards.length;
for (let i = 0; i < length; ++i) {
let pos = handCards.indexOf(cardsi);
console.warn("==pos:",pos);
console.warn("==handCards:", JSON.stringify(handCards));
console.warn("==cards:", JSON.stringify(cards));
console.warn("==cardsi:", cardsi);
if (pos == -1) {
handCards = saveHandCards;//出错之后,不删除手牌
return false;
}
handCards.splice(pos, 1);
}
let len2 = handCards.length;
//如果剩余的张数,不等于 原先的张数 减去 出牌的张数,那么出牌出错
// console.warn("len2:"+len2+"len:"+len + "length:" +length );
if(len2 != (len - length )){
handCards = saveHandCards;//出错之后,不删除手牌
return false;
}
return true;
};
对于数组 handCards = 114,214,314, _cards = 114,214,314 时,存在一个特别奇怪的bug,
在上面的代码中,红色字体颜色的代码是修改之后的添加的,原方法是 proto.remove = function (handCards, cards),然后没有红色字体颜色的代码,那么在这两个数组完全相同的时候,在蓝色字体颜色的代码中,我直接对 handCards 操作,删除了 cards 中的元素,已达到删除打出牌之后更新手牌的操作,但是这时候就会出现一个很奇怪的问题,那么就是我的 cards 数组也删除了对应的元素,下面黄色颜色字体是原输出
==pos: 0
==handCards: 214,114,314
==cards: 214,114,314
==cardsi: 214
==pos: 1
==handCards: 114,314
==cards: 114,314
==cardsi: 314
==pos: -1
==handCards: 114
==cards: 114
可以看到,cards 和 handCards 都删除了元素,但是代码中明明只对handCards 数组进行了删除操作,在这里cards 被意外的删除了元素,导致访问了一个空的元素
修改方式就是,深拷贝一个 cards, 然后就可以了。