記錄一次搜狐面試(包括筆試題)

1.如何用一個div實現下圖

clipboard.png

css

#demo{
        width:120px;
        height: 120px;
        border:2px solid #333;
        border-radius: 20px;
        position:relative;
    }
    #demo:before,#demo:after{
        content: "";
        width: 60px;
        height: 60px;
        position: absolute;
        left: 50%;
        top: 50%;
    }
    #demo:before{
        margin-left: -30px;
        border-top: 2px solid;
    }
    #demo:after{
        margin-top: -30px;
        border-left: 2px solid;
    }
    

html

<div id='demo'></div>

類似這樣用僞類實現圖形的題目還有很多,分享兩個:
用純CSS實現一個帶三角的正方形 僅用一個div
https://blog.csdn.net/hahahah...
CSS實現太極圖(1個DIV實現)
https://www.cnblogs.com/web12...

2.如何實現①平行四邊形 ②三角形
① 平行四邊形
css

div {
  width:100px;
  height:100px;
  border: 2px solid #333;
  color: #333;
  transform: skew(-20deg);
}

html

<div></div>

運行結果:

clipboard.png

②三角形
css

div{
  width: 0;
  height: 0;
  border: 10px solid transform;
  border-top-style: red;
  }

html

<div></div>

運行結果:

clipboard.png

3.請寫出下列alert的結果

alert(typeof null) //object
alert(typeof undefined) //undefined
alert(typeof NaN) //number
alert(NaN == undefined) //false
alert(NaN ==NaN) //false
var str="123abc"
alert(typeof str++)//number
alert(str)//NaN

4.已知有數組 [[1,2,2],[3,4,5,5],[6,7,8,9,[11,12,[12,13,[14]]]],10],扁平化數組後應該得到的數組爲:[1,2,2,3,4,5,5,6,7,8,9,11,12,12,13,14,10],請寫出實現扁平化額代碼。
第一種方法:

var arr=[[1,2,2],[3,4,5,5],[6,7,8,9,[11,12,[12,13,[14]]]],10]
function Flat1(arr){
  var newArr =[];
  for(var i= 0; i < arr.length; i++){
    if(arr[i] instanceof Array){
      newArr = newArr.concat(Flat5(arr[i]));
      // newArr.push.apply(newArr, Flat5(arr[i]));
    }else{
      newArr.push(arr[i]);
    }
  }
  return newArr;
}
console.log(Flat1(arr))

第二種方法:(es6的方法)

var arr=[[1,2,2],[3,4,5,5],[6,7,8,9,[11,12,[12,13,[14]]]],10]
const Flat2 = arr => arr.reduce((a, b) => a.concat(Array.isArray(b) ? 
Flat2(b) : b), []); 
console.log(Flat2(arr))

對應es5的代碼

var arr=[[1,2,2],[3,4,5,5],[6,7,8,9,[11,12,[12,13,[14]]]],10]
var Flat3 = function (arr){
    return arr.reduce(function(a,b){
      return a.concat(Array.isArray(b)? Flat3(b):b)
    },[]);
}
console.log(Flat3(arr))

5.寫出下列代碼執行結果:

async function async1(){
  console.log('async1 start')
  await async2()
  console.log('async1 end')
}
async function async2(){
  console.log('async2')
}
console.log('script start')
setTimeout(function(){
  console.log('setTimeout')
},0)  
async1();
new Promise(function(resolve){
  console.log('promise1')
  resolve();
}).then(function(){
  console.log('promise2')
})
console.log('script end')

運行結果:

script start
async1 start
async2
promise1
script end
promise2
async1 end
setTimeout

類似題目修改:

async function async1(){
  console.log('async1 start')
  await async2()
  console.log('async1 end')
}
function async2(){ // 去掉了 async 關鍵字
  console.log('async2')
}
console.log('script start')
setTimeout(function(){
  console.log('setTimeout')
},0)  
async1();
new Promise(function(resolve){
  console.log('promise1')
  resolve();
}).then(function(){
  console.log('promise2')
})
console.log('script end')

運行結果:

script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout

解析:https://www.cnblogs.com/geyou...

6.寫出能夠將http://www.sohu.com/a/2830163...{code:aaa,_f:index_cpc_0}的函數

function parseObject(url){
  var obj = {};
  if(url.indexOf('?')!==-1){
    var url = url.substring(url.indexOf('?')+1);
  }else{
  return ;
  }
  var arr = url.split('&');
  arr.forEach(function(val){
    var brr = val.split('=');
    obj[brr[0]] = brr[1];
  });
  return obj;
}
var url="http://www.sohu.com/a/283016366_267106?code=aaa&_f=index_cpc_0"
parseObject(url)

7.tcp/ip協議

TCP/IP 是一類協議系統,它是用於網絡通信的一套協議集合.
傳統上來說 TCP/IP 被認爲是一個四層協議

clipboard.png
1) 網絡接口層:
主要是指物理層次的一些接口,比如電纜等.

2) 網絡層:
提供獨立於硬件的邏輯尋址,實現物理地址與邏輯地址的轉換.

在 TCP / IP 協議族中,網絡層協議包括 IP 協議(網際協議),ICMP 協議( Internet 互聯網控制報文協議),以及 IGMP 協議( Internet 組管理協議).

3) 傳輸層:
爲網絡提供了流量控制,錯誤控制和確認服務.

在 TCP / IP 協議族中有兩個互不相同的傳輸協議: TCP(傳輸控制協議)和 UDP(用戶數據報協議).

4) 應用層:
爲網絡排錯,文件傳輸,遠程控制和 Internet 操作提供具體的應用程序

8.關於緩存
1. 前端緩存概述
前端緩存主要是分爲HTTP緩存和瀏覽器緩存。其中HTTP緩存是在HTTP請求傳輸時用到的緩存,主要在服務器代碼上設置;而瀏覽器緩存則主要由前端開發在前端js上進行設置。下面會分別具體描述。

clipboard.png
2. 前端緩存分類
2.1 HTTP緩存
從HTTP協議開始說起
由於整個網絡服務都是基於http協議 的,因此先來介紹一下HTTP協議當中定義的緩存機制。HTTP協議主要是通過請求頭當中的一些字段來和服務器進行通信,從而採用不同的緩存策略。
一般來說,對於一個完整的HTTP GET請求緩存過程會包含七個主要的步驟:①從接收網絡請求開始,②客戶端會讀取請求報文並且對報文進行解析, 進而提取URL和各種首部,③然後將會查詢是否在本地有副本,如果本地沒有副本就會從服務器上獲取一份副本並且保存在本地。④接着會進行查看副本是否足夠新鮮(新鮮度檢測), 如果緩存已經失效就會詢問服務器是否有任何更新,⑤服務器就會用新的首部和已緩存的主體來構建一條響應報文,⑥最後發送給客戶端。⑦根據服務器的不同,會可選地選擇創建日誌記錄該過程。

clipboard.png
整體流程:HTTP緩存都是從第二次請求開始的。
第一次請求資源時,服務器返回資源,並在respone header頭中回傳資源的緩存參數;第二次請求時,瀏覽器判斷這些請求參數,擊中強緩存就直接200,否則就把請求參數加到request header頭中傳給服務器,看是否擊中協商緩存,擊中則返回304,否則服務器會返回新的資源。
HTTP緩存分爲強緩存和協議緩存,它們的區別如下:

clipboard.png

200 from disk or 200 from memory :
強緩存的200也有兩種情況:200 from disk和200 from memory。現在我沒有找到明確的文檔來描述這種區別的發生條件。https://www.zhihu.com/questio... 這個問題知乎中提到了一些情景,可以自行取用。

2.1.1 強緩存

clipboard.png

2.1.2 協商緩存
協商緩存都是成對出現的。

clipboard.png

2.1.3 最佳優化策略-消滅304
最佳優化策略:因爲協商緩存本身也有http請求的損耗,所以最佳優化策略是要儘可能的將靜態文件存儲爲較長的時間,多利用強緩存而不是協商緩存,即消滅304。

但是給文件設置一個很長的Cacha-Control也會帶來其他的問題,最主要的問題是靜態內容更新時,用戶不能及時獲得更新的內容。這時候就要使用hash的方法對文件進行命名,通過每次更新不同的靜態文件名來消除強緩存的影響。

Hash命名:
http://xxx.com/main.5eas34fa.js
http://xxx.com/main.js?5eas34fa
http://xxx.com/5eas34fa/main.js

2.2 瀏覽器緩存
2.2.1 本地存儲小容量
Cookie主要用於用戶信息的存儲,Cookie的內容可以自動在請求的時候被傳遞給服務器。
LocalStorage的數據將一直保存在瀏覽器內,直到用戶清除瀏覽器緩存數據爲止。
SessionStorage的其他屬性同LocalStorage,只不過它的生命週期同標籤頁的生命週期,當標籤頁被關閉時,SessionStorage也會被清除。

clipboard.png

2.2.2 本地存儲大容量
WebSql和IndexDB主要用在前端有大容量存儲需求的頁面上,例如,在線編輯瀏覽器或者網頁郵箱。

clipboard.png

2.2.3 應用緩存與PWA
應用緩存全稱爲Offline Web Application,它的緩存內容被存在瀏覽器的Application Cache中。它也是一個被W3C標準廢棄的功能,主要是通過manifest文件來標註要被緩存的靜態文件清單。但是在緩存靜態文件的同時,也會默認緩存html文件。這導致頁面的更新只能通過manifest文件中的版本號來決定。而且,即使我們更新了version,用戶的第一次訪問還是會訪問到老的頁面,只有下一次再訪問才能訪問到新的頁面。所以,應用緩存只適合那種常年不變化的靜態網站。如此的不方便,也是被廢棄的重要原因。

PWA全稱是漸進式網絡應用,主要目標是實現web網站的APP式功能和展示。儘管PWA也有manifest文件,但是與應用緩存卻完全不同。不同於manifest簡單的將文件通過是否緩存進行分類,PWA用manifest構建了自己的APP骨架。另外,PWA用Service Worker來控制緩存的使用。這一塊的內容較多,在這裏就不詳細展開了。

clipboard.png

2.2.4 往返緩存
往返緩存又稱爲BFCache,是瀏覽器在前進後退按鈕上爲了提升歷史頁面的渲染速度的一種策略。BFCache會緩存所有的DOM結構,但是問題在於,一些頁面開始時進行的上報或者請求可能會被影響。這個問題現在主要會出現在微信h5的開發中。
原文:http://web.jobbole.com/95057/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章