前言
騰訊一面,相比阿里一面來說,騰訊一面先給打電話預定時間,這也給了我們這些面試者去準備的時間。但是也正是因為這種確定性,也有在等待電話的時候的心情的忐忑。
背景
我是一名大三學生,大一在學校acm集訓隊,後來轉向學習java,又去開發Android,在期間,學會怎麼去解決一些程式設計遇到的問題以及靈活運用github。在大二寒假的時候,開始接觸學習前端,如今已經一年了,一開始是做百度前端技術學院(ife.baidu.com/2016/task/a…)的任務,學習了html和css,以及參考別人優秀的程式碼。
js是通過紅寶石,js高階教程第三版開始入門學習的,這本書裡面的基礎知識很精髓,那時候我也很有耐心的去看完了,雖然說可能實踐還是跟不上理論,因為後面做的專案基本都是用框架去做專案,而導致對於基礎知識的實踐比較少。
接下來,我們進入正題吧。
騰訊一面
首先,接到電話的時候,由於之前心情的忐忑,情緒還是有點興奮的,以期待的口氣向面試官問好,面試官也問問好之後就開始進入面試題了。
你先簡短的介紹一下自己 在這裡,我就簡短的介紹了自己的學校專業,應聘的崗位,以及是怎麼走向學習前端的道路,也就和我寫的背景差不多。
你是怎麼學習前端的? 開放性問題,我就回答了,一開始是在百度前端技術學院,後來看js高階教程第三版,接下來就是做專案,接觸一些框架,然後,就開始學習框架,以及個人對於框架的一些看法。
這裡面試官很好,也跟我討論了一下學習的好不好,以及學習js基礎的話,不單單要看紅寶石(js高階教程第三版),也要看看js的犀牛書(js權威指南)比較好一點。
有了解js的資料型別嗎?說一說 ES5的基本資料型別,Undefined,Null,Number,String,Boolean,引用型別,Object。ES6新增了資料型別Symbol,表示獨一無二的值。
有了解js的事件嗎? 在這裡,我不清楚是js的事件流還是js的事件方法,經過再次詢問之後,是叫我講述一下js的事件流。然後我就著這個圖回答了一遍。
一個完整的JS事件流是從window開始,最後回到window的一個過程。
事件流被分為三個階段(1~ 5)捕獲過程、(5~ 6)事件觸發過程、(6~ 10)冒泡過程。
移動端的觸控事件有了解不? 在這裡,我回答說我之前的專案經驗基本都是PC端的所以不瞭解,但是面試官建議我去了解一下,畢竟基礎知識一定要紮實,才會在前端的路上走的更遠。所以,我就紅寶石瞭解了一下,這裡也介紹給大家吧。
觸控事件指的是指的是使用者將手指放在螢幕上,在螢幕上滑動到將手指從螢幕移開觸發的事件,具體來說,有以下觸控事件的產生:
touchstart: 當手指觸控螢幕時候觸發; touchmove: 當手指在螢幕上滑動的時候連續觸發;可以呼叫阻止預設事件preventDefault()阻止螢幕滾動; touchend: 手指離開螢幕時觸發; touchcancel: 系統停止跟蹤觸控時觸發; 以上的這些時間都會冒泡,而且都可以取消冒泡,而且,對於以上事件也提供了和滑鼠事件中常用的屬性:bubble,cancelable,view,clientX,clientY,screenX,screenY,detail,altKey,shiftKey,ctrKey和metaKey。
除了上面這些屬性外,觸控事件還提供了下面這些屬性:
touches: 跟蹤返回Touch物件的陣列; targetTouchs: 特定事件目標的Touch物件的陣列; changeTouchs: 上次觸控以來改變了的Touch物件的陣列; 每個Touch物件包含一下的屬性:
clientX: 觸控目標在瀏覽器中的x座標 clientY: 觸控目標在瀏覽器中的y座標 identifier: 標識觸控的唯一ID。 pageX: 觸控目標在當前DOM中的x座標 pageY: 觸控目標在當前DOM中的y座標 screenX: 觸控目標在螢幕中的x座標 screenY: 觸控目標在螢幕中的y座標 target: 觸控的DOM節點目標。 具體的例子,大家可以再在網上搜尋一下。我就不帶大家敲了。
說一下頁面載入過程,就是輸入url到載入出頁面 這裡發生了:
輸入地址 瀏覽器查詢域名的 IP 地址 這一步包括 DNS 具體的查詢過程,包括:瀏覽器快取->系統快取->路由器快取... 瀏覽器向 web 伺服器傳送一個 HTTP 請求 伺服器的永久重定向響應(從 example.com 到 www.example.com) 瀏覽器跟蹤重定向地址 伺服器處理請求 伺服器返回一個 HTTP 響應 瀏覽器顯示 HTML 瀏覽器傳送請求獲取嵌入在 HTML 中的資源(如圖片、音訊、視訊、CSS、JS等等) 瀏覽器傳送非同步請求 這裡騰訊面試官還問了我對狀態碼的瞭解,並問了一個304狀態碼的意思,大家想了解可以自行百度一下咯。
說一下路由器的快取 因為上面回答了快取,路由器的快取,由於本人學習計網也久忘了,就老實回答面試官不清楚,面試官也建議再去了解了解。這裡我瞭解了,也給大家分享一下吧。
通俗點說,每個路由器根據所在網路的不同,都有自己的路由表,在工作時會選擇相應的路徑。為什麼要有路由器快取呢,這個也是為了傳送資料,因為路由器最高層一般都是網路層,網路層一般都是傳送資料包,資料包又是經過應用層向下傳送之後送來的一部分檔案資料,如果我們沒有快取的話,那麼,每次都會查詢傳送到達方的ip地址就會很費力。
做專案中有遇到跨域嗎?跨域的原理是什麼? 這裡,我就老實回答有了,因為如果真的做過專案的話,確實會遇到跨域一般。但是我一般是用vue做專案,然後解決跨域又是用webpack裡面配置的poxyTable進行解決跨域,相當於用代理工具,然後面試官又問了問我代理是怎麼樣有了解原理嗎,以及跨域的原理,以及瀏覽器跨域的原因。
那這裡我就簡單解說一下跨域的原理吧.
首先,什麼是跨域?跨域就是它是由瀏覽器的同源策略造成的,是瀏覽器施加的安全限制。
所謂同源是指,域名,協議,埠均相同,不明白可以看看下面的例子:
www.123.com/index.html 呼叫 www.123.com/server.php (非跨域)
www.123.com/index.html 呼叫 www.456.com/server.php (主域名不同:123/456,跨域)
abc.123.com/index.html 呼叫 def.123.com/server.php (子域名不同:abc/def,跨域)
www.123.com:8080/index.html 呼叫 www.123.com:8081/server.php (埠不同:8080/8081,跨域)
www.123.com/index.html 呼叫 www.123.com/server.php (協議不同:http/https,跨域)
為什麼要實現跨域?防止CSRF攻擊,我看了一篇文章關於CSRF的還不錯,大家有興趣也可以看看這篇文章(blog.csdn.net/stpeace/art…)
你是怎麼解決跨域的?說說Cors解決的方法,和你用的jsonp的解決的原理 我回復面試官,我是用jsonp解決跨域的,然後面試官叫我說明一下jsonp跨域的原理,等我說完之後,面試官又跟我說了一下其實Cors方法更好,大家如果想理解可以看看阮一峰的跨域資源共享CORS詳解(www.ruanyifeng.com/blog/2016/0…)和而對於jsonp跨域的工作原理,網上有很多,我就不舉例子了,我建議可以直接在github上面看看原始碼(github.com/webmodules/…)就可以理解。
有了解作用域嗎?怎麼預防作用域汙染 其實網上有很多作用域的文章,參差不齊,個人覺得的話,作用域無非就是js當做對於function函式宣告會提升到其他宣告語句前執行,以及對於某個 {}裡面的作用域如果找不到某個屬性,就會在該 {}上下文當中查詢屬性,如果還找不到的話,進而類似。
作用域汙染,無非就是閉包了吧,個人理解。
說說閉包 網上關於閉包的說明實在是太多,但是很多又講的不明不白的,標題黨太多,這裡我建議還是直接看看js高階教程第三版裡面的書本吧。
其實閉包也就是指有權訪問另一個函式作用域的函式而已。常用的建立閉包的方法就是在函式內部建立另一個函式。
瞭解前端的快取嗎?快取分為幾類? 前端的快取無非就Cookie,LocalStorge,SessionStorge這三個吧。個人就簡單的介紹一下這三個吧,更詳細可以自己去百度百度一下。
Cookie,儲存容量小,僅僅4kb左右,在網路請求的時候可以傳送,不建議儲存重要資料,因為會被網路詐騙就是把本地的cookie發到別人的伺服器上,進而獲取你的賬戶密碼。
LocalStorge,SessionStorge都是本地快取的主要用的,兩者的用法都很簡單,都有各自的Set和get方法。主要的區別就是LocalStorge是一種持久化的儲存方式,也就是說如果不手動清除,資料就永遠不會過期。而SessionStorge關閉瀏覽器就清空資料。
怎麼才算一個好的前端開發者 這裡的話,其實我的回答大家可能不是很在乎哈哈,就不說了,大家根據自己的理解去回答就好了。
你還有什麼問題想問嗎 這個問題,其實我想到了,因為我看過鵝廠wo談會,在那裡其實我就知道可能會問這個問題,而我也問了我想知道的答案,就是面試官對於我之前的回答給一個評價。
我碰到的面試官很好,他給我的評價說了很久,不管怎麼說有機會和這些大牛聊聊天真的是知識層面又上升了吧。面試官給我的總結就是,基礎知識可以再多去學習,不用太著急學習框架,市面上的框架千變萬化,只有基礎知識比較好才能夠學習的更好,而且需要多學習一下效能優化,網路,安全這方面,因為在大公司裡面,其實重要的東西並不是你能夠做的多好看,而是你的安全性那些做的好不好,一不小心資訊洩露了,那就會導致很多無法想象的事情,(這裡我特建議大家看看圖解http協議吧,連結:pan.baidu.com/s/1CvttJuNe… 密碼:u35q)
然後,建議我就是基礎知識學更多一些,把知識都規範體系化,這樣以後碰到問題了就會一下子就知道是哪方面的問題,直接去解決。這裡面試官給我從以下幾個方面進行說明,我也真的是收穫頗多。
js基礎 計算機網路 效能優化 開發技巧 移動端知識 安全性問題
總結
不管怎麼說,不管結果好壞,跟騰訊大牛的聊天都是值得積累的過程,不要想象的很緊張吧,這也是自己能夠收穫知識的時候,我是這樣覺得的,哈哈,如果覺得寫得還行,幫忙點個贊吧。