能否一行返回执行方法后的Array?解析push返回值异常问题
一行代码返回执行方法后的数组 & 两种写法的差异解析
当然可以用一行代码返回执行过指定方法的数组,不过得看你用的是哪种数组方法——毕竟不同方法的返回值规则不一样,这也是你遇到第二种写法返回长度而非数组的核心原因。
先给你拆解第二个问题,这是你困惑的根源:
两种写法的差异与第二种的运行逻辑
假设你的两种写法大概是这样(我根据常见场景还原的):
写法一(正确返回数组)
const myArr = [1, 2, 3]; myArr.push(4); return myArr; // 或者一行简化版:return (myArr.push(4), myArr);
写法二(返回数组长度)
const myArr = [1, 2, 3]; return myArr.push(4); // 这里返回的是4,不是[1,2,3,4]
问题出在数组方法的返回值规则上:
- 像
push、unshift这类会修改原数组的方法,它们的返回值是数组的新长度,而不是修改后的数组本身。所以写法二直接返回push的结果,自然得到的是数字(长度)。 - 写法一要么是先执行
push修改原数组,再单独返回数组;要么用了逗号运算符——逗号运算符会依次执行前面的所有表达式,最后返回最后一个表达式的结果,所以(myArr.push(4), myArr)会先完成添加元素的操作,再返回数组本身。
补充个小知识点:不是所有修改原数组的方法都返回长度,比如sort、reverse修改原数组后,返回的就是数组本身,所以return myArr.sort()会直接返回排序后的数组;而pop、shift则返回被移除的元素。
如何用一行代码返回执行方法后的数组
分两种场景处理:
场景1:使用不修改原数组的方法(推荐)
如果不想改动原数组,优先用这类返回新数组的方法,一行就能直接返回结果:
// 添加元素:用扩展运算符或concat return [...[1,2,3], 4]; // 返回[1,2,3,4] return [1,2,3].concat(4); // 返回[1,2,3,4] // 转换元素:用map return [1,2,3].map(num => num * 2); // 返回[2,4,6] // 筛选元素:用filter return [1,2,3,4].filter(num => num % 2 === 0); // 返回[2,4]
场景2:必须使用修改原数组的方法
如果一定要用push、unshift这类方法,用逗号运算符或者立即执行函数就能一行搞定:
// 逗号运算符写法,会修改原数组 const myArr = [1,2,3]; return (myArr.push(4), myArr); // 立即执行函数,不影响外部数组(创建新数组并修改) return (arr => (arr.push(4), arr))([1,2,3]);
最后提醒一句:如果不是有特殊需求,尽量用不修改原数组的方法,避免因为原数组被意外改动导致的bug哦~
内容的提问来源于stack exchange,提问作者Casey
相关产品推荐
相关产品推荐

