嚴禁轉載,嚴禁分享,只供私自鑒賞,請君悉知!
一:基礎題
1.什么是margin塌陷?請寫出至少三種解決margin塌陷的方法。
答:當兩個盒子在垂直方向上設置margin值時,會出現一個有趣的塌陷現象。
解決方法:
(1)為父盒子設置border,為外層添加border后父子盒子就不是真正意義上的貼合 (可以設置成透明:border:1px solid transparent)。
(2)為父盒子添加overflow:hidden;
(3)為父盒子設定padding值;
(4)為父盒子添加position:fixed;
(5)為父盒子添加 display:table;
(6)利用偽元素給子元素的前面添加一個空元素
2.當元素的樣式發生變化時,瀏覽器需要觸發更新,重新繪制元素。這個過程中有兩種類型的操作,即重繪與回流。
請問什么時候會發生重繪(repaint),簡述什么時候會發生回流(reflow),在寫css和javascript時應該注意哪些可以減少和避免重繪和回流?
答:
什么是回流:
什么是重繪:
CSS中避免回流、重繪
2.避免設置多層內聯樣式
3.動畫效果應用到position屬性為absolute或fixed的元素上
4.避免使用table布局
5.使用css3硬件加速,可以讓transform、opacity、filters等動畫效果不會引起回流重繪
JS操作避免回流、重繪
1.避免使用JS一個樣式修改完接着改下一個樣式,最好一次性更改CSS樣式,或者將樣式列表定義為class的名稱
2.避免頻繁操作DOM,使用文檔片段創建一個子樹,然后再拷貝到文檔中
3.先隱藏元素,進行修改后再顯示該元素,因為display:none上的DOM操作不會引發回流和重繪
4.避免循環讀取offsetLeft等屬性,在循環之前把它們存起來
5.對於復雜動畫效果,使用絕對定位讓其脫離文檔流,否則會引起父元素及后續元素大量的回流
3.請用原生js手寫節流和防抖。
防抖函數。
將幾次操作合並為一次操作進行。設置一個計時器,規定在延遲時間后觸發函數,但是在延遲時間內如果再次觸發,就會取消之前的計時器。如此,只有最后一次操作能觸發。代碼如下:
1 function debounce(fn,wait){ 2 let timer=null; 3 return function(){ 4 let args=arguments,that=this; 5 timer&&clearTimeout(timer); 6 timer=setTimeout(function(){fn.apply(that,args)},wait) 7 } 8 }
節流函數。
一定時間內只觸發一次函數。並且開始觸發一次,結束觸發一次。代碼如下:
1 function throttle(fun, delay){ 2 let timer = null; 3 let startTime = Date.now(); 4 return function(){ 5 let curTime = Date.now(); 6 let remain = delay - (curTime - startTime); 7 let that = this; 8 let args = arguments; 9 clearTimeout(timer); 10 if(remain <= 0){ 11 fun.apply(that,args); 12 startTime = Date.now(); 13 }else{ 14 timer = setTimeout(fun, remain); 15 } 16 } 17 }
4.以下代碼的運行結果是什么?簡述一下原因。
1 <script> 2 setTimeout(() => { 3 console.log(1) 4 }, 0) 5 const promise = new Promise((resolve, reject) => { 6 console.log(2); 7 resolve() 8 console.log(3); 9 }) 10 promise.then(() => { 11 console.log(4); 12 }) 13 console.log(5); 14 // 輸出結果為: 2 3 5 4 1 15 </script>
5.深拷貝:完全拷貝一個新對象,修改時原對象不再受到任何影響,請封裝一個深拷貝的函數。
1 //對象及數組深拷貝函數封裝 2 function deepCopy(objOrArr) { 3 var type = objOrArr instanceof Array ? 'arr' : 'obj' 4 var newObjOrArr = objOrArr instanceof Array ? [] : {} 5 if (type === 'arr') { 6 newObjOrArr = JSON.parse(JSON.stringify(objOrArr)) 7 } else { 8 for (var key in objOrArr) { 9 if (objOrArr.hasOwnProperty(key)) { 10 newObjOrArr[key] = typeof objOrArr[key] === 'object' ? deepCopy(objOrArr[key]) : objOrArr[key] 11 } 12 } 13 } 14 15 return newObjOrArr 16 }
6.1XX,2XX,3XX,4XX,5XX,開頭的狀態碼表示什么?
答:
1XX類狀態碼信息表示:臨時的響應。客戶端在收到常規響應之前,應准備接收一個或多個1XX響應
2XX類狀態碼信息表示:服務器成功的接收了客戶端請求
3XX類狀態碼信息表示:客戶端瀏覽器必須采取更多操作來實現請求。例如,瀏覽器可能不得不請求服務器上的不同頁面,或者通過代理服務器重復該請求
4XX類狀態碼信息表示:發生錯誤,客戶端似乎有問題。例如:客戶端請求不存在的頁面,客戶端為提供有效的身份驗證信息
5XX類狀態碼信息表示:服務器遇到錯誤而不能完成該請求
7.請簡述一下TCP三次握手的過程。
TCP握手協議
在TCP/IP協議中,TCP協議提供可靠的連接服務,采用三次握手建立一個連接.
第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;
SYN:同步序列編號(Synchronize Sequence Numbers)
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手.
8.請用原生的js封裝一個方法,對一個無序數組進行排序。
例如:arr = [1,6,2,18,9,21,5,32,16]
1 //冒泡排序(從小到大) 2 function bubbleSortSmallToBig(arr){ 3 for(var i = 1;i < arr.length;i ++){ 4 for(var j = 0;j < arr.length - i;j ++){ 5 if(arr[j] > arr[j + 1]){ 6 var t = arr[j]; 7 arr[j] = arr[j + 1]; 8 arr[j + 1] = t; 9 } 10 } 11 } 12 return arr; 13 }
9.請用原生的js封裝一個方法,對一個有序數組進行隨機亂序。
例如:arr = [1,6,2,18,9,21,5,32,16]
1 function chan(data) { 2 for (let i = 0; i < data.length; i++) { 3 // 生成隨機索引,然后將生成的隨機索引和遍歷的a[i]進行對調 4 let index = parseInt(Math.random() * data.length); 5 let zancun = data[i]; 6 data[i] = data[index]; 7 data[index] = zancun; 8 } 9 }
10.請簡述一下對 token丶cookie丶session 三者的理解。
詳情:https://blog.csdn.net/jikeehuang/article/details/51488020
二:綜合題
1.假設我們目前擁有一個產品化的項目,但是存在某些客戶擁有不同的定制化版本,假設我們為每個用戶都新建一個項目,
那么客戶越多,項目就會越多,如此積累下去項目會變得非常的難以維護,請問你會用什么方式去解決該問題?
答:。。。
2.git的沖突是怎么產生的?gitlab如何進行分支保護策略?
答:多個開發者同時使用或者操作git中的同一個文件,最后在依次提交commit和推送push的時候,第一個操作的是可以正常提交的,而之后的開發者想要執行pull(拉)和pull(推)操作的時候,就會報沖突異常conflict。
3.請簡述一下在瀏覽器中輸入 url 到渲染頁面的過程。
答:
2.與服務器建立連接 (瀏覽器獲得完整的服務器IP地址后,域名解析環節完成。之后,瀏覽器通過IP地址查找到對應的服務器,並將用戶發起的http請求發送給服務器。)
3.服務器處理並返回http報文
4.瀏覽器解析渲染頁面 (瀏覽器接收到后台返回的HTML字符串后,會依次經歷:加載、解析、渲染。)