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