JavaScript 中数组引用陷阱与“破纪录”问题的正确解法

张开发
2026/4/21 1:14:26 15 分钟阅读

分享文章

JavaScript 中数组引用陷阱与“破纪录”问题的正确解法
本文详解如何修复因数组引用导致的逻辑错误通过深拷贝避免副作用正确统计运动成绩中最高分和最低分的“破纪录”次数。 本文详解如何修复因数组引用导致的逻辑错误通过深拷贝避免副作用正确统计运动成绩中最高分和最低分的“破纪录”次数。在解决经典的「Breaking Records」问题即统计某人连续比赛成绩中打破个人最高分和最低分的次数时一个常见但隐蔽的陷阱是数组的引用传递问题。原始代码看似逻辑清晰分别定义 HP()High Peak和 LP()Low Peak函数来模拟遍历过程并计数但实际运行结果却偏离预期如输入 [10, 5, 20, 20, 4, 5, 2, 25, 1] 应输出 [2, 4]却得到错误值根本原因在于两个函数内部均直接赋值 var b array 和 var a array导致它们操作的是同一份原始数组的引用副本。当 HP() 执行时它调用 b.splice() 动态修改了数组内容——而由于 b 与外部 array 指向同一内存地址后续 LP() 接收到的 array 已被污染不再是原始输入。这破坏了算法的独立性假设使两次扫描失去基准一致性。? 正确做法是每次传入前创建数组的浅拷贝。JavaScript 中最简洁安全的方式是使用展开运算符 [...array]function HP(array) { var b [...array]; // ? 创建新数组隔离副作用 let temp b[0]; let count 0; for (let i 1; i b.length; i) { if (b[i] temp) { temp b[i]; count; } } return count;}function LP(array) { var a [...array]; // ? 同样独立拷贝 let temp a[0]; let count 0; for (let j 1; j a.length; j) { if (a[j] temp) { temp a[j]; count; } } return count;}? 注意原代码中还存在多处潜在风险立即学习“Java免费学习笔记深入” 橙篇 百度文库发布的一款综合性AI创作工具

更多文章