口试完前端工程师被袭击,返来补一下

去XX公司口试前端,给了一套题,一看,大体上不会,跟口试官说这题对我有些难,他说这是基本,你能够走了,因而我走了。人艰不拆啊。

然则作为一个知错就改的好少年,我要发扬不懂就问,不懂就去研讨的优良传统。因而本日花了些时刻把我有印象的问题和我的思索写出来,根据口试官的说法是基本,然则基本是重中之重啊,愿望能够对列位有些协助,假如你们有机会去XX公司口试前端,这也算作前车可鉴了。

问题1 数组排序

给了一个数字数组,有一名的有两位的,让你根据从大到小排序

基本吧,简朴吧,但我就是不会(掩面)。返来查了才晓得原本数组就有sort要领。
好吧,是否是我直接把数组sort一下就能够了呢,因而我试了一下

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,那末就是从大到小排序。

问题2 数组消灭反复项

这是别的一道问题,数组里有反复项,要怎样消灭。一查我再掩面而泣,原本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),则干掉它。

问题3 闭包和++

这题我真不好意义说,丢人,我先写出来吧:

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才返回加过今后的值啊。明白的太不深刻了,该打。

问题4 说一个list内里有几个元素,让你写一段代码在点击这个元素的时刻返回他在list里的index

好吧,我原本还想说终究有一道能够做的题了,但背面大字写的请运用原生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学问就那末多,它增进的速率只需赶不上我进修的速率,就总有一天我能把它全学会,我的目的是,下一次去口试的时刻能够义正词严的把他们给的基本问题完整搞定!

    原文作者:fishenal
    原文地址: https://segmentfault.com/a/1190000000418858
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞