1.如何用一個div實現下圖css
csshtml
#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...es6
2.如何實現①平行四邊形 ②三角形
① 平行四邊形
cssweb
div { width:100px; height:100px; border: 2px solid #333; color: #333; transform: skew(-20deg); }
html數組
<div></div>
運行結果:promise
②三角形
css瀏覽器
div{ width: 0; height: 0; border: 10px solid transparent; border-top-style: #333; }
html緩存
<div></div>
運行結果:服務器
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(Flat1(arr[i])); // newArr.push.apply(newArr, Flat1(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 被認爲是一個四層協議
1) 網絡接口層:
主要是指物理層次的一些接口,好比電纜等.
2) 網絡層:
提供獨立於硬件的邏輯尋址,實現物理地址與邏輯地址的轉換.
在 TCP / IP 協議族中,網絡層協議包括 IP 協議(網際協議),ICMP 協議( Internet 互聯網控制報文協議),以及 IGMP 協議( Internet 組管理協議).
3) 傳輸層:
爲網絡提供了流量控制,錯誤控制和確認服務.
在 TCP / IP 協議族中有兩個互不相同的傳輸協議: TCP(傳輸控制協議)和 UDP(用戶數據報協議).
4) 應用層:
爲網絡排錯,文件傳輸,遠程控制和 Internet 操做提供具體的應用程序
8.關於緩存
1. 前端緩存概述
前端緩存主要是分爲HTTP緩存和瀏覽器緩存。其中HTTP緩存是在HTTP請求傳輸時用到的緩存,主要在服務器代碼上設置;而瀏覽器緩存則主要由前端開發在前端js上進行設置。下面會分別具體描述。
2. 前端緩存分類
2.1 HTTP緩存
從HTTP協議開始提及
因爲整個網絡服務都是基於http協議 的,所以先來介紹一下HTTP協議當中定義的緩存機制。HTTP協議主要是經過請求頭當中的一些字段來和服務器進行通訊,從而採用不一樣的緩存策略。
通常來講,對於一個完整的HTTP GET請求緩存過程會包含七個主要的步驟:①從接收網絡請求開始,②客戶端會讀取請求報文而且對報文進行解析, 進而提取URL和各類首部,③而後將會查詢是否在本地有副本,若是本地沒有副本就會從服務器上獲取一份副本而且保存在本地。④接着會進行查看副本是否足夠新鮮(新鮮度檢測), 若是緩存已經失效就會詢問服務器是否有任何更新,⑤服務器就會用新的首部和已緩存的主體來構建一條響應報文,⑥最後發送給客戶端。⑦根據服務器的不一樣,會可選地選擇建立日誌記錄該過程。
總體流程:HTTP緩存都是從第二次請求開始的。
第一次請求資源時,服務器返回資源,並在respone header頭中回傳資源的緩存參數;第二次請求時,瀏覽器判斷這些請求參數,擊中強緩存就直接200,不然就把請求參數加到request header頭中傳給服務器,看是否擊中協商緩存,擊中則返回304,不然服務器會返回新的資源。
HTTP緩存分爲強緩存和協議緩存,它們的區別以下:
200 from disk or 200 from memory :
強緩存的200也有兩種狀況:200 from disk和200 from memory。如今我沒有找到明確的文檔來描述這種區別的發生條件。https://www.zhihu.com/questio... 這個問題知乎中提到了一些情景,能夠自行取用。
2.1.1 強緩存
2.1.2 協商緩存
協商緩存都是成對出現的。
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也會被清除。
2.2.2 本地存儲大容量
WebSql和IndexDB主要用在前端有大容量存儲需求的頁面上,例如,在線編輯瀏覽器或者網頁郵箱。
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來控制緩存的使用。這一塊的內容較多,在這裏就不詳細展開了。
2.2.4 往返緩存
往返緩存又稱爲BFCache,是瀏覽器在前進後退按鈕上爲了提高歷史頁面的渲染速度的一種策略。BFCache會緩存全部的DOM結構,可是問題在於,一些頁面開始時進行的上報或者請求可能會被影響。這個問題如今主要會出如今微信h5的開發中。
原文:http://web.jobbole.com/95057/