forEach 高频面试题及详细答案(实战向)_第1页
forEach 高频面试题及详细答案(实战向)_第2页
forEach 高频面试题及详细答案(实战向)_第3页
forEach 高频面试题及详细答案(实战向)_第4页
forEach 高频面试题及详细答案(实战向)_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

forEach高频面试题及详细答案(实战向)一、基础概念题1.简单说说forEach的作用和基本语法答案:forEach是JavaScript数组自带的遍历方法,核心作用是遍历数组每一项,执行自定义回调函数,主要用于批量处理数组元素,比如打印数据、修改数组项、批量赋值等。基本语法:arr.forEach((item,index,arr)=>{})三个回调参数:item:当前遍历的数组元素(必选)index:当前元素的索引(可选)arr:原数组本身(可选)额外特点:forEach没有返回值,默认返回undefined。2.forEach能不能遍历对象?如果不行,怎么实现对象遍历?答案:forEach只能遍历数组,不能直接遍历普通对象,普通对象没有这个方法,直接调用会报错。如果要用forEach遍历对象,需要先把对象转换成数组,常用两种方式:Object.keys(obj):获取对象键名数组,配合forEach遍历键名Object.values(obj):获取对象值数组,配合forEach遍历值示例代码:PlainText

constobj={name:'张三',age:20}

Object.keys(obj).forEach(key=>{

console.log(key,obj[key])

})二、核心特性与易错坑点(面试高频)1.forEach能不能中断、跳出循环?break、return有效吗?答案:forEach无法通过break、continue、return中断遍历,这是面试最常考的核心坑点。在forEach回调里写break、continue:直接报语法错误在forEach回调里写return:只能终止当前这一次回调的执行,相当于跳过当前项,无法终止整个遍历,后续元素会继续遍历如果需要可中断的遍历,优先用普通for循环、for...of循环。补充:如果强行要中断forEach,只能通过try/catch抛异常的方式,业务中不推荐,可读性差。2.forEach遍历过程中,修改原数组元素,遍历结果会变吗?答案:分两种情况,规则很简单:修改基本数据类型的元素(数字、字符串、布尔):不会影响遍历结果。因为forEach遍历的是数组每一项的拷贝值,修改拷贝值不改变原数组对应项,遍历全程读取的是初始数组数据。修改引用类型的元素(对象、数组):会影响遍历结果。因为引用类型遍历的是内存地址,修改地址对应的内容,原数组元素会同步变化。额外重点:遍历中新增/删除数组项,会出现遍历错乱。比如遍历过程中删除当前项,数组长度变短,后续元素索引前移,会导致部分元素被跳过,遍历不完整,这是开发中高频出错点。3.forEach遍历空数组、稀疏数组会发生什么?答案:空数组:直接不执行回调函数,无报错,静默结束。稀疏数组(存在空空位,比如[1,,3]):会自动跳过空位,不执行回调,只遍历有值的元素。区别于普通for循环,普通for循环会遍历到空位,读出undefined,而forEach直接忽略空位。4.forEach回调里的this指向问题答案:forEach默认的this指向:普通函数回调:非严格模式下this指向window,严格模式下指向undefined箭头函数回调:this继承外层作用域的this,无法手动修改forEach支持第二个参数,用来手动绑定回调内部的this:PlainText

constarr=[1,2,3]

constobj={num:10}

arr.forEach(function(item){

console.log(this.num+item)

},obj)//第二个参数绑定this为obj注意:箭头函数无法通过forEach第二个参数绑定this。三、对比类面试题(必考)1.forEach和map的核心区别是什么?(最常问)答案:两者都用于遍历数组,语法相似,但返回值、使用场景、性能逻辑完全不同:返回值不同forEach:无返回值,返回undefinedmap:返回新数组,数组长度和原数组一致,每一项是回调的返回值使用场景不同forEach:纯遍历、副作用操作(修改原数组、打印、赋值、请求等),不需要生成新数组map:数据映射、数据加工,需要根据原数组生成一个全新的数组,不修改原数组链式调用不同forEach不能链式调用,返回undefined,后面无法接filter、reduce等方法map可以链式调用,返回新数组,可继续调用数组方法核心总结:只遍历用forEach,要改数据生成新数组用map。2.forEach和for...of的区别?开发中怎么选择?答案:遍历灵活性forEach:无法中断、无法跳过,只能完整遍历for...of:支持break、continue、return,可随时中断遍历遍历范围forEach:仅支持数组for...of:支持数组、字符串、Map、Set等所有可迭代对象获取参数forEach可直接获取item、index、原数组for...of默认只能获取item,需要索引需搭配Array.keys()使用选择:简单批量处理、不需要中断、需要索引:用forEach需要中断遍历、遍历非数组可迭代对象:用for...of3.forEach为什么不支持异步?async/await失效问题答案:日常开发中经常遇到forEach加async/await无法串行执行的问题,核心原因:forEach底层不识别Promise,不会等待异步函数执行完毕,只会同步批量执行所有异步回调,导致所有异步操作几乎同时触发,变成并行,无法串行。举例:依次延时打印,forEach会全部同时打印,不会按顺序等待:PlainText

asyncfunctionfn(){

constarr=[1,2,3]

arr.forEach(async(item)=>{

awaitnewPromise(res=>setTimeout(res,1000))

console.log(item)

})

}

//结果:1秒后同时打印1、2、3,不是每隔1秒打印一个解决方案:需要异步串行遍历,放弃forEach,使用for...of循环。四、手写源码题(进阶面试)题目:手动实现一个简易版forEach方法答案:实现思路:挂载到数组原型上,让所有数组可调用遍历数组每一项,循环执行回调依次传入item、index、原数组参数支持this绑定手写代码:PlainText

Atotype.myForEach=function(callback,thisArg){

//遍历的数组就是调用方法的实例

constarr=this

//数组长度

constlen=arr.length

//循环遍历每一项

for(leti=0;i<len;i++){

//跳过稀疏数组空位(和原生forEach保持一致)

if(!(iinarr))continue

//执行回调,绑定this,传参itemindexarr

callback.call(thisArg,arr[i],i,arr)

}

}

//测试

constlist=[11,22,33]

list.myForEach((item,index)=>{

console.log(index,item)

})五、代码输出判断题(面试真题)真题1:下面代码输出结果是什么?PlainText

constarr=[1,2,3,4]

arr.forEach(item=>{

if(item===2)return

console.log(item)

})答案:输出1、3、4解析:return只终止当前item=2的回调执行,跳过当前项,不会终止整个遍历,后续3、4正常遍历打印。真题2:异步forEach输出顺序PlainText

constar

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论