CVTE2019春招前端二面涼經

前言:

3月5日,從中山去往廣州,一大早7點多就作好準備了,在高鐵站了30分鐘,轉廣州地鐵又站了90分鐘,去到地鐵口,就有一輛cvte的大巴車過來接送,我選擇的面試時間是11:00-12:00,但前面的人還沒面試完並且12:00的時候又去吃了飯,因此面試的開始時間是下午1點,直到下午3點才面完。javascript

我面試的崗位是前端開發,一面問的挺基礎的,那就過了,二面感受大多數是業務的,因爲我後臺學的是php,面試官喜歡考node的知識,估計這也是我涼的最大緣由吧。做爲一名普通二本非科班的我,可以闖進二面以爲是很是幸運的了,繼續加油!php

線上筆試:

線上筆試我是2月21日作的,其實作完以後自我感受很通常,沒想到可以進入面試的。題型分爲選擇題和兩道編程題,其實那時我應該利用python後臺截屏的,這樣就可以把全部的題目截下來。
選擇題涉及的知識面涉及的挺廣的,讓我回想一下,有:css

①、EventLoop機制及微任務
②、阻止相同事件的其餘偵聽器被調用(stopImmediatePropagation)
③、css中margin的%是以父元素的寬度做爲基準(這個真不知道呀)
大概記得這麼多。。。html

編程題能夠參考我這篇文章:https://segmentfault.com/a/11...前端

一面:

面試官人比較隨和,因此我不怎麼緊張,一面問的是基礎,大部分我以爲都ok,面試是一對一的,首先自我介紹,我就說我是非科班的,前端的知識都是自學的,而後就說了各類各樣的自學方法。接下來看看問的都是什麼知識vue

①、css盒子模型:
有兩種, IE 怪異盒子模型(border-box) 和 W3C標準盒子模型(content-box)java

怪異:width = content + border + padding
標準:width = content

能夠經過css的box-sizing屬性來切換這兩種盒子node

box-sizing: border-box    怪異盒子模型
box-sizing: content-box   標準盒子模型

圖片描述

②、http狀態碼:python

1開頭:(被接受,須要繼續處理。)

100:客戶端繼續請求 、101:客戶端切換協議react

2開頭:(請求成功)

200:請求成功
202:服務器已接受請求,但還沒有處理
204:服務器成功處理了請求,但未返回內容

3開頭:(請求被重定向)

301:(永久重定向)、 302: (臨時重定向) 、
303:http1.1協議,禁止被緩存
304:(協商緩存成功(資源未修改)的返回值)

4開頭:(客戶端請求錯誤)

400:客戶端請求的語法錯誤,服務器沒法理解
403:服務器理解請求客戶端的請求,可是拒絕執行此請求
404:服務器沒法根據客戶端的請求找到資源(網頁)

5開頭:(服務器錯誤)

③、強緩存和協商緩存:
當說到304狀態碼的時候,面試問我控制協商緩存的字段有哪些:
控制協商緩存的字段分別有:

Last-Modified / If-Modified-Since 和 Etag / If-None-Match

*其中Etag / If-None-Match的優先級比Last-Modified / If-Modified-Since高
而後又問了我知道Etag是經過什麼生成的,這個我還真沒了解,只是知道一個標識符而已,面試官就說了是經過時間值生成的

接着又問了強緩存的狀態碼
我說強緩存成功的狀態是200,在讀取緩存緩存的時候,分爲兩種狀況,在chrome瀏覽器的Network下的Size能夠看到兩種字段

from memory cache 和 from disk cache

④、閉包的概念以及內存泄漏:

一、概念:有權訪問另外一個函數做用域和變量的函數,建立閉包最簡單的方式就是在一個函數內部建立另外一個函數。
二、好處:因爲能夠讀取函數內部的變量,若是但願一個變量常駐於內存中又可全局訪問,同時又想避免全局變量的污染,此時使用閉包就是一種恰當的方式
三、缺點:但正是由於函數內部變量被外部所引用,不會被垃圾回收,就會形成常駐內存,使用過多容易形成內存泄漏

有些時候真是給本身挖坑,哈哈哈,我說閉包使用過多會形成內存泄漏,緊接着他就問我怎麼查看內存泄漏,我說chrome瀏覽器有個面板是專門用來查看內存泄漏的,可是平時不經常使用,就沒怎麼留意,接下來他就問我常見的內存泄漏方式

1.意外的全局變量

a、在一個函數你忘記用變量聲明符(var或let)來聲明的變量,一個意外的全局變量就被建立了。
b、在函數中經過this賦予變量,在函數中,this指向window

2.定時器setTimeout setInterval以及回調函數

當不須要setInterval或者setTimeout時,定時器沒有被clear,定時器的回調函數以及內部依賴的變量都不能被回收,形成內存泄漏。
好比:vue使用了定時器,須要在beforeDestroy 中作對應銷燬處理。js也是同樣的。

3.閉包(在全局做用域上保留着閉包局部變量的引用)

4.循環引用的變量或者對象

⑤、防抖(debounce):手撕代碼
面試官把他的電腦轉向我,我看到lodash,以前我只是知道這個玩意能夠用來克服JSON深拷貝的缺陷,他叫我實現一個debounce的增強版(隨時點擊次數增長,延遲也增長)。一開始,我沒有好的思路,他就叫我先實現一個普通的debounce,代碼大體以下:

function debounce(fn, wait=1000) {    
    let timeout = 0;    
    return function(...args) {     
        if(timeout){
            clearTimeout(timeout);   
        }        
        timeout = setTimeout(() => { 
            fn.apply(this, args)
        }, wait);
    }
}

寫出來後,要求寫個增強版的,可能我想太多了吧。。。當時沒寫出來,其實只要加一條語句便可

// 上面代碼省略
 timeout = setTimeout(() => { 
    wait = wait*1.5;        // 主要增長這條語句
    fn.apply(this, args)
}, wait);

⑥、css三角形:手撕代碼
一開始我覺得是三角箭頭,挺興奮的,以爲很簡單,就說了使用兩邊的border而後在rotate便可,後來才發現是三角形,一時想不出來,他問我以前有沒有實現過,我說沒有,他就說若是以前沒有實現的話,一時半會也是想不出來的

這裏我百度的答案:

div{
    width:0;
    height:0;
    border-right:40px solid transparent;
    border-left: 40px solid transparent;
    border-bottom:40px solid red;
}

對於css方面,代碼的實現並不重要,面試官更注重思路

當他和我說了思路後,又叫我實現一個等邊三角形....
這個我就說了等邊三角形每一個角是60度,哈哈,具體不知道怎麼實現

⑦、原生js讀取cookie
通常讀寫cookie的時候我都是用 js-cookie 這個庫的,因此對於原生忘得七七八八了
由於原生js獲取cookie只能經過

document.cookie

而後得到的是全部cookie集合在一塊兒的字符串,須要使用正則什麼的對此解析

二面:

從一面完到二面起碼等了半個小時以上吧,面試個人又是另一個面試官,此次面試的內容大多涉及到業務層次的,一上來就是問你使用過哪些庫和框架,最後仍是敗在了二面

①、實現一個斐波那契數列 手撕代碼
斐波那契數列就是

1 1 2 3 5 8 13 21 34 55...

這裏我採用的遞歸的思路,由於我是非科班的,數據結構和算法沒怎麼學,厲害點的同窗這道題就會用動態規劃的方案

function recurFib(num){
    if(num < 3){
        return 1;
    }else{
        return recurFib(num-1) +  recurFib(num-2)
    }
}

②、vue和react的差別
React 和 Vue 有許多類似之處,它們都有:

使用 Virtual DOM
提供了響應式 (Reactive) 和組件化 (Composable) 的視圖組件。
將注意力集中保持在覈心庫,而將其餘功能如路由和全局狀態管理交給相關的庫。

而後又涉及到虛擬dom:

Vitual DOM是一種虛擬dom技術,本質上是基於javascript實現的,相對於dom對象,javascript對象更簡單,處理速度更快,dom樹的結構,屬性信息均可以很容易的用javascript對象來表示
原生JS或JQ操做DOM時,瀏覽器會從構建DOM樹開始從頭至尾執行一遍流程。
操做DOM的代價仍舊是昂貴的,頻繁操做仍是會出現頁面卡頓,影響用戶體驗。
建立虛擬DOM並將其映射成真實DOM,這樣全部的更新均可以先反應到虛擬DOM上,須要用到Diff算法。

③、上下固定,中間滾動佈局
這種佈局一看就是移動端的,主要以前沒有去了解移動端的佈局,可能說的太很差,本身回來用代碼實現了一下:
功能:頭部和底部自適應高度;中間佔滿剩餘部分,超出自動滾動
思路:讓容器佔滿整個頁面的高度,總體採用flex佈局,中間滾動部分用 overflow: auto

<div class="cotainer">
    <div class="header">
        header<br/><br/><br/><br/>header
    </div>
    <div class="middle">
        middle<br/><br/><br/><br/><br/><br/><br/><br/>
        middle<br/><br/><br/><br/><br/><br/><br/><br/>
        middle<br/><br/><br/><br/><br/><br/><br/><br/>
        middle<br/><br/><br/><br/><br/><br/><br/><br/>
    </div>
    <div class="footer">
        footer<br/><br/><br/><br/>footer
    </div>
</div>
html, body{
    margin: 0; 
    padding: 0;
    width: 100%; 
    height: 100%;
}
.cotainer{
    display: flex;
    flex-direction: column;
    text-align: center;
    height: 100%;
}
.middle{
    background-color: aquamarine;
    flex-grow: 1;
    overflow: auto;
}
.header, .footer{
    background-color: chartreuse;
}
/* 隱藏PC瀏覽器的滾動條,移動端無需考慮 */
.middle::-webkit-scrollbar {
    display: none;  
}

④、事件執行機制
javascript是一門單線程語言
JS 在執行的過程當中會產生執行環境,這些執行環境會被按照順序的加入到執行棧中。
同步和異步任務分別進入不一樣的執行"場所",同步的進入主線程,異步的代碼,會被掛起並加入到 Task(有多種 task) 隊列中

除了廣義的同步任務和異步任務,還包括有更加精確的微任務和宏任務
微任務包括 process.nextTick ,promise ,Object.observe ,MutationObserver
宏任務包括 script , setTimeout ,setInterval ,setImmediate ,I/O ,UI rendering

因此正確的一次 Event loop 順序是這樣的

1.執行同步代碼,這屬於宏任務
2.執行棧爲空,查詢是否有微任務須要執行
3.執行全部微任務
4.必要的話渲染 UI
5.而後開始下一輪 Event loop,執行宏任務中的異步代碼

⑤、跨域
我說通常都是用CORS比較多
CORS原理:使用自定義的HTTP頭部讓瀏覽器和服務器溝通
如添加一個額外的Origin頭部,包含請求頁面的的地址信息(協議、域名、端口號)
在後臺設置 Access-Control-Allow-Origin便可

而後進一步問了CORS的預檢請求,問了OPTIONS的做用
接着又問了在知足什麼條件下不會觸發CORS的預檢請求,
這個一時想不起來,MDN上面總結得比較齊全
知足簡單請求(不會觸發 CORS 預檢請求)的條件:

一、請求爲GET、HEAD、POST其一
二、請求字段知足CORS安全集合的字段
三、Content-Type 有限制

⑥、node.js的知識
對node不太瞭解,涉及到websocket...看來要好好加油了

⑦、微信公衆號的知識
面試問了我微信公衆號的知識....我只是作過微信小程序,並無涉及到公衆號

總結:

面試總體難度適中,其實對於此次面試我本身自己就是抱着一種嘗試的心態,在面試的時候,咱們應該要以一種學習者的心態,不會就去問面試官和麪試官討論,不斷強化本身的實力,路還漫長,今天也要加油鴨!

相關文章
相關標籤/搜索