为何Array.prototype.forEach无返回值?如何实现数组元素转大写?
嘿,这个问题问得特别到位!咱们先把forEach为啥不返回值的事儿说清楚,再给你搞定数组转大写的需求~
为什么
forEach始终返回undefined? 其实这是方法设计目的不同导致的:
forEach从一开始就是为了执行「副作用」而生的——比如打印数组元素、修改外部变量这类操作,它的核心是“遍历并做事情”,而不是“生成新东西”。所以不管你在回调函数里写了多少return语句,forEach都不会收集这些返回值,最后固定返回undefined。- 而
map、filter这类方法,设计初衷就是基于原数组生成新数组:map会把每个元素经过回调处理后的结果收集起来,拼成新数组返回filter会筛选出回调返回true的元素,组成新数组返回
它们的核心是“转换/筛选得到新数据”,所以必然会有返回值。
你写的这段代码里,回调返回了element,但forEach完全不会理会这个返回值,最后自然输出undefined啦。
实现数组元素转大写的正确姿势
你的需求刚好是map的拿手好戏,因为map就是专门用来做元素转换的,代码简洁又符合规范:
let result = ['a', 'b', 'c'].map((element) => element.toUpperCase()); console.log(result); // 输出 ['A', 'B', 'C']
要是你非得用forEach(其实没必要,属于绕远路),也可以手动创建一个空数组,在回调里把转换后的元素塞进去:
let result = []; ['a', 'b', 'c'].forEach((element) => { result.push(element.toUpperCase()); }); console.log(result); // 同样输出 ['A', 'B', 'C']
但显然map是这类场景的最优解,代码更简洁,也更符合函数式编程的思路。
内容的提问来源于stack exchange,提问作者stratis
相关产品推荐
相关产品推荐

