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

