技术 | 前端面试题(三):实现 indexOf

2,487 阅读2分钟
原文链接: mp.weixin.qq.com

我和阿里巴巴的同事守雌将为大家带来一个系列专题:前端面试题解析,一周更新两篇,也许答案可能不是最优的,但是也可以给你提供解决问题的思路。面试题力求实战,期望对于找工作的你,温故而知新的你,能有所帮助。




题目:有一组Msg类型的消息,我需要知道其中一条消息是否存在,实现indexOf,存在返回第一个索引,不存在返回-1。


虽然indexOf在ECMA-262标准的第五版被加入,这道题其实分了几个步骤去考察面试者,不仅仅是运用的程度,还包括综合思考的情况,有时候,你认为你答的不错,其实评判的标准,可能才刚刚及格,抛出这个题目,让大家多思考一下,下面的几个例子,不一定是最优的。


Array.prototype.indexOf = function(val){  
   return this.join('').indexOf(val.join('')) }


有时候偷懒,只是耍了下技巧,可能面试官并不想看到这个。


从零开始想一想,我们需要经过多少个步骤:


  • 判断this是否为null

  • 判断val是否为Msg类型,如果不是直接返回-1

  • 循环当前数组,记录下val的下标

  • 如果有返回val的下标,不存在返回-1


其实,我个人认为判断val是否未定义其实是有争议的,如果数组里正好是0呢?不过,我们这个题目已经说明了,数组是一个Msg类型的消息,所以判断一下如果elem不是Msg类型,应该是要直接返回-1的,这里偷懒一下如果!elem就返回-1。


Array.prototype.indexOf = function(elem){  
   if(this == null || !elem){
       return -1; }
   var i = 0;
   var cur = -1;
   var len = this.length;
   while(true){
       if(this[i] === elem){ cur = i;
           break; } else { i++;
           if(len === i){
               break; }
           continue; } }
   return cur; }


如果你的答案写出来了这个,基本算是及格了,发散一下,既然给定了元素,如果再给定开始查找的位置,该如何实现,比如:


Array.prototype.indexOf = function(elem,fromIndex){

}