关于node.js 隐式修改数组长度的问题

// 删除手牌

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 == handCards[handCards.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(cards[i]);
console.warn("==pos:",pos);
console.warn("==handCards:", JSON.stringify(handCards));
console.warn("==cards:", JSON.stringify(cards));
console.warn("==cards[i]:", cards[i]);
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]

==cards[i]: 214

==pos: 1

==handCards: [114,314]

==cards: [114,314]

==cards[i]: 314

==pos: -1

==handCards: [114]

==cards: [114]

可以看到,cards 和 handCards 都删除了元素,但是代码中明明只对handCards 数组进行了删除操作,在这里cards 被意外的删除了元素,导致访问了一个空的元素

修改方式就是,深拷贝一个 cards, 然后就可以了。

相关推荐
天下代码客10 小时前
使用electronc框架调用dll动态链接库流程和避坑
前端·javascript·vue.js·electron·node.js
weixin1997010801611 小时前
【性能提升300%】仿1688首页的Webpack优化全记录
前端·webpack·node.js
不倒翁玩偶12 小时前
npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
前端·npm·node.js
一心赚狗粮的宇叔14 小时前
03.Node.js依赖包补充说明及React&Node.Js项目
前端·react.js·node.js
-嘟囔着拯救世界-15 小时前
【2026 最新版】OpenAI 祭出王炸 GPT-5.3-Codex!Win11 + VSCode 部署保姆级教程
vscode·gpt·chatgpt·node.js·node·codex·gpt5
全栈前端老曹1 天前
【MongoDB】Node.js 集成 —— Mongoose ORM、Schema 设计、Model 操作
前端·javascript·数据库·mongodb·node.js·nosql·全栈
行者无疆_ty1 天前
什么是Node.js,跟OpenCode/OpenClaw有什么关系?
人工智能·node.js·openclaw
-凌凌漆-1 天前
【npm】npm的-D选项介绍
前端·npm·node.js
lucky67071 天前
Windows 上彻底卸载 Node.js
windows·node.js
Android系统攻城狮1 天前
鸿蒙系统Openharmony5.1.0系统之解决编译时:Node.js版本不匹配问题(二)
node.js·鸿蒙系统·openharmony·编译问题·5.1