面試完前端工程師被打擊,回來補一下

去XX公司面試前端,給了一套題,一看,大致上不會,跟面試官說這題對我有些難,他說這是基礎,你能夠走了,因而我走了。人艱不拆啊。javascript

可是做爲一個知錯就改的好少年,我要發揚不懂就問,不懂就去研究的優良傳統。因而今天花了些時間把我有印象的題目和個人思考寫出來,按照面試官的說法是基礎,可是基礎是重中之重啊,但願能夠對各位有些幫助,若是大家有機會去XX公司面試前端,這也算做前車可鑑了。前端


題目1 數組排序

給了一個數字數組,有一位的有兩位的,讓你按照從大到小排序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


題目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知識就那麼多,它增加的速度只要趕不上我學習的速度,就總有一天我能把它全學會,個人目標是,下一次去面試的時候能夠義正詞嚴的把他們給的基礎題目徹底搞定!

相關文章
相關標籤/搜索