这是淘宝UED招聘题中的两道JavaScript题目。
题目一要求
小贤是一条可爱的小狗(Dog),它的叫声很好听(wow),每次看到主人的时候就会乖乖叫一声(yelp)。从这段描述可以得到以下对象:
function Dog() { this.wow = function() { alert(’Wow’); } this.yelp = function() { this.wow(); } }
小芒和小贤一样,原来也是一条可爱的小狗,可是突然有一天疯了(MadDog),一看到人就会每隔半秒叫一声(wow)地不停叫唤(yelp)。请根据描述,按示例的形式用代码来实现(提示关键字: 继承,原型,setInterval)。
题目一分析
没什么好分析的,原型方式继承,用setInterval进行循环。代码如下:
function MadDog(){ } MadDog.prototype=new Dog(); MadDog.prototype.yelp=function(){ var self=this; setInterval(function(){ self.wow(); },500); }
这里要注意的是闭包的使用。
题目二要求
请给Array本地对象增加一个原型方法,它的用途是删除数组条目中重复的条目(可能有多个),返回值是一个被删除的条目的数组。
题目二分析
这道题考查的就是基本的算法了,最简单也是最容易想到的就是用双重循环进行判断:
Array.prototype.distinct = function() { var ret = []; for (var i = 0, l = this.length; i < l - 1; i++) { for (var j = i + 1; j < l; j++) { if (this[i] == this[j]) { ret.push(this.splice(j, 1)[0]); l = this.length;
j--; } } } return ret; };
这种方法效率不高,另外想到的一种方案就是用空间换时间,就是循环一次,在循环过程中用一个临时变量把不重复的存起来,然后判断当前元素是否是重复的,再进行处理:
Array.prototype.distinct2 = function() { var ret = [], tempArr = {}; for (var i = 0; i < this.length; i++) { if (tempArr[this[i] + 1]) { ret.push(this[i]); this.splice(i, 1); i--; continue; } tempArr[this[i] + 1] = true; } tempArr = null; return ret; };
这里买个小关子,代码里有个this[i]+1,有人知道为什么要+1吗?
小结
这两题考察的内容都比较基础,主要考察了继承、原型、setInterval、闭包、基本算法等。期待高手给出不同方案。