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
相关产品推荐
相关产品推荐

