最近面了字节,这个问题直接把我问的怀疑人生。所以简单总结下,以备日后。
面试官问:js的数组有几个方法,forEach、map、filter,它们有什区别?
我:刚开始回答说map和filter必须要有返回值,forEach可以没有。
面试官问:那如果我一定要在forEach中return什么呢,会怎么样?
我:(直接虚了)磕磕巴巴的说,应该不会怎么样吧[~泪崩]。
面试官笑了问:行,那我换个问法,你能说一下下面arr和newArr执行后的值吗?
let arr = [1, 4, 6, 2];
let newArr1 = arr.filter(item=> item < 2) // 不改变原数组 arr不变 但newArr=[1]
let newArr2 = arr.forEach(item=>item < 2) // arr 不变 newArr= undefined
let newArr3 = arr.map(item=>item < 2) // arr 不变 newArr=[ true, false, false, false ]
我:(当时脑子一片空白,浑然忘了他们平时用的时候都返回数组,心想着里面肯定有坑,我不能上当,嗯,一定是这样的)抠了半天最后写了个filter返回1 map返回[1],(现在想来后悔啊,还不如当时直接说不清楚…言多比失)
1. forEach
- 可以改变数组自身,没有返回值;
- 中途不能用常规操作跳出循环,可以用抛出异常(try/catch)的方式,但不推荐这样做;
- 不支持链式操作
2. map
forEach的一些局限性它很多都能解决。map即映射,也就是原数组被映射成对应新数组
。
- 返回一个新数组,原始数组在调用它后不会发生变化;
- 该数组中的每个元素都调用一个提供的函数,后返回结果。map中每个元素都要执行相应的回调函数,所以必须要有return
3.filter
- 返回一个新数组,原始数组在调用它后不会发生变化;
- map没法做到的过滤,就交给filter去完成