2018.10.26 酷狗音樂校招前端一面經歷(轉)
酷狗一面
1. 如何實現三欄佈局(左右兩邊固定寬度,中間自適應)?
使用flex佈局: 父元素設定
display: flex
,左右兩邊設定固定寬度,中間設定flex-grow: 1
;使用浮動佈局:左右兩邊設定固定寬度,而且分別設定
float:left和right
,這個方法有一個需要注意的是在HTML中,中間欄需要和右邊欄進行對調;使用絕對定位佈局:左右兩邊設定固定寬度和
position:absolute
,而且分別設定left: 0
和right: 0
,中間欄只要設定左右margin為左右欄的寬度就可以了(需要注意的是左右兩邊需要設定top: 0
,不然右邊會被訂下來)
補充
其實還有表格佈局,網格佈局和聖盃佈局,詳細請看三欄佈局的5種解決方案及優缺點
2. 如何實現彈窗水平垂直居中?
3. ==
和 ===
的區別
===
為恆等符:當等號兩邊的值為相同型別的時候,直接比較等號兩邊的值,值相同則返回true,若等號兩邊的值型別不同時直接返回false。
==
為等值符: 當等號兩邊的值為相同型別時比較值是否相同,型別不同時會發生型別的自動轉換,轉換為相同的型別後再作比較。
a、如果一個是null、一個是undefined,那麼[相等]。
b、如果一個是字串,一個是數值,把字串轉換成數值再進行比較。
c、如果任一值是 true,把它轉換成 1 再比較;如果任一值是 false,把它轉換成 0 再比較。
d、如果一個是物件,另一個是數值或字串,把物件轉換成基礎型別的值再比較。物件轉換成基礎型別,利用它的toString或者valueOf方法。 js核心內建類,會嘗試valueOf先於toString;例外的是Date,Date利用的是toString轉換。非js核心的物件,令說(比較麻 煩,我也不大懂)
e、任何其他組合,都[不相等]。
4. 30 ==
'30' 的過程是怎樣的?
30為數值型別,而'30'未字串型別,因此等號兩邊的資料型別不相等,需要進行轉換型別;
由於一個是數值,另一個字串,所以需要將字串轉換成數值再進行比較,即
'30' => 30
;這時等號兩邊同樣為數值型資料,即
30 == 30
,所以返回true
5. 以下程式碼輸出的是什麼?為什麼呢?
-
for (var i=0; i<5; i++) {
-
setTimeout( function timer() {
-
console.log(i);
-
}, 0 );
-
}
6. 你有使用過閉包嗎?
7. 模組化的非同步載入怎樣做?
8. window.onload
執行時間?
9.圖片載入完的時候會執行嗎?
10. 瞭解JS繼承嗎?
11. 利用原型鏈的繼承有什麼缺點嗎?
12. 知道如何修改this的指向嗎?
修改this指向的辦法有三種:
apply
、call
和bind
apply
、call
:通過傳入需要指向的物件,從而改變this
的指向,指向傳入的第一個引數;bind
:它會建立一個函式的例項,其this值會被繫結到傳給bind()函式的值。
-
window.color = 'red';
-
var o = { color:'blue' };
-
function sayColor(){
-
console.log(this.color);
-
}
-
var globalSaycolor = sayColor;
-
var objectSaycolor = sayColor.bind(o);
-
globalSaycolor(); // red
-
objectSaycolor(); // blue
補充
其實還有一種:new關鍵字改變this指向
因為在new
的過程中,其中有一個步驟為將建構函式內部的this
指向例項物件,所以通過new關鍵字
也可以改變this
的指向。
13. apply
和 call
的區別?
相同點:可以用來代替另一個物件呼叫一個方法,將一個函式的物件上下文從初始的上下文改變為由thisObj指定的新物件。
不同點:實際上,
apply
和call
的功能是一樣的,只是傳入的引數列表形式不同。apply
:最多隻能有兩個引數——新this
物件和一個數組argArray
。如果給該方法傳遞多個引數,則把引數都寫進這個數組裡面,當然,即使只有一個引數,也要寫進數組裡。如果argArray
不是一個有效的陣列或arguments
物件,那麼將導致一個TypeError
。如果沒有提供argArray
和thisObj
任何一個引數,那麼Global物件將被用作thisObj
,並且無法被傳遞任何引數。
call
:它可以接受多個引數,第一個引數與apply
一樣,後面則是一串引數列表。這個方法主要用在js物件各方法相互呼叫的時候,使當前this例項指標保持一致,或者在特殊情況下需要改變this指標。如果沒有提供thisObj
引數,那麼 Global 物件被用作thisObj
。
14. 有一個按鈕是非同步生成的,怎樣對它進行事件繫結?
由於按鈕是非同步生成的,所以我選擇將事件繫結在按鈕生成的父元素上,通過事件委託的機制,利用事件冒泡,把事件繫結在父元素上,可以通過判斷
event.target
按鈕是否已經生成,從而實現相應的事件。科普補充:
事件冒泡可以形象地比喻為把一顆石頭投入水中,泡泡會一直從水底冒出水面。也就是說,事件會從最內層的元素開始發生,一直向上傳播,直到document
物件;
事件捕獲則跟事件冒泡相反,事件會從document
物件開始發生,直到最具體的元素;
15. 跨域有處理過嗎?
我處理過的跨域有兩種情況:
一種是在頁面中嵌入了一個iframe,因此父子iframe間產生了跨域,要解決這個問題,只需要把
document.domain
設定成相同的值就可以在兩個頁面裡進行相應的操作了;另外一種情況是用Vue開發涉及到的跨域問題,這個問題只需要修改config資料夾下的index.js中的dev:{}部分中修改proxyTable引數即可,相當於對跨域的url進行了代理,從而可以順利訪問。
另外說了一下自己比較熟悉的一種跨域解決方案:JSONP
JSONP解決跨域問題的本質其實就是<script>
標籤可以請求不同域名下的資源,即<script>
請求不受瀏覽器同源策略影響。
面試官聽到JSONP立刻提出了一個問題:JSONP是否可以支援 POST
方法?為什麼?
JSONP只支援
GET
的請求方法,上面也提到了JSONP原理其實就是利用<script>
標籤傳送了一個URL
給伺服器,其實與ajax XMLHttpRequest
協議無關了,相當於輸入了一個url
而已,所以必然只能為GET
請求方法。
16. 既然提到 POST
和 GET
,說說兩者的區別?
大小:
GET
提交的資料最大為2k(原則上url長度無限制,可是瀏覽器通常限制url長度在2k左右);POST
理論上沒有限制大小(實際上IIS4中最大量為80KB,IIS5中為100KB)。傳送方式:
GET
請求資料放在url上,即HTTP協議頭中,其格式為:url?key=value&key2=value
;POST
把資料放在HTTP的包體中(Request Body)。安全性:
GET
請求可被快取,請求儲存在瀏覽器歷史記錄中;POST
則不能被快取。與POST
相比,GET
的安全性較差,因為傳送的資料是URL的一部分。傳送TCP包:對
GET
請求只產生一個TCP包,瀏覽器會把http header
和data
一併傳送出去,伺服器響應200
(返回資料);對於POST
請求產生兩個TCP資料包,瀏覽器先發送http header
,伺服器確認許可權正確響應100
(continue)返回瀏覽器,瀏覽器收到100
確認繼續請求,再次傳送data
,伺服器響應200
(返回資料)。
17. 聽到你提到瀏覽器,你瞭解瀏覽器快取的方式嗎?
18. 看你有用過Promise,知道Promise有幾種狀態?
19. 你知道 pending
狀態可以停止嗎?
20. 那XMLHttpRequest 的 pending
狀態可以停止嗎?
21. 知道Promise和setTimeout的執行順序嗎?
22. vue中生命週期中的鉤子函式用過哪些?
23. 為什麼不把資料放在created函式中?
24. 對Vue的資料雙向繫結有了解嗎?
25. 瞭解重繪和迴流嗎?頁面的載入順序?
26. 如何減少迴流、重繪?怎樣控制只有一部分迴流?
27. 瞭解什麼演算法?快排?
28. 還了解什麼排序演算法?
29. 瞭解二叉查詢樹嗎?
30. 有了解什麼後端語言嗎?知道面向物件的特性嗎?
31. 知道資料庫連線池嗎?
32. 未來前端的規劃?
酷狗二面
在面完第一面之後,本來以為終於結束了,沒想到迎來的是第二技術面,後面面試官介紹說其實本來是應該兩個人同時面我的,因為有一個面試官沒空,所以就錯開了,就有了"二面"了,其實本質上還是一面而已。
1. 自我介紹
2. 問了一下筆試的時候不應該錯的題
3. 理解的HTTP狀態碼有哪些?
4. 正則的題目,對比 /^[a-z0-9][a-z]+$/
和 /^[a-z0-9][a-z]*$/
的區別?
5. display:none
和 visibility:hidden
的區別?
6. CSS選擇器的理解,你知道多少選擇器?
7. CSS3佈局,移動端有用過rem嗎?佈局的話一般怎樣佈局?
8. Flex佈局和傳統的其他佈局有什麼優點?
9. Flex的居中方式有哪些?其他方式有哪些?
10. display設定inline-block的話,多個之間有間隔應該怎樣處理? (父節點font-size: 0)
11. 更熟悉那方面的技術棧?
12. 對自己專案是怎樣設計和選型的?
13. 有用到vuex嗎?
14. 元件之間的通訊怎樣做到?
15. 真的學習前端是什麼時候開始?
16. 方向是選擇全棧還是隻做前端?
17. 有沒有在nodeJS上做過什麼?
18. 有沒有在npm上面做過開源的學習?
19. 對畢業之後的學習規劃?
END
作者:BlueYuFisher
https://segmentfault.com/a/1190000016828125