You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中使用concat拼接嵌套数组导致基数排序测试失败的原因

两种合并方式的差异及故障原因

核心问题出在数组引用的操作逻辑不同:

  • 你当前使用的while循环+push写法,全程操作的都是函数入参时传入的原始数组引用。你先通过shift把原数组清空,后续的push操作都是直接在这个空数组上添加元素,所有修改都会直接作用到外部传入的原数组上,符合排序算法默认「原地修改输入数组」的普遍预期。
  • concat()或者扩展运算符合并的写法,会生成全新的数组对象。你把这个新数组赋值给函数内部的numbers变量时,只是修改了函数内部局部变量的指向,外部传入的原始数组在被shift清空后不会收到任何后续修改,仍然是空数组。如果你的测试用例是直接校验输入数组的排序结果,而非函数返回值,自然会测试失败。

你可以用下面的简单代码验证这个差异:

// 原地修改写法
function sort1(arr) {
  while(arr.length) arr.shift();
  arr.push(1,2,3);
  return arr;
}

// 生成新数组写法
function sort2(arr) {
  while(arr.length) arr.shift();
  arr = arr.concat([1,2,3]);
  return arr;
}

const test1 = [3,2,1];
const res1 = sort1(test1);
console.log(test1); // 输出 [1,2,3],原数组被修改
console.log(res1 === test1); // 输出 true,返回值和原数组是同一个引用

const test2 = [3,2,1];
const res2 = sort2(test2);
console.log(test2); // 输出 [],原数组清空后无后续修改
console.log(res2 === test2); // 输出 false,返回值是全新数组

如果你的测试用例仅校验函数返回值,concat写法也能得到正确的排序结果;但如果测试默认校验输入数组的原地排序效果,concat写法就会失败。

内容的提问来源于stack exchange,提问作者N'Bayramberdiyev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 06:21:01