七月雖然不是一個豐收的季節,但倒是一個十分酷熱的月份。不知有多少小夥伴跟我同樣,頂着大太陽奔波在各類面試的征途中。面試是一個漫長的過程。可是也是一個讓你快速提高的過程。其中包含了無數的血與淚。去面試前首先咱們必須有牢固的基礎知識,足夠豐富的項目經歷(就我而言差很少是三個完整項目經歷,時間累計差很少接近一年)。而後就是表述能力,你要能把你的答案給面試官描述清楚,注意專業詞彙,這將大大提升面試官對你的印象分!css
學而不思則罔,思而不學則殆。當走完基本全部大廠以後,發現其實每一個公司對基礎能力的考察都比較注重,只有基礎掌握好了,把前端全部的知識可以一連串的理清。那麼無論面試題是什麼,均可以遊刃有餘的去回答。這裏就是把我全部面試過的問題的一些底層原理闡述,並不會去描述我在面試中碰到的題目。這樣一方面能夠幫你過一遍js的基礎也能夠幫助我加深理解。下面我就分模塊的去講解沒一個知識點。篇幅過長,請耐心閱讀!!!html
css中的盒子模型包括IE盒子模型和標準的W3C盒子模型。其盒子模型仍是要歸宗於box-sizing的屬性,盒子模型對應的分被爲border-box,content-box。所謂的標準盒子模型(border-box):width = 左右border+左右padding+contentwidth,而咱們的IE盒子模型(border-box): width = content+padding+border 元素指定的任何內邊距和邊框都將在已設定的寬度和高度內進行繪製。前端
方法一:transform:scaleY(0.5)使用僞元素設置1px的邊框,而後對邊框進行縮放(scaleY) 實現思路:node
方法二: border-image 設置圖片的邊框git
Animation和transition大部分屬性是相同的,他們都是隨時間改變元素的屬性值,他們的主要區別是transition須要觸發一個事件才能改變屬性, 而animation不須要觸發任何事件的狀況下才會隨時間改變屬性值,而且transition爲2幀,從from .... to,而animation能夠一幀一幀的。es6
1.使用flexgithub
在父盒子設置display: flex; justify-content: center;align-items: center
複製代碼
2.使用css的transformweb
父盒子設置:display:relative
Div 設置: transform: translate(-50%,-50%);position: absolute;top: 50%;left: 50%;
複製代碼
3.display:table-cell面試
父盒子設置:display:table-cell; text-align:center;vertical-align:middle;
Div 設置: display:inline-block;vertical-align:middle;
複製代碼
1.給父級元素定義高度 2.讓父級元素也浮動 3.父級定義display:table 4.父元素設置overflow:hidden 5.clearfix:使用內容生成的方式清除浮動 .clearfix:after { // :after選擇器向選定的元素以後插入內容 content:""; // 生成內容爲空 display: block; // 塊級元素顯示 clear:both; // 清除前面元素 } 不破壞文檔流,沒有反作用 複製代碼
基本的:
1.id選擇器(id="name")
2.類選擇器(class="head")
3.標籤選擇器(body, div, ul, li)
4.全局選擇器(*)
複雜的:
1.組合選擇器(.head .head_logo)
2.後代選擇器 (#head .nav ul li 從父集到子孫集)
3.羣組選擇器 (div, span, img {color:Red} 具備相一樣式的標籤分組顯示)
4.繼承選擇器
5.僞類選擇器(連接樣式,a元素的僞類)
6.子選擇器(div>p, 帶大於號>)
7.CSS相鄰相鄰兄弟選擇器(h1+p, 帶加號+)
複製代碼
優先級:算法
不一樣級別:總結排序:!important > 行內樣式 > ID選擇器 > 類選擇器 > 標籤 > 通配符 > 繼承 > 瀏覽器默認屬性
同一級別:後寫的會覆蓋先寫的
css選擇器的解析原則:選擇器定位DOM元素是從右往左的方向,這樣能夠儘早的過濾掉一些沒必要要的樣式規則和元素
塊元素 | 行內元素 |
---|---|
塊元素會獨佔一行,默認狀況下,其寬度自動填滿父元素寬度 行元素不會佔據一行,會一直排在一行,直到一行排不下 | 行元素沒有寬度和高度屬性,塊級元素即便設置了寬度,仍是會獨佔一行 |
塊級元素: div p forn ul li h1-h6 | 行內元素:span img input a i |
注意:對於行內元素,font-size指定 他們的content area的高度,因爲inline box = 上下的helf-leading,若是leading爲0,在這種狀況下,font-size指定了inline box的高度font-size指的是字體的高度,可是不能指定每一個字形給定字體高度下的實際高度,致使了span的高度大於line-height
設置寬高,而後用border去畫
width: 0;
height: 0;
border-bottom: 100px solid cyan;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
複製代碼
visibility:hidden、display:none、z-index=-一、opacity:0
可是隨着JS技術的發展,JS也開始承擔頁面渲染的工做。好比咱們的UI其實能夠分被對待,把渲染頁面的js放在前面,時間處理的js放在後面
能夠簡單的使一個元素居中(包括水平和垂直居中)柵格式系統佈局,bootstrap grid
三欄是佈局(兩邊兩欄寬度固定,中間欄寬度自適應)
行內元素居中(父元素text-align:center)
塊狀元素居中(塊狀元素沒發用text-align)
1.寬度必定:margin:auto
2.寬度不定:塊級變行內,而後在父上text-aligin
複製代碼
理解:BFC是css佈局的一個概念,是一塊獨立的渲染區域,一個環境,裏面的元素不會影響到外部的元素
如何生成BFC:(脫離文檔流)
【1】根元素,即HTML元素(最大的一個BFC)
【2】float的值不爲none
【3】position的值爲absolute或fixed
【4】overflow的值不爲visible(默認值。內容不會被修剪,會呈如今元素框以外)
【5】display的值爲inline-block、table-cell、table-caption
BFC佈局規則:1.內部的Box會在垂直方向,一個接一個地放置。
2.屬於同一個BFC的兩個相鄰的Box的margin會發生重疊
3.BFC就是頁面上的一個隔離的獨立容器,容器裏面的子元素不會影響到外面的元素。反之也如此, 文字環繞效果,設置float
4.BFC的區域不會與float box重疊。
5.計算BFC的高度,浮動元素也參與計算
BFC做用:1.自適應兩欄佈局
2.能夠阻止元素被浮動元素覆蓋
3.能夠包含浮動元素---清除內部浮動 原理::觸發父div的BFC屬性,使下面的子div都處在父div的同一個BFC區域以內
4.分屬於不一樣的BFC時,能夠阻止margin重疊
複製代碼
事件流描述的是從頁面中接受事件的順序,能夠分爲:事件捕獲階段 處於目標階段 事件冒泡階段其中須要主要的是addeventListener這個函數 最後這個布爾值參數若是是true,表示在捕獲階段調用事件處理程序;若是是false,表示在冒泡階段調用事件處理程序。
阻止冒泡事件event.stopPropagation() function stopBubble(e) { if (e && e.stopPropagation) { // 若是提供了事件對象event 這說明不是IE瀏覽器 e.stopPropagation() } else { window.event.cancelBubble = true //IE方式阻止冒泡 } } 阻止默認行爲event.preventDefault() function stopDefault(e) { if (e && e.preventDefault) { e.preventDefault() } else { // IE瀏覽器阻止函數器默認動做的行爲 window.event.returnValue = false } } 複製代碼
在DOM標準事件模型中,是先捕獲後冒泡。可是若是要實現先冒泡後捕獲的效果,對於同一個事件,監聽捕獲和冒泡,分別對應相應的處理函數,監聽到捕獲事件,先暫緩執行,直到冒泡事件被捕獲後再執行捕獲事件。
鼠標事件:mouserleave mouseenter
焦點事件:blur focus
UI事件:scroll resize
複製代碼
簡介:事件委託指的是,不在事件的(直接dom)上設置監聽函數,而是在其父元素上設置監聽函數。經過事件冒泡,父元素能夠監聽到子元素上事件的觸發經過判斷事件發生元素DOM的類型,來作出不一樣的響應。
new操做符建立了一個空對象,這個對象原型指向構造函數的prototype,執行構造函數後返回這個對象。若是不要父類的屬性跟方法,在函數的prototype上去new這個父類。
this指向的固定化,並非由於箭頭函數內部有綁定this的機制,實際緣由是箭頭函數根本沒有本身的this,致使內部的this就是外層代碼塊的this。正是由於它沒有this,因此也就不能用做構造函數。
1.使用es6的箭頭函數;2.在函數內部使用that = this;3.使用apply,call,bind; 4.new實例化一個對象
經過apply和call改變函數的this指向,他們兩個函數的第一個參數都是同樣的表示要改變指向的那個對象,第二個參數,apply是數組,而call則是arg1,arg2...這種形式。bind一個是返回一個函數,並不會當即執行第二個是帶參數(第一個參數要指向的this,後面的的參數用來傳遞
基本類型 | 引用類型 |
---|---|
基本類型:undefined,null,Boolean,String,Number,Symbol在內存中佔據固定大小,保存在棧內存中 | 引用類型:Object,Array,Date,Function,RegExp等 引用類型的值是對象 保存在堆內存中,棧內存存儲的是對象的變量標識符以及對象在堆內存中的存儲地址。 |
基本類型的複製:其實就是建立了一個新的副本給將這個值賦值給新變量, 改變值舊對象不會改變 | 引用類型的複製:其實就是複製了指針,這個最終都將指向同一個對象,改變其值新對象也會改變 |
注意:基本類型的比較 == 會進行類型轉換
淺拷貝 | 深拷貝 |
---|---|
僅僅就是複製了引用,彼此操做不影響,slice() concat() object.assign | 在堆中從新分配內存,不一樣的地址,相同的值,互不影響的 JSON.parse()將一個js對象序列化爲一個json字符串JSON.stringify()將json字符串反序列化爲一個js對象 es6的展開 {...} |
從新在堆棧中建立內存,拷貝先後對象的基本類型互不影響。只拷貝一層,不能對對象進行子對象進行拷貝 | 對對象中的子對象進行遞歸拷貝,拷貝先後兩個對象互不影響 |
由於js是單線程的。瀏覽器遇到etTimeout和setInterval會先執行完當前的代碼塊,在此以前會把定時器推入瀏覽器的待執行時間隊列裏面,等到瀏覽器執行完當前代碼以後會看下事件隊列裏有沒有任務,有的話才執行定時器裏的代碼
同源策略(協議+端口號+域名要相同)
步驟:1.去建立一個script標籤
2.script的src屬性設置接口地址
3.接口參數,必需要帶一個自定義函數名,要否則後臺沒法返回數據
4.經過定義函數名去接受返回的數據
複製代碼
iframe元素建立包含另一個文檔的內聯框架(行內框架)(setTimeout進行異步加載) 解釋:瀏覽器中的瀏覽器!用於設置文本或者圖形的浮動圖文框或容器 它和跨域 一、document.domain 實現主域名相同,子域名不一樣的網頁通訊 都設置爲超域:document.domain = 'demo.com' 二、window.postMessageht(data, url),h5的API,啓動跨域通訊 複製代碼
提早加載圖片,當用戶須要查看是能夠直接從本地緩存中渲染
爲何要使用預加載:在網頁加載以前,對一些主要內容進行加載,以提供用戶更好的體驗,減小等待時間。不然,若是一個頁面的內容過於龐大,會出現留白。
解決頁面留白的方案: 1.預加載
2.使用svg站位圖片,將一些結構快速搭建起來,等待請求的數據來了以後,替換當前的佔位符
實現預加載的方法:
1.使用html標籤
2.使用Image對象
3.使用XMLHTTPRequest對像,但會精細控制預加載過程
複製代碼
客戶端優化,減小請求數和延遲請求數,提高用戶體驗,減小無效資源的加載,防止併發加載的資源過多會阻塞js的加載,影響網站的正常使用
原理:首先將頁面上的圖片的src屬性設置爲空字符串,而圖片的真是路經則設置帶data-original屬性中,當頁面滾動的時候須要去監聽scroll事件,在scroll事件的回調中,判斷咱們的懶加載的圖片是否進入到可視區域,若是圖片在可視區域將圖片的src屬性設置爲data-original的值,這樣就能夠實現延遲加載。
防抖 | 節流 |
---|---|
短期內屢次觸發同一個事件,只執行最後一次,或者在開始時執行,中間不執行。好比公交車上車,要等待最後一個乘客上車 | 節流是連續觸發事件的過程當中以必定時間間隔執行函數。節流會稀釋你的執行頻率,好比每間隔1秒鐘,只會執行一次函數,不管這1秒鐘內觸發了多少次事件 |
都爲解決高頻事件而來, scroll mousewhell mousemover touchmove onresize,後面有相應的代碼實現函數的節流和防抖。
1.JS具備自動垃圾收集的機制
2.JS的內存生命週期(變量的生命)
1.分配你所須要的空間 var a = 20
2.使用分配帶的內存(讀寫) alert(a + 10)
3.不適用的時候,釋放內存空間 a = null
3.JS的垃圾收集器每隔固定的時間就執行一次釋放操做,通用的是經過標記清除的算法
4.在局部做用域中,垃圾回收器很容易作出判斷並回收,全局比較難,所以應避免全局變量
標記清除算法:js最多見的垃圾回收方式,當變量進入執行環境的時候,好比函數中聲明一個變量,垃圾回收器將他標記爲'進入環境',
當變量離開(函數執行完後),就其標記爲'離開環境'。垃圾回收器會在運行的時候給存儲在內存中的全部變量加上標記,
而後去掉環境中的變量以及被環境中該變量所引用的變量(閉包)。在這些完成以後仍存在標記的就是要刪除的變量了
複製代碼
千萬不要使用typeof來判斷對象和數組,由於這種類型都會返回object。
1.slice(start,end):方法能夠從已有數組中返回選定的元素,返回一個新數組,包含從start到end(不包含該元素)的數組方法
注意:該方法不會更新原數組,而是返回一個子數組
2.splice():該方法想或者從數組中添加或刪除項目,返回被刪除的項目。(該方法會改變原數組)
splice(index, howmany,item1,...itemx)
·index參數:必須,整數規定添加或刪除的位置,使用負數,從數組尾部規定位置
·howmany參數:必須,要刪除的數量,
·item1..itemx:可選,向數組添加新項目
3.map():會返回一個全新的數組。使用於改變數據值的時候。會分配內存存儲空間數組並返回,forEach()不會返回數據
4.forEach(): 不會返回任何有價值的東西,而且不打算改變數據,單純的只是想用數據作一些事情,他容許callback更改原始數組的元素
5.reduce(): 方法接收一個函數做爲累加器,數組中的每個值(從左到右)開始縮減,最終計算一個值,不會改變原數組的值
6.filter(): 方法建立一個新數組,新數組中的元素是經過檢查指定數組中符合條件的全部元素。它裏面經過function去作處理
複製代碼
js阻塞 | css阻塞 |
---|---|
全部瀏覽器在下載JS的時候,會阻止一切其餘活動,好比其餘資源的下載,內容的呈現等等。直到JS下載、解析、執行完畢後纔開始繼續並行下載其餘資源並呈現內容。爲了提升用戶體驗,新一代瀏覽器都支持並行下載JS,可是JS下載仍然會阻塞其它資源的下載(例如.圖片,css文件等)。 | 由於瀏覽器會維持html中css和js的順序,樣式表必須在嵌入的JS執行前先加載、解析完。而嵌入的JS會阻塞後面的資源加載,因此就會出現上面CSS阻塞下載的狀況。 |
(es6)中class, extends
function A(....){} A.prototype...
function B(....){} B.prototype...
A.prototype = Object.create(B.prototype) 再A的構造函數裏new B(props)
使用new一個函數的話,函數裏的構造函數的參數就爲undefined,裏面的一些函數可能執行錯誤,由於this改變了
Object.create = function (o) {
var F = function () {};
F.prototype = o;
return new F();
};
複製代碼
1.閉包的缺點就是常駐內存會增大內存使用量,而且使用不當容易形成內存泄漏
2.若是不是由於某些特殊任務而須要閉包,在沒有必要的狀況下,在其它函數中建立函數是不明智的,由於閉包對腳本性能具備負面影響,包括處理速度和內存消耗。
複製代碼
內存溢出和內存泄漏(給的不夠用| 用了不歸還)
做用域:(由當前環境與上層環境一系列的變量對象組成!!!保證當先執行環境裏,有權訪問的變量和函數是有序的,做用域鏈變量只能被向上訪問)
定義:由當前環境與上層環境的一系列變量對象組成(函數嵌套函數,內部一級級往上有序訪問變量或對象)
做用是:保證當前執行環境裏,有權訪問的變量和函數時有序的,做用域鏈的變量只能被向上訪問 變量訪問到window對象及被終止,做用域鏈向下訪問是不容許的 1.改變做用域有 with try..中的catch, 2.全部爲定義的直接賦值的變量自動聲明爲全局做用域
做用域:一套規則,管理引擎如何在當前做用域以及嵌套的子做用域中根據標識符名稱
查找變量(標識符就是變量或者函數名)(只用全局做用域和局部做用域)(做用域在它建立的時候就存在了)
代碼執行分爲兩個階段:
1.代碼編譯階段:有編譯器完成,將代碼翻譯可執行的代碼,這個階段會被肯定
2.代碼執行階段:有js引擎完成,主要執行可執行的大媽,這個階段執行上下文被建立(對象被建立)
執行上下文:一個看不見得對象,存在若干個屬性和變量,它被調用的時候建立的。函數被調用查看的this指向的object,object就是上下文(只有被調用的時候建立)
複製代碼
· 當代碼在一個環境中執行時,會建立變量對象的一個做用域鏈,
舉例子:var name ="Tom"
function sayHi () {
alert('Hi,'+name)
}
sayHi() //Hi, Tom
函數sayHi()的執行環境爲全局環境,因此它的變量對象爲window。當函數執行到name時,先查找局部環境,找到則換回,不然順着做用域查找,在全局環境中,
找到name返回,這一查找變量的有序過程的依據就是做用域。
· 做用域鏈是保證執行環境有權訪問的全部變量和函數的有序訪問
複製代碼
原型鏈:函數的原型鏈對象constructor默認指向函數自己,原型對象除了有原型屬性外,爲了實現繼承,還有一個原型鏈指針_proto_,該指針是指向上一層的原型對象,而上一層的原型對象的結構依然相似。所以能夠利用_proto_一直指向Object的原型對象上,而Object原型對象用Object.prototype.proto=null表示原型鏈頂端。如此造成了js的原型鏈繼承。同時全部的js對象都有Object的基本防範
2XX(成功處理了請求狀態)
200 服務器已經成功處理請求,並提供了請求的網頁
201 用戶新建或修改數據成功
202 一個請求已經進入後臺
204 用戶刪除成功
3XX(每次請求使用的重定向不要超過5次)
304 網頁上次請求沒有更新,節省帶寬和開銷
4XX(表示請求可能出錯,妨礙了服務器的處理)
400 服務器不理解請求的語法
401 用戶沒有權限(用戶名,密碼輸入錯誤)
403 用戶獲得受權(401相反),可是訪問被禁止
404 服務器找不到請求的網頁,
5XX(表示服務器在處理請求的時候發生內部錯誤)
500 服務器遇到錯誤,沒法完成請求
503 服務器目前沒法使用(超載或停機維護)
複製代碼
last-modified: 客服端請求資源,同時有一個last-modified的屬性標記此文件在服務器最後修改的時間,客服端第二次請求此url時,根據http協議。瀏覽器會向服務器發送一個If-Modified-Since報頭,詢問該事件以後文件是否被修改,沒修改返回304
有了Last-Modified,爲何還要用ETag?
一、由於若是在一秒鐘以內對一個文件進行兩次更改,Last-Modified就會不正確(Last—Modified不能識別秒單位的修改)
二、某些服務器不能精確的獲得文件的最後修改時間
三、一些文件也行會週期新的更改,可是他的內容並不改變(僅僅改變修改的事件),這個時候咱們並不但願客戶端認爲文件被修改,而從新Get
ETag,爲何還要用Last-Modified?
一、二者互補,ETag的判斷的缺陷,好比一些圖片等靜態文件的修改
二、若是每次掃描內容都生成ETag比較,顯然要比直接比較修改時間慢的多。
ETag是被請求變量的實體值(文件的索引節,大小和最後修改的時間的Hash值)
一、ETag的值服務器端對文件的索引節,大小和最後的修改的事件進行Hash後獲得的。
複製代碼
1.超文本的傳輸協議,是用於從萬維網服務器超文本傳輸到本地資源的傳輸協議
2.基於TCP/IP通訊協議來傳遞數據(HTML,圖片資源)
3.基於運用層的面向對象的協議,因爲其簡潔、快速的方法、適用於分佈式超媒體信息系統
4.http請求信息request:
請求行(request line)、請求頭部(header),空行和請求數據四部分構成
請求行,用來講明請求類型,要訪問的資源以及所使用的HTTP版本.
請求頭部,用來講明服務器要使用的附加信息
空行,請求頭部後面的空行是必須的
請求數據也叫主體,能夠添加任意的其餘數據。
5.http相應信息Response
狀態行、消息報頭、空行和響應正文
狀態行,由HTTP協議版本號, 狀態碼, 狀態消息 三部分組成
消息報頭,用來講明客戶端要使用的一些附加信息
空行,消息報頭後面的空行是必須的
響應正文,服務器返回給客戶端的文本信息。
複製代碼
http | https |
---|---|
是以安全爲目標的HTTP通道,簡單講是HTTP的安全版本,經過SSL加密 | 超文本傳輸協議。是一個客服端和服務器端請求和應答的標準(tcp),使瀏覽器更加高效,使網絡傳輸減小 |
1.0跟1.1的區別:
長鏈接:HTTP1.0須要使用keep-alive參數來告知服務器創建一個長鏈接,而HTP1.1默認支持長鏈接
節約寬帶:HTTP1.1支持只發送一個header信息(不帶任何body信息)
host域(設置虛擬站點,也就是說,webserver上的多個虛擬站點能夠共享同一個ip端口):HTTP1.0沒有host域
1.1跟2.0的區別:
1.web緩存就是存在於客戶端與服務器之間的一個副本、當你第一個發出請求後,緩存根據請求保存輸出內容的副本
2.緩存的好處
(1)減小沒必要要的請求
(2)下降服務器的壓力,減小服務器的消耗
(3)下降網絡延遲,加快頁面打開速度(直接讀取瀏覽器的數)
複製代碼
1.儘量的避開互聯網有可能影響數據傳輸速度和穩定性的瓶頸和環節。使內容傳輸的更快更穩定。
2.關鍵技術:內容存儲和分發技術中
3.基本原理:普遍採用各類緩存服務器,將這些緩存服務器分佈到用戶訪問相對的地區或者網絡中。當用戶訪問網絡時利用全局負載技術
將用戶的訪問指向距離最近的緩存服務器,由緩存服務器直接相應用戶的請求(全局負載技術)
複製代碼
1.查詢NDS(域名解析),獲取域名對應的IP地址 查詢瀏覽器緩存
2.瀏覽器與服務器創建tcp連接(三次握手)
3.瀏覽器向服務器發送http請求(請求和傳輸數據)
4.服務器接受到這個請求後,根據路經參數,通過後端的一些處理生成html代碼返回給瀏覽器
5.瀏覽器拿到完整的html頁面代碼開始解析和渲染,若是遇到外部的css或者js,圖片同樣的步驟
6.瀏覽器根據拿到的資源對頁面進行渲染,把一個完整的頁面呈現出來
複製代碼
客服端發c起請求鏈接服務器端s確認,服務器端也發起鏈接確認客服端確認。
流程:解析html以及構建dom樹 -> 構建render樹 -> 佈局render樹 -> 繪製render樹
概念:1.構建DOM樹: 渲染引擎解析HTML文檔,首先將標籤轉換成DOM樹中的DOM node(包括js生成的標籤)生成內容樹
2.構建渲染樹: 解析對應的css樣式文件信息(包括js生成的樣式和外部的css)
3.佈局渲染樹:從根節點遞歸調用,計算每個元素的大小,位置等。給出每一個節點所在的屏幕的精準位置
4.繪製渲染樹:遍歷渲染樹,使用UI後端層來繪製每個節點
重繪:當盒子的位置、大小以及其餘屬性,例如顏色、字體大小等到肯定下來以後,瀏覽器便把這些顏色都按照各自的特性繪製一遍,將內容呈如今頁面上
觸發重繪的條件:改變元素外觀屬性。如:color,background-color等
重繪是指一個元素外觀的改變所觸發的瀏覽器行爲,瀏覽器會根據元素的新屬性從新繪製,使元素呈現新的外觀
注意:table及其內部元素須要屢次計算才能肯定好其在渲染樹中節點的屬性值,比同等元素要多發時間,要儘可能避免使用table佈局
重排(重構/迴流/reflow): 當渲染書中的一部分(或所有)由於元素的規模尺寸,佈局,隱藏等改變而須要從新構建,這就是迴流。
每一個頁面都須要一次迴流,就是頁面第一次渲染的時候
重排必定會影響重繪,可是重繪不必定會影響重排
複製代碼
一、cookie,sessionStorage,localStorage是存放在客戶端,session對象數據是存放在服務器上 實際上瀏覽器和服務器之間僅需傳遞session id便可,服務器根據session-id找到對應的用戶session對象 session存儲數據更安全一些,通常存放用戶信息,瀏覽器只適合存儲通常的數據 二、cookie數據始終在同源的http請求中攜帶,在瀏覽器和服務器來回傳遞,裏面存放着session-id sessionStorage,localStorage僅在本地保存 三、大小限制區別,cookie數據不超過4kb,localStorage在谷歌瀏覽中2.6MB 四、數據有效期不一樣,cookie在設置的(服務器設置)有效期內有效,無論窗口和瀏覽器關閉 sessionStorage僅在當前瀏覽器窗口關閉前有效,關閉即銷燬(臨時存儲) localStorage始終有效 複製代碼
1.sessionStorage用於本地存儲一個會話(session)中的數據,這些數據只有在用一個會話的頁面中才能被訪問(也就是說在第一次通訊過程當中)
而且在會話結束後數據也隨之銷燬,不是一個持久的本地存儲,會話級別的儲存
2.localStorage用於持久化的本地存儲,除非主動刪除數據,不然不會過時
複製代碼
一、token就是令牌,好比你受權(登陸)一個程序時,他就是個依據,判斷你是否已經受權該軟件(最好的身份認證,安全性好,且是惟一的)用戶身份的驗證方式
二、cookie是寫在客戶端一個txt文件,裏面包括登陸信息之類的,這樣你下次在登陸某個網站,就會自動調用cookie自動登陸用戶名服務器生成,發送到瀏覽器、瀏覽器保存,下次請求再次發送給服務器(存放着登陸信息)
三、session是一類用來客戶端和服務器之間保存狀態的解決方案,會話完成被銷燬(表明的就是服務器和客戶端的一次會話過程)cookie中存放着sessionID,請求會發送這個id。sesion由於request對象而產生。
一、用戶經過用戶名和密碼發送請求
二、服務器端驗證
三、服務器端返回一個帶簽名的token,給客戶端
四、客戶端儲存token,而且每次用於發送請求
五、服務器驗證token而且返回數據
每一次請求都須要token
cookie與session區別
一、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
二、cookie不是很安全,別人能夠分析存放在本地的COOKIE並進行COOKIE欺騙考慮到安全應當使用session。
三、session會在必定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能考慮到減輕服務器性能方面,應當使用COOKIE。
四、單個cookie保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個cookie。
複製代碼
一、數量和長度的限制。每一個特定的域名下最多生成20個cookie(chorme和safari沒有限制)
二、安全性問題。
複製代碼
因爲篇幅過長,我準備了一個txt文檔,裏面有更多的前端基礎知識。包括這裏不曾談及的Vue,React,node,數據結構等。奉上個人文檔地址前端面試武林祕籍,學習老是須要不斷的積累和總結的。寫此文的目的也很明確,若總結的很差地方歡迎指出並在下方評論,或者你認爲很好的知識點,沒有概括到,也但願可以分享出來,幫助你們,也提升本身。