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

为何JS中concat与sort方法表现异常?两种相似写法结果不同

问题解析:为什么第二段代码的concat没起作用?

嘿,这是个很典型的JavaScript数组方法误区!问题的核心在于你对concat()方法的工作原理理解有点偏差——它不会修改调用它的原数组,而是返回一个全新的拼接后的数组。

先看你的两段代码对比:

可行代码的逻辑

var globalArray = [5, 6, 3, 2, 9];
function nonMutatingSort(arr) {
  return [].concat(arr).sort(function(a, b) { return a - b; });
}
nonMutatingSort(globalArray);

这里[].concat(arr)直接生成了一个包含arr所有元素的新数组,接着我们直接对这个新数组调用sort(),自然能得到排序后的结果。

不可行代码的问题所在

var globalArray = [5, 6, 3, 2, 9];
function nonMutatingSort(arr) {
  let newArr = [];
  newArr.concat(arr); // 这里是关键错误!
  return newArr.sort(function(a,b){return a-b;});
}
nonMutatingSort(globalArray);

你执行newArr.concat(arr)的时候,这个操作确实生成了一个包含arr元素的新数组,但你没有把这个新数组赋值回newArr。所以newArr还是一开始声明的空数组[],对空数组排序当然返回空数组啦!

修正方案

只需要把concat的结果赋值给newArr就行:

let newArr = [];
newArr = newArr.concat(arr); // 把拼接后的新数组赋值给newArr
return newArr.sort(function(a,b){return a-b;});

或者更简洁的写法,直接用arr来生成新数组:

let newArr = arr.concat(); // 不传参数时,concat会返回原数组的浅拷贝
return newArr.sort(function(a,b){return a-b;});

至于你说这段代码在函数外能正常运行?大概率是你在函数外测试时,不小心使用了concat()的返回值(比如把它打印出来了),但函数内因为没赋值,所以newArr始终是空的~

内容的提问来源于stack exchange,提问作者Mladen MODD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:34:11