頭條前端實習崗涼經有感

三耳朵發表於2019-04-04

前言(人生第一次寫掘金文章,望輕噴!)


雖然自己是計科院的學子,雖然接觸前端已經一年半+,雖然系統複習理論知識體系已經一個月+,雖然又花了兩週時間專門針對網上各種面經不難其煩的梳理,雖然有跟著大佬偷偷竊取頭條面試第一手情報,奈何自己真的是太菜了還是被吊起來打!偷偷記個小本本,回顧一下面試時自己是多麼愚鈍,主要為了記錄下自己面試時的心路歷程,以及對知識點的天馬行空(貶義)(┬_┬)也希望有面試頭條的同志能收穫一些情報

頭條前端實習崗涼經有感

面試正文呈上(回答的僅是個人拙見,歡迎指正)


  1. 頭條面試官真是親和呀,一上來就跟你噓寒問暖,瞬間讓人心裡放鬆了很多。一開始就是基本情況瞭解,什麼時候開始接觸前端的呀?大學都學過什麼課程呀? 最讓人詫異的,面試官居然絲毫不想問專案經歷相關的問題(暗自慶幸,之前面試的大佬專案也是一帶而過)!
  2. 談談JS中的類吧。 著重說了傳統語言中類通過拷貝實現繼承,而JS通過原型鏈實現繼承。 那就談談原型吧。 說了建構函式建立的時候,會生成一個原型物件,本質上是一個物件,當在例項上找不到屬性的時候會通過原型鏈在原型物件上查詢該屬性。那就談談物件吧。 瞬間就懵逼了,好像從來都沒思考過這個問題嗎,大腦瞬間過濾一下,大致說了下物件是JS中引用資料型別的一種等等不知所云。(ps: 面完之後躺在床上思緒萬千,一直以來看各種原型,原型鏈的略高深內容本以為略有成長,還曾沾沾自喜,卻不曾想面試的時候對於一些最基礎的概念竟不知從何答起,無法也沒想到要把回答內容引導到熟悉的知識範疇,太沉溺與知識本身,沒重視知識點的基本概念與知識點間的交錯關係)
  3. 對繼承有了解吧。 說了好幾種繼承方法,主要強調了組合繼承的優缺點,以及寄生組合繼承如何解決組合繼承的缺點,本來還想說一下Class繼承,一想自己沒深入瞭解過就沒敢說了。那就手寫個繼承吧。 大致實現了個寄生組合繼承。
  4. 談一談es6的新特性吧 首先說了箭頭函式中this的特殊性,又說了let,const形成塊作用域等等,接著結構賦值,模板字串,函參預設值等等。 (本來看到有人的見解說,可以理解為箭頭函式中沒有this,因此其this是通過作用域查詢的,沒想到嘴賤的我居然一不小心順嘴說出了根據閉包查詢,結果面試官就反問通過閉包?我冷靜一想按照這個理解,setTimeout中的箭頭函式應該就是通過閉包呀,但瞬間慌了正常呼叫的箭頭函式可不是這樣,趕緊糾正)
  5. 能實現個三欄佈局嗎 首先說了下flex佈局,又說了absolute+margin佈局,最後又說了float+margin/BFC佈局,嘴賤的我說了BFC實現自適應有一些弊端,然後又巴拉巴拉說了一大堆,還好之前有準備。
  6. 說一說陣列的方法吧。 先想到map、filter、forEach、every、some、reduce,又說了pop、push、shift等等。那應該對map挺熟悉的吧,來用reduce實現一個map函式吧。 菜是原罪啊(┬_┬),儘管面試官提醒了一下還是沒有實現,面完之後網上搜了一下,很懊悔很自責,感覺應該能做出來的呀!如果一開始想太多無處下筆的時候,能想到先不用reduce實現個map,然後再將其改成reduce的形式,感覺是能做出來的吧 (聊以自慰罷了,還是程式碼寫少了,之前手寫程式碼的時候大多是網上各種call、apply、bind、debounce之類,現在換了一下就不會寫了,只能說明對JS這個語言沒有完全深入的瞭解,還是浮於表面的這個怎麼實現,那個怎麼實現,哦,看了別人的程式碼後我也能自己寫出來了,我會了!我真棒!一遇到新的問題就懵逼就去找答案,沒有想過自己實現能做到哪裡,實現了之後又與別人的實現差在哪裡。歸根結底開發還是要多寫程式碼,多思考,注重理論和實踐的結合啊!!!)
  7. 對JS事件迴圈有了解吧。 說了下JS是單執行緒執行的,用非同步來實現非阻塞,而事件迴圈機制是協調執行棧順序執行訊息佇列的一種機制。又說了指令碼開始執行的時候程式碼從上而下執行,遇到非同步事件就掛起交給對應的工作執行緒執行,主執行緒繼續執行後面的任務,待非同步完成後將回撥放到對應訊息佇列裡,JS同步程式碼執行完後會清空微任務佇列,然後取一個巨集任務執行,再清空微任務佇列,又說了巨集,微任務都有哪些。(感覺自己回答的挺好的,還沾沾自喜,卻不想言多必失) 你剛剛說工作執行緒,但是你不是說JS是單執行緒執行的嗎? JS是單執行緒執行的呀,瀏覽器有好多執行緒啊,比如渲染,定時器,網路請求執行緒,但這不妨礙JS是單執行緒執行的呀(天真傲嬌臉)。我又反問面試官,那JS事件迴圈到底是什麼樣的啊?面試官說的啥我記不太清了,大致是說JS執行環境有瀏覽器和Node之別, 瀏覽器V8引擎的事件迴圈大致也就是你說的那樣,但是node依託於libuv執行緒池。(本來對瀏覽器和node事件迴圈都有深入瞭解過,但沒想到問到JS事件迴圈的時候本能想到的是瀏覽器事件迴圈,且忽略了node事件迴圈。而且自己好像也只是知道兩個事件迴圈有不同,且學習了相關機制以備出題能寫出執行順序,但是卻並沒認真思考過JS及其宿主環境與事件迴圈的關係,真是不小心就成了洋洋得意的井底之蛙啊)
  8. 學過資料結構是吧,那實現個二叉樹任意兩節點間路徑的查詢吧。 (ps: 對不起我太菜了!!!)
    頭條前端實習崗涼經有感

面後總結


雖然寫程式碼很菜,但是一直覺得自己回答的時候做的很好,但當躺在床上的時候才發覺自己回答的也很屎,心得如下:

  1. 頭條是要招能手寫簡單業務邏輯,且對理論基礎有一定認知的人,大概6:4開吧。而我本身程式碼就寫的少,準備的還都是各種理論假大空,結果一動手就暴斃!
  2. 我對基礎知識還算比較重視,經常會對一個知識點看各種文章,然後看到亮點且對自己有收穫的知識點就偷走,記在小本本上。本以為是一種摸索出來的很優秀的學習方法,卻不曾想這些我認為正常的"真理"往往禁受不了事實的考驗,大概是太沉溺與自己滿足的"真理",卻並沒有對其進行進一步的驗證。
  3. 關於手寫程式碼這一塊,覺得還是平時要多寫,多深挖各種實現的關聯,這樣對JS語言就會有更好的認識。而不是我會這個,我會那個,咦新人?我不會!
  4. 引導面試官,把問題引導到自己確信的,熟悉的知識,而不是自己主觀臆測的地方。大忌呀,不過還是因為對知識的不熟悉的原因吧!

一些我認為很棒的知識講解清單


  1. 前端快取 看完以後收穫頗多,把一直以來快取位置的疑惑也給解決了
  2. Jsonp詳解 終於知道Jsonp的真正運作原理了
  3. 跨域詳解 各種跨域詳解,用promise封裝Jsonp實現方式,讓我眼前一亮
  4. js常見的記憶體洩漏及解決方法總彙 不錯的總結
  5. JS手寫程式碼 其他都挺好的,感覺防抖節流還見過更好的版本
  6. 前端安全知識 終於對XSS,CSRF有個清晰的認識了

終於寫完了,人生第一次,真好!

相關文章