前端攻城狮学习笔记一:实现一个遍历数组或对象里所有成员的迭代器
面试题目
这是搜狐JavaScript面试题,要求如下:
实现一个遍历数组或对象里所有成员的迭代器。
var each = function(obj, fn){ //+++++++++++答题区域+++++++++++ //+++++++++++答题结束+++++++++++ }; try{ var data1 = [4,5,6,7,8,9,10,11,12]; var data2 = { "a": 4, "b": 5, "c": 6 }; console.group(data1); each(data1, function(o){ if( 6 == this ) return true; else if( 8 == this ) return false; console.log(o + ": \"" + this + "\""); }); console.groupEnd(); /*------[执行结果]------ 1: "4" 2: "5" 4: "7" ------------------*/ console.group(data2); each(data2, function(v, n){ if( 5 == this ) return true; console.log(n + ": \"" + v + "\""); }); console.groupEnd(); /*------[执行结果]------ a: "4" c: "6" ------------------*/ }catch(e){ console.error("执行出错,错误信息: " + e); }
分析过程
分析如下:
要遍历数组或对象成员,因此要对传入对象进行判断:
if(obj instanceof Array){ } else if(obj instanceof Object){ } else{ }
当传入的是Array对象时,从调用和输出可以看出,要用到call方法,并且第一个参数为数组的值,第二个参数为元素索引(从1开始),并且当返回值为false时,结束此过程。所以代码如下:
if(obj instanceof Array){ for(var i=0,l=obj.length;i<l;i++){ var temp=fn.call(obj[i],i+1); if(temp === false){ return; } } }
当传入的是一个对象时,要对对象成员进行遍历,并且要传入三个参数,第一个和第二个为成员值,第三个为成员名称。所以代码如下:
else if(obj instanceof Object){ for(var e in obj){ fn.call(obj[e],obj[e],e); } }
最后完整代码如下:
var each = function(obj, fn){ //+++++++++++答题区域+++++++++++ if(obj instanceof Array){ for(var i=0,l=obj.length;i<l;i++){ var temp=fn.call(obj[i],i+1); if(temp === false){ return; } } } else if(obj instanceof Object){ for(var e in obj){ fn.call(obj[e],obj[e],e); } } else{ } //+++++++++++答题结束+++++++++++ };
小结
本面试题主要考查了 instanceof 的用法,call的用法,对数组的遍历,对对象成员的遍历等知识点。
分类:
JavaScript
标签:
JavaScript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库