去XX公司面试前端,给了一套题,一看,大致上不会,跟面试官说这题对我有些难,他说这是基础,你能够走了,因而我走了。人艰不拆啊。javascript
可是做为一个知错就改的好少年,我要发扬不懂就问,不懂就去研究的优良传统。因而今天花了些时间把我有印象的题目和个人思考写出来,按照面试官的说法是基础,可是基础是重中之重啊,但愿能够对各位有些帮助,若是大家有机会去XX公司面试前端,这也算做前车可鉴了。前端
给了一个数字数组,有一位的有两位的,让你按照从大到小排序java
基础吧,简单吧,但我就是不会(掩面)。回来查了才知道原来数组就有sort方法。
好吧,是否是我直接把数组sort一下就能够了呢,因而我试了一下node
var arr = [11,2,28,5,8,4] arr.sort() //return [11, 2, 28, 4, 5, 8]
尼玛,为何11跑到2前面了,难道这个函数是按字来排序的,太不智能了吧。原来不带参数的sort是按照字符编码的顺序进行排序的。那么从大到小要怎么写呢?面试
var arr = [11,2,28,5,8,4] arr.sort(function(a,b){return a-b})
要这样写,为何是这样呢?sort的参数是一个排序函数,咱们能够把参数a看成数组里靠后的元素,b看成数组里靠前的元素,排序函数return的值若是是正的,才执行排序,因此最后排下来是从小到大,相反,若是return的是b-a,那么就是从大到小排序。segmentfault
这是另一道题目,数组里有重复项,要怎么清除。一查我再掩面而泣,原来js里就带了filter就能够干这活。代码以下:数组
myArray.filter(function(elem, pos,self){return self.indexOf(elem)== pos;})
filter是过滤的意思,filter经过一个函数的参数来选择什么项须要被filter掉,函数返回true保留,false干掉。闭包
函数参数带三个参数,第一个elem是这一项元素,第二个pos是这一项所在的位置,第三个self指的是执行filter的数组。那么,你看,巧妙吗:self.indexOf(elem) 是指这个项目在数组中的位置,位置是第一个,也就是说一样的项目在第一位和第5位都出现了,他返回的是0,而此时pos仍是4,因此经过self.indexOf(elem) == pos 能判断出这一项是否是重复出现的项,若是是(返回false),则干掉它。函数
这题我真很差意思说,丢人,我先写出来吧:学习
function a(x){ return function b(y){ return y+x++ } } var a1 = a(10) var a2 = a(20) a1(10) a2(10)
问后面两个值。我一看这不是考闭包吗,幸好我有点复习,就是说x被带进去了,跟里面的匿名函数建立了一个闭包,因此一个是10,一个20。这都没问题,下面一个值++,再加上10,好嘛,++优先级显然大于+,因此10+1 = 11 再加10,一个等于21,一个等于31.
尼玛,回来一试我又傻掉了,a++虽然优先级算,可是他返回的仍是自己啊,++a才返回加过之后的值啊。理解的太不深入了,该打。
好吧,我原本还想说终于有一道能够作的题了,但后面大字写的请使用原生javascript实现让我蒙了,完蛋,一道都作不对。
我先是在sf里提问:
而后结合朋友们的答案,本身试着写,我开始是这么写的:
var nodeList = document.getElementsByTagName('li'); for(var i = 0;i < nodeList.length;i++){ nodeList[i].onclick = function(){ console.log(nodeList.indexOf(nodeList[i])); } }
个人思路是把全部的li放到一个数组里,而后遍历他,为每一个元素添加事件,事件触发数组中当前项所在的index。
可是现实无情的打击了我,报错,nodeList找不到indexOf方法,我幻想中的nodeList难道不是数组吗。依然google,才知道怪不得那么多人使用那种复杂的方式声明数组啊,方法以下:
var nodeList = Array.prototype.slice.call(document.getElementsByTagName('li'),0) ;
调用array对象的方法slice,把取得的li放进去,这样能保证这玩意是一个数组,具备数组的一切方法。
而后我继续执行,擦,不对循环里的i永远是最后一项的值,不对,这不就是闭包里说的要避免的状况吗?也就是说onclick的匿名函数和变量i之间创建起了一个闭包,而这个i是循环之后最后的那个值。
而后呢,上网搜解决办法呗。原来解决循环闭包错误的办法就是再建立一个闭包函数,结果这个函数只须要打印出循环中的i就好了,最终代码以下:
var nodeList = Array.prototype.slice.call(document.getElementsByTagName('li'),0) ; function conIndex(i){ return function(){ console.log(i) } } for(var i = 0;i < nodeList.length;i++){ nodeList[i].onclick = conIndex(i); }
我没有较系统的学习计算机知识,我这我的学习还有一个特色特别不喜欢用术语,从高中开始我就喜欢把知识用我理解的方式讲出来,虽然一直在作前端,可是愈来愈发现本身的知识不够用,对js的理解还不够深刻。我想嘛,js知识就那么多,它增加的速度只要赶不上我学习的速度,就总有一天我能把它全学会,个人目标是,下一次去面试的时候能够义正词严的把他们给的基础题目彻底搞定!