更好閱讀,請移步這裏
聊以前
最近暑期實習招聘已經開始,我的目前參加了阿里的內推及騰訊和百度的實習生招聘,在此總結一下
一是備忘、總結提高,二是但願給你們一些參考
其餘面試及基礎相關能夠參考其餘博文:css
每位面試官的面試時間基本都在 40-80 分鐘,下面先簡要介紹各個面試流程,問題詳情見具體公司分類html
騰訊內推&校招 offer got前端
首先騰訊分爲三面,都爲技術面:vue
- 初試一個面試官
-
複試兩個面試官,包括電話遠程 online codinghtml5
(我也不知道爲何幾天內三個面試官面我,只算兩個面試過程 ヾ(´A`)ノ゚) -
終面一位面試官java
這位應該是大 boss ,他說並非前端開發的,面試的問題也不會很深刻,主要看我的對這個領域的想法以及對常見問題在前端領域的解決思路,不按套路出牌,emmm 感受回答的不理想
相似這種問題:- 說說最能體現你能力的工做
-
網絡安全的實現node
如何檢測惡意腳本
如何屏蔽
...react
騰訊二面 & online codingwebpack
-
騰訊的遠程 online coding 時間較長,大概一個多小時,不只要按要求編程,也要口述思路以及關鍵點,過程相似壓力面,面試官說完題目要求會給你思考及coding 時間,他能夠遠程看到面試者的 coding 狀態,主要考察應變能力,思惟活躍度,編碼習慣,調試能力,以及測試方法,本人在此過程當中沒有太注意測試過程,致使對於特殊狀況考慮不全面,測試樣例不完善,望小夥伴們注意 ヾ(´A`)ノ゚,不過,在口述代碼時發現也能夠本身提出來須要完善的地方。
-
coding 爲一到兩題,後續問題都是圍繞它結合實際應用進行拓展,主要考察是否能靈活運用以及類似的思路轉換,當時面試時間太長以及基礎知識較差,進制轉換,存儲那些個基礎被小學老師收回,一連串的炮轟簡直爽歪歪,我的表示此過程本身的表現較差,也要重視基礎基礎啊老鐵們 ( ̄_ ̄ )
經歷了騰訊雲的四個面試官,以及其餘部門一個面試官的醬油麪,騰訊的技術面試官廣泛語速較快,思路轉換很快,要跟上面試官的節奏,聊到本身比較熟悉的能夠多說幾句,他們也會順着你回答的內容進行深刻,也會引導面試者的回答方向,若是不太熟儘可能坦白一些,不懂裝懂很容易 gg
才接到通知另加兩輪面試委員會現場技術面,簡直爽歪歪 ヾ(´A`)ノ
騰訊校招現場
-
一面
面試官很 nice,基本看着簡歷問的,話題圍繞項目(項目隔得時間過久,心裏寧願粗暴的技術面),基本爲大體的瞭解,包括平時的學習習慣和關注的技術發展- 問到了 ES5 ES6 ES7 甚至 ES8
- 項目中用過vue, 就問了 react vue 相關
- 實習中的工做方式,如何處理設計師的設計稿,回答了包括考慮響應式佈局的經常使用方案
-
sass--定義function,使用rem
問是否有其餘負面做用
想到了頁面閃爍,因爲初始化時須要計算頁面尺寸,可能有縮放
如何避免:
<!-- 若是在頁面加載完成後,頁面是用js動態添加的,這個問題就不太明顯, --> doc.addEventListener('DOMContentLoaded‘', function(e) { <!-- doc.body.style.fontSize = 12 * dpr + 'px'; 淘寶處理 --> }, false);
-
媒體查詢
-
- 移動端和pc端的工做
-
二面
面試官不是前端的,因此沒有問很深刻的問題,主要模擬實際場景考察實現思路以及先後端的方案,後端沒說出什麼,基本上只是就前端層面進行了描述,包括實現思路、須要注意的問題、以及性能和安全方面的考慮- 前端安全
- 場景考察
- 直播彈幕處理
- 後端返回大量數據且包含運算,如何實時顯示
- 。。。記不清了
- HR 面
- 介紹經歷
- 家庭狀況
- 職業規劃
- 對騰訊的認識及與其餘實習單位對比
- 對比實習過的企業
- 是否還報了其餘企業
- 男友工做找的怎麼樣了
阿里內推 二面 卒
我投的是螞蟻金服的前端開發,投過簡歷硬生生排隊等了12天,還被內推人提早告知螞蟻的前端很嚴格 ( ̄_ ̄ )
阿里分爲在線測試,初試 ......
-
首先是在線測試
投完簡歷後官網會有相關在線測試題
阿里前端的在線測試只有一道coding 題,限時 30 分,因爲初次在線答題,看着倒計時緊張的思路不通,未能準確理解題意,但實際題目並不難,考察使用原生 js 實現相似css 的層級選擇器的功能,具體題目記不太清,將僅存的記憶寫了下來並附上我的實現,詳情見本文後部分 - 一面
- 二面
-
掛掉了。。。
baidu 等通知
百度投的是核心搜索部門,但一面後估計不合適,沒有了消息,後簡歷轉到百度金融
-
一面
面試官語速很快,通常不給太多思考時間--------感受本身說話都打着節拍 ( ̄_ ̄ )
-
二面
面試官很和善,是惟一一個認真看了我博客的面試官,很榮幸,也很緊張
基本偏向基礎
但因爲沒安排好時間,面試時在戶外,聽不太清面試官的問題,在此提醒各位小夥伴提早選好面試場地,避免環境影響 -
三面
一樣和善的面試官,開始考察基礎知識,編譯原理,網絡協議等基礎,後面考察我的素質,後續更注重我的經歷,包括如何學習,找實習,實習中遇到的問題及如何解決,最驕傲的事情等等
關於結尾
-
百度 & 阿里面試結束後都有問:你以爲在面試過程當中有什麼沒問到,但本身掌握比較好的技能麼
面阿里時,頭腦發暈,回答:沒有,我感受您面的很專業,問的知識點都是比較核心的 ( ̄_ ̄ )
百度經驗: 回答本身掌握還比較好的知識後,面試官真的會問不少問題(菜鳥能夠參考以上作法),若是面試官面試的較偏,倒能夠補充 - 有什麼要問的
-
騰訊二面教訓
我:是否有導師帶,實習的大體安排以及部門業務等
效果 差
面試官曰:
你那麼關係有沒有導師的問題,但學習中最重要的是靠本身,導師並非負責回答你全部問題的
-
百度經驗
我:部門是否有按期交流分享的機會;工做中是按照職位仍是業務部門劃分,如何交流;偏向頁面仍是業務邏輯
我的在自學過程當中發現前端體系太大,不知對於前端學習,您有什麼建議麼
面試官:不少前端初學者都有相似的困惑,你最好本身從頭開始作一個項目,無論是本身瞎想的仍是模仿的,在項目過程當中去發現須要學習什麼技術,在遇到問題的時候才知道去哪一個方向發展和思考,只有在項目中才能持續的學習和提升,前端知識很碎,沒有項目很難有一連串的經歷
-
整體
整體來講,面試中有按照面試題出的,也有直接聊的,通常也會結合實際工做中會遇到的場景以及技術中的一些坑,回答時結合本身的項目經驗會更好,大廠的面試官更側重於面試者對深層原理的理解,對於實習生來講通常面基礎,若是有深查原理的習慣,我的的可塑造性也會較高
三廠體驗對比:
- 騰訊阿里面試官一面開始都比較側重實踐,若是簡歷上有過實踐項目和實習經歷,會問更實際的問題,構造場景讓解答
-
協議都會問到
-
相對來講,百度更多基礎知識點,更多考察對更基本的知識掌握,不限於前端,還包括組成原理和編譯原理的一些知識,固然前端偏多(好比選取一個class 標籤元素有幾種方式等小細節的問題來考察,細到要把每一個表達說完整,把每一個單詞拼出來)
-
阿里騰訊更側重應用中的注意事項(如:IE 和其餘瀏覽器中的事件處理機制)不太揪細節
-
三廠都有問到算法,騰訊相對更注重對算法和邏輯,對面試者基礎知識要求較高,甚至涉及更底層的。
-
另兩廠對算法,數據結構的要求都是瞭解階段
如下爲面試中的一些知識點以及我的的一些補充,敲黑板啦啦啦
1. Tencent
1.1. js 的事件機制
事件階段
通常的,事件分爲三個階段:捕獲階段、目標階段和冒泡階段。
-
捕獲階段(Capture Phase)
- 事件的第一個階段是捕獲階段。事件從文檔的根節點流向目標對象節點。途中通過各個層次的DOM節點,並在各節點上觸發捕獲事件,直到到達事件的目標節點。捕獲階段的主要任務是創建傳播路徑,在冒泡階段,事件會經過這個路徑回溯到文檔跟節點。
-
或這樣描述:
任何事件產生時,如點擊一個按鈕,將從最頂端的容器開始(通常是html的根節點)。瀏覽器會向下遍歷DOM樹直到找到觸發事件的元素,一旦瀏覽器找到該元素,事件流就進入事件目標階段
-
目標階段(Target Phase)
- 當事件到達目標節點的,事件就進入了目標階段。事件在目標節點上被觸發,而後會逆向迴流,直到傳播至最外層的文檔節點。
- 冒泡階段(Bubble Phase)
- 事件在目標元素上觸發後,並不在這個元素上終止。它會隨着DOM樹一層層向上冒泡,回溯到根節點。
- 冒泡過程很是有用。它將咱們從對特定元素的事件監聽中釋放出來,若是沒有事件冒泡,咱們須要監聽不少不一樣的元素來確保捕獲到想要的事件
事件處理程序
-
DOM0 級事件處理程序
var btn5 = document.getElementById('btn5'); btn5.onclick=function(){ console.log(this.id);//btn5 };
-
基於 DOM0 的事件,對於同一個 dom 節點而言,只能註冊一個,後邊註冊的 同種事件 會覆蓋以前註冊的。
利用這個原理咱們能夠解除事件,btn5.onclick=null;
其中this就是綁定事件的那個元素; -
以這種方式添加的事件處理程序會在事件流的冒泡階段被處理;
-
- DOM2 級事件處理程序
- DOM2支持同一dom元素註冊多個同種事件,事件發生的順序按照添加的順序依次觸發(IE是相反的)。
-
DOM2事件經過
addEventListener
和removeEventListener
管理// addEventListener(eventName,handlers,boolean);removeEventListener() // 兩個方法都同樣接收三個參數,第一個是要處理的事件名,第二個是事件處理程序, // 第三個值爲false時表示在事件冒泡階段調用事件處理程序,通常建議在冒泡階段使用, // 特殊狀況纔在捕獲階段; // 注意:經過addEventListener()添加的事件處理程序只能用removeEventListener()來移除 // 而且移除時傳入的參數必須與添加時傳入的參數同樣;好比 var btn2 = document.getElementById('btn2'); var handlers = function () { console.log(this.id); }; btn2.addEventListener('click',handlers,false); btn2.removeEventListener('click',handlers.false);
-
ie 事件處理程序
//IE事件處理程序(IE和Opera支持) /* IE用了attachEvent(),detachEvent(),接收兩個參數,事件名稱和事件處理程序, * 經過attachEvent()添加的事件處理程序都會被添加到冒泡階段,因此平時爲了兼容更多的瀏覽器最好將事件添加到事件冒泡階段,IE8及之前只支持事件冒泡; */ var btn3 = document.getElementById('btn3'); var handlers2=function(){ console.log(this===window); // true,注意attachEvent()添加的事件處理程序運行在全局做用域; }; btn3.attachEvent('onclick',handlers2);
---ie 與其餘瀏覽器的區別
總結
DOM事件模型中的事件對象經常使用屬性:
- type用於獲取事件類型
- target獲取事件目標
- stopPropagation()阻止事件冒泡
- preventDefault()阻止事件默認行爲
- 判斷加載狀態 —— onload 事件
IE事件模型中的事件對象經常使用屬性:
- type用於獲取事件類型
- srcElement獲取事件目標
- cancelBubble 阻止事件冒泡
- returnValue 阻止事件默認行爲
-
經過 readystate 屬性值判斷什麼時候方法下載完畢可用
readystate共有如下幾個值:- uninitialized: 對象存在但未初始化;
- loading:對象正在加載;
- loaded:對象數據加載完畢;
- interactive:能夠操做對象了,但還沒加載完畢;
- complete:加載完畢。
注意上面5個值並不必定每一個事件都全包含,而且不必定是什麼順序。
Document.readyState 屬性
一個文檔的 readyState 能夠是如下之一:-
loading / 加載
document 仍在加載。 -
interactive / 互動
文檔已經完成加載,文檔已被解析,可是諸如圖像,樣式表和框架之類的子資源仍在加載。 -
complete / 完成
T文檔和全部子資源已完成加載。狀態表示 load 事件即將被觸發。
當這個屬性的值變化時,document 對象上的readystatechange 事件將被觸發。
事件對象
-
IE
IE中事件對象是做爲全局對象window.event
存在的 -
Firefox
Firefox中則是作爲句柄( handler )的第一個參數傳入 -
通用
var evt = window.event || arguments[0];
事件監聽
-
Chrome、FireFox、Opera、Safari、IE9.0及其以上版本
addEventListener(eventName,handler,boolean); removeEventListener() /* 兩個方法都同樣接收三個參數, * 事件名 * 事件處理程序 * boolean false時表示在事件冒泡階段調用事件處理程序,通常建議在冒泡階段使用 */
-
IE8.0及其如下版本
element.attachEvent(type, handler); element.detachEvent(type, handler); /* element 要綁定事件的對象,html 節點 * type 事件類型 +'on' 如: "onclick, onmouseover" * listener 事件處理程序(只寫函數名,不帶括號) */
-
早期瀏覽器
obj['on' + type] = handler
阻止冒泡
event.stopPropagation
event.cancelBubble = true //IE
阻止默認事件
event.preventDefault()
event.returnValue = false //IE
---通用的事件監聽器
// event(事件)工具集,來源:github.com/markyun markyun.Event = { // 頁面加載完成後 readyEvent: function (fn) { if (fn == null) { fn = document; } var oldonload = window.onload; if (typeof window.onload != 'function') { window.onload = fn; } else { window.onload = function () { oldonload(); fn(); }; } }, // 視能力分別使用dom0||dom2||IE方式 來綁定事件 // 參數: 操做的元素,事件名稱 ,事件處理程序 addEvent: function (element, type, handler) { if (element.addEventListener) { //事件類型、須要執行的函數、是否捕捉 element.addEventListener(type, handler, false); } else if (element.attachEvent) { element.attachEvent('on' + type, function () { handler.call(element); }); } else { element['on' + type] = handler; } }, // 移除事件 removeEvent: function (element, type, handler) { if (element.removeEnentListener) { element.removeEnentListener(type, handler, false); } else if (element.detachEvent) { element.detachEvent('on' + type, handler); } else { element['on' + type] = null; } }, // 阻止事件 (主要是事件冒泡,由於IE不支持事件捕獲) stopPropagation: function (ev) { if (ev.stopPropagation) { ev.stopPropagation(); } else { ev.cancelBubble = true; } }, // 取消事件的默認行爲 preventDefault: function (event) { if (event.preventDefault) { event.preventDefault(); } else { event.returnValue