前端開發面試題

前端開發面試題

站點地址: 全棧開發
原文連接: 前端開發面試題

HTML

  • Doctype做用?標準模式與兼容模式各有什麼區別?
一、 <!DOCTYPE>聲明位於HTML文檔中的第一行,處於 <html>標籤以前,告知瀏覽器的解析器用什麼文檔標準解析。DOCTYPE不存在或格式不正確會致使文檔以兼容模式呈現。
二、標準模式的排版和JS運行模式都是以該瀏覽器支持的最高標準運行。在兼容模式中,頁面以寬鬆的向後兼容的方式顯示,模擬老式瀏覽器的行爲以防止站點沒法工做。
  • HTML5爲何只須要寫<!DOCTYPE HTML>
HTML5不基於SGML(標準通用標記語言),所以不須要對DTD(文檔類型定義)進行引用,可是須要 doctype來規範瀏覽器的行爲(讓瀏覽器按照它們應該的方式來運行)
HTML4.01基於SGML,因此須要對DTD進行引用,才能告知瀏覽器文檔所使用的文檔類型。
  • 行內元素有哪些?塊級元素有哪些?空(void)元素有哪些?
首先:CSS規範規定,每一個元素都有 display屬性,肯定鈣元素的類型,每一個元素都有默認的 display值,如 divdisplay默認值爲 block,都是塊級元素; span默認 display屬性值爲 inline,是行內元素。
一、行內元素: abspanimginputselectstrong(強調的語氣)
二、塊級元素: divulollidldtddh1h2h3h4p
三、常見的空元素: brhrimginputlinkmeta
不經常使用的空元素: areabasecolcommandembedkeygenparamsourcetrackwbr
  • 頁面導入樣式時,使用link@import有什麼區別?
一、 link屬於 XHTML標籤,除了加載 CSS外,還能用於定義 RSS,定義 rel鏈接屬性等做用;而 @importCSS提供的,只能用於加載 CSS
二、頁面被加載時, link會同時被加載,而 @import引用的 CSS會等到頁面被加載完再加載。
三、 importCSS2.1提出的,只在 IE5以上才能被識別,而 linkXHTML標籤,無兼容問題。
四、 link支持使用 JS控制 DOM改變樣式,而 @import不支持。
  • 介紹一下你對瀏覽器內核的理解?
主要分紅兩部分:渲染引擎( layoutengine)和JS引擎。
渲染引擎:負責取得網頁的內容(HTML、XML、圖像等)、整理信息(加入CSS等),以及計算網頁的顯示方式,而後輸出到顯示器或打印機。瀏覽器的內核的不一樣對網頁的語法解釋會有不一樣,因此渲染的效果也不相同。全部網頁瀏覽器、電子郵件客戶端以及其餘須要編輯、顯示網絡內容的應用程序都須要內核。
JS引擎:解析和執行JS來實現網頁的動態效果。
最開始渲染引擎和JS引擎並無區分額很明確,後來JS引擎愈來愈獨立,內核就傾向於只是指渲染引擎。
  • 常見的瀏覽器內核有哪些?
Trident內核:IE,MaxThon,TT,The World,360,搜狗瀏覽器等[MSHTML]
Gecko內核:Netscape6及以上版本,FF,MozillaSuite/SeaMonkey等
Presto內核:Opera7及以上[Opera內核原爲: Presto,現爲: Blink]
Webkit內核:Safari,Chrome等[Chrome:Blink(Webkit的分支)]
  • HTML5有哪些新特性、移除了哪些元素?如何處理HTML5新標籤的瀏覽器兼容問題?如何區分HTML和HTML5?
HTML5如今已經不是SGML的子集,主要是關於圖像,位置,存儲,多任務等功能的增長。
繪畫 canvas
用於媒介回放的 videoaudio元素
本地離線存儲 localStorage長期存儲數據,瀏覽器關閉後數據不丟失
sessionStorage的數據在瀏覽器關閉後自動刪除

語義化更好的內容元素,好比articlefooterheadernavsection
表單控件:calendardatetimeemailurlsearch
新技術:webworkerwebsocketGeolocationcss

移除的元素:
純表現的元素:basefontbigcenterfontsstrikettu
對可用性產生負面影響的元素:frameframesetnoframeshtml

支持HTML5新標籤:
IE8/IE7/IE6支持經過document.createElement方法產生的標籤,能夠利用這一特性讓這些瀏覽器支持HTML5新標籤,瀏覽器支持新標籤後,還須要添加默認的樣式。
也能夠直接使用成熟的框架,如html5shim前端

<!--[if lt IE 9]>
    <script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script>    
<![endif]>
區分HTML5,:DOCTYPE聲明,新增的結構元素,功能元素等
  • 簡述一下你對HTML語義化的理解?
語義化讓頁面的內容結構化,結構更清晰,便於對瀏覽器、搜索引擎解析
沒有CSS樣式也能正常閱讀文檔
搜索引擎的爬蟲依賴HTML標記來肯定上下文和各個關鍵字的權重,有利於SEO
  • HTML5的離線存儲怎麼使用,工做原理解釋一下?
在用戶沒有聯網時,能夠正常訪問站點或應用;在聯網的狀況下,更新用戶機器上的緩存文件。
原理:HTML5的離線存儲是基於一個新建的 .appchache文件的緩存機制(不是存儲技術),經過這個文件上的解析清單離線存儲資源,這些資源就會像 cookie同樣被存儲下來。以後當網絡處於離線狀態時,瀏覽器會經過被離線存儲的數據進行頁面展現。

如何使用:
一、頁面頭部加入一個manifest的屬性
二、在cache.manifest文件的編寫離線存儲的資源
三、在離線狀態下,操做window.applicationCache進行需求實現html5

  • 瀏覽器是如何對HTML5的離線存儲資源進行管理和加載的?
在線的狀況下,瀏覽器發現 html頭部有 manifest屬性,它會請求 manifest文件,若是是第一次訪問 app,瀏覽器會根據 manifest文件的內容下載相應的資源而且進行離線存儲。
若是已經訪問過 app,而且資源已經離線存儲,瀏覽器會使用離線的資源加載頁面,而後瀏覽器會對比新的 manifest文件,若是文件沒有發生改變,就不作任何操做,不然就會從新下載文件中的資源並進行離線存儲。
離線的狀況下,瀏覽器直接使用離線存儲的資源。
  • 請描述一下cookiesessionStoragelocalStorage的區別?
cookie是網站爲了標識用戶身份而存儲在用戶本地終端上的數據(一般通過加密)
cookie數據始終在同源的 http請求中攜帶(即便不須要),就會在瀏覽器和服務器間來回傳遞
sessionStoragelocalStorage不會自動把數據發給服務器,僅在本地保存

存儲大小:
cookie數據大小不能超過4k
sessionStoragelocalStorage雖然也有存儲大小的限制,但比cookie大得多,能夠達到5M或更大node

有效時間:
localStorage存儲持久數據,瀏覽器關閉後數據不丟失,除非主動刪除數據
sessionStorage數據在當前瀏覽器窗口關閉後自動刪除
cookie設置的cookie過時時間以前一直有效,即便窗口或瀏覽器關閉python

  • iframe有哪些缺點?
iframe會阻塞主頁面的 onload事件
搜索引擎的檢索程序沒法解讀這種頁面,不利於SEO
iframe和主頁面共享鏈接池,而瀏覽器對相同域的鏈接有限制,因此會影響頁面的並行加載
使用 iframe以前須要考慮兩個缺點。若是須要使用 iframe,最好是經過JS
動態給 iframe添加 src屬性值,能夠繞開以上兩個問題。
  • label的做用是什麼?怎麼用?
label標籤訂義表單控件間的關係,當用戶選擇該標籤時,瀏覽器會自動將焦點轉到和標籤相關的表單控件上。
<label for="Name">Number:</label>
<input type="text" name="Name" id="Name">
  • HTML5的form如何關閉自動完成功能?
給不想要提示的 form或某個 input設置爲 autocomplete=off
  • 如何實現瀏覽器內多個標籤頁之間的通訊?(阿里)
WebSocketSharedWorkder
也能夠調用 localStoragecookies等本地存儲方式
localStorage另外一個瀏覽上下文中被添加、修改或刪除時,它都會觸發一個事件,經過監聽事件,控制它的值來進行頁面信息通訊
  • WebSocket如何兼容低瀏覽器?(阿里)
Adobe Flash Socket
ActiveX HTMLFile(IE)
基於 multipart編碼發送 XHR
基於長輪詢的 XHR
  • 頁面可見性能夠有哪些用途?
經過 visibilityState的值檢測頁面當前是否可見,以及打開頁面的時間等
在頁面被切換到其餘後臺進程的時候,自動暫停音樂或視頻的播放
  • 如何在頁面上實現一個圓形的可點擊區域?
一、 map+area或者 SVG
二、 border-radius
三、純JS實現,須要求一個點在不在圓上簡單算法、獲取鼠標座標等
  • 實現不使用border畫出1px高的線,在不一樣瀏覽器的標準模式與怪異模式下都能保持一致的效果。
<div style="height: 1px;overflow: hidden;background: red;"></div>

<div style="height: 1px;overflow: hidden;background: red;"></div>jquery

CSS

  • 介紹一下標準CSS的盒子模型?低版本IE的盒子模型有什麼不一樣?
一、有兩種,IE盒子模型、W3C盒子模型
二、盒模型:內容( content)、填充( padding)、邊界( margin)、邊框( border
三、區別:IE的 content部分把 borderpadding計算進去
  • CSS選擇符有哪些?哪些屬性能夠繼承?
一、ID選擇器
二、類選擇器
三、標籤選擇器
四、相鄰選擇器( h1+p
五、子選擇器( ul>li
六、後代選擇器( li a
七、通配符選擇器( *
八、屬性選擇器( a[rel="external"]
九、僞類選擇器( a:hover,li:nth-child

可繼承的樣式:font-sizefont-familycolorullidldddt
不可繼承的樣式:borderpaddingmarginwidthheightwebpack

  • CSS優先級如何計算?
優先級就近原則,同權重狀況下樣式定義最近者爲準
載入樣式以最後載入的定位爲準

優先級爲:
同權重:內聯樣式表(標籤內部)>嵌入樣式表(當前文件)>外部樣式表(外部文件)
!important > id > class > tag
!important比內聯優先級高git

  • CSS3新增僞類有哪些?
p:first-of-type 選擇屬於其父元素的首個 <p>元素
p:last-of-type 選擇屬於其父元素的最後 <p>元素
p:only-of-type 選擇屬於其父元素惟一的 <p>元素
p:nth-child(2) 選擇屬於其父元素的第二個子元素的每一個 <p>元素
::after在元素以前添加內容,也能夠用來作清除浮動
::before在元素以後添加內容
::enabled ::disabled控制表單控件的禁用狀態
:checked單選框或複選框被選中
  • 水平居中:給div設置一個寬度,而後添加margin: 0 auto屬性
div {
  width: 200px;
  margin: 0 auto;
}
  • 讓絕對定位的div居中
div {
  position: absolute;
  width: 200px;
  height: 200px;
  margin: auto;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
  background: #ccc;
}
  • 水平垂直居中一
肯定容器的寬高
設置層的外邊距
div {
  position: absolute;
  width: 200px;
  height: 200px;
  left: 50%;
  top: 50%;
  margin: -100px 0 0 -100px;
  background: #ccc;
}
  • 水平垂直居中二
未知容器的寬高,利用 transform屬性
div {
    position: absolute;
    width: 200px;
    height: 200px;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    background: #bbb;
}
  • 水平垂直居中三
利用 flex佈局
實際使用時應考慮兼容性
body {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}
div {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 300px;
    height: 300px;
    background: green;
}

span {
    width: 100px;
    height: 100px;
    background-color: #ccc;
}
  • display有哪些值?說明它們的做用?
block塊類型。默認寬度爲父元素寬度,可設置寬高,換行顯示。
none缺省值。像行內元素類型同樣顯示。
inline行內元素類型。默認寬度爲內容寬度,不可設置寬高,同行顯示。
inline-block默認寬高爲內容寬度,能夠設置寬高,同行顯示。
list-item像塊類型元素同樣顯示,並添加樣式列表標記。
table此元素會做爲塊級表格顯示。
inherit規定應該從父元素繼承 display屬性的值。
  • position的值relativeabsolute定位原點?
absolute生成絕對定位的元素,相對於值不爲 static的第一個父元素進行定位
fixed(老IE不支持)生成絕對定位的元素,相對於瀏覽器窗口進行定位
relative生成相對定位的元素,相對於其正常位置進行定位
static默認值。沒有定位,元素出如今正常的流中(忽略 toprightbottomleft聲明)
inherit規定從父元素繼承 position屬性的值
  • CSS3有哪些新特性?
新增各類CSS選擇器( :not(.input)):全部 class不是 input的節點
圓角 border-radius:8px;
多列布局 multi-column layout
陰影個反射 shadow\reflect
文字特效 text-shadow
文字渲染 text-decoration
線性漸變 gradient
旋轉 transform
縮放、定位、傾斜、動畫、多背景
例如: transform:\scale(0.85,0.90)\translate(0,-30px)\skew(-9deg,0)\animation
  • 請解釋一下CSS3的flexbox(彈性盒佈局模型),以及適用場景?
一個用於頁面佈局的全新CSS3功能, flexbox能夠把列表放在同一個方向(從上到下,從左到右),並讓列表能延伸到佔用可用的空間。
較爲複雜的佈局還能夠經過嵌套一個伸縮容器( flex container)來實現。
採用 flex佈局的元素,稱爲 flex容器( flex container),簡稱 容器
它的全部子元素自動稱爲容器成員,稱爲 flex項目( flex item),簡稱 項目
常規佈局是基於塊和內聯流方向,而 flex佈局是基於 flex-flow流,能夠很方便地用來作居中,能對不一樣屏幕大小自適應。
  • 用純CSS建立一個三角形的原理是什麼?
把上、左、右三條邊隱藏掉(顏色設爲 transparent
div {
    width: 0;
    height: 0;
    border: 100px solid;
    border-color: transparent transparent red transparent;
}
  • 如何設計一個滿屏字佈局?
簡單方式:
上面的 div100%
下面的兩個 div分別寬 50%
而後用 float或者 inline使其不換行便可
body {
    margin: 0;
    padding: 0;
}

.header {
    width: 100%;
    height: 300px;
    background: green;
}

.left {
    width: 50%;
    height: 300px;
    background: aqua;
    float: left;
}

.right {
    width: 50%;
    height: 300px;
    background: blue;
    float: right;
}
  • 如何實現CSS多列等高?
利用 padding-bottom|margin-bottom正負值相抵;
設置父容器超出隱藏 overflow:hidden;,這樣子父容器的高度仍是它裏面的列沒有設定 padding-bottom時的高度;
當它裏面的任何一列高度增長,則父容器的高度被撐開到裏面最高那一列的高度
其餘比這列低的會用它們的 padding-bottom補償這部分的高度差
body {
    padding: 0;
    margin: 0;
}

.container {
    width: 100%;
    height: 300px;
    overflow: hidden;
}

.left {
    float: left;
    width: 30%;
    height: 100px;
    background: aqua;
    padding-bottom: 200px;
    margin-bottom: -200px;
}

.right {
    float: right;
    width: 70%;
    height: 200px;
    background: #6cc;
    padding-bottom: 200px;
    margin-bottom: -200px;
}
  • 常常遇到的瀏覽器的兼容性有哪些?緣由,解決方法是什麼?經常使用hack技巧?
png24位的圖片在IE6瀏覽器上出現背景,解決方案是作成 png8
瀏覽器默認的 marginpadding不一樣。解決方案是加一個全局 {margin:0;padding:0;}來統一
IE6雙邊距 bug塊屬性標籤 float後,又有橫行的 margin狀況下,在IE6顯示 margin比設置的大
浮動IE產生的雙倍距離
#box {
    float: left;
    width: 10px;
    margin: 0 0 0 100px;
}
這種狀況下IE會產生 20px的距離,解決方案是在 float的標籤樣式控制中加入 _display:inline;將其轉化爲行內屬性。( _這個符號只有IE6會識別)
漸進識別的方式,從整體中逐漸排除局部。
首先,巧妙地使用 \9這一標記,將IE瀏覽器從全部狀況中分離出來。
接着,再次使用 +將IE8和IE七、IE6分離開來,這樣IE8已經獨立識別。
div {
    background-color: red; /*全部識別*/
    background-color: #00deff \9; /*IE六、七、9識別*/
    _background-color: #1e0bd1; /*IE6識別*/
}
IE下可使用獲取常規屬性的方法來獲取自定義屬性,也可使用 getAttribute()獲取自定義屬性;
firefox下只能使用 getAttribute()獲取自定義屬性
解決方法:統一經過 getAttribute()獲取自定義屬性

IE下event對象有xy屬性,可是沒有pageXpageY屬性;
Firefox下event對象有pageXpageY屬性,可是沒有xy屬性
解決方法:(條件註釋)缺點是在IE瀏覽器下可能會增長額外的HTTP請求數程序員

chrome中文界面下默認會將小於12px的文本強制按照12px顯示
可經過加入CSS屬性-webkit-text-size-adjust:none;解決

超連接訪問事後hover樣式不出現,被點擊訪問過的超連接樣式再也不具備hoveravtive
解決方法:改變CSS屬性的排列順序。

L-V-H-A:a:link{} a:visited{} a:hover{} a:active{}
  • lili之間有看不見的空白間隔是什麼緣由引發的?有什麼解決辦法?
行框的排列會受到中間空白(回車/空格)等的影響,由於空格也屬於字符,這些空白也會被應用樣式,佔據空間,因此會有間隔,把字符大小設爲 0,就沒有空格。
  • 爲什嗎要初始化CSS樣式?
瀏覽器有兼容問題,不一樣瀏覽器對有些標籤的默認值不一樣,沒有CSS初始化會出現瀏覽器之間的頁面顯示差別。

初始化樣式會對SEO有必定的影響,儘可能在影響最小的狀況下進行初始化。

  • absolutecontaining block(容器塊)計算方式跟正常流有什麼不一樣?
不管屬於哪一種,都要先找到其祖先元素中最近的 position值不爲 static的元素,而後再判斷:
一、若此元素爲 inline元素,則 containing block爲可以包含這個元素生成的第一個和最後一個 inline boxpadding box(除 marginborder外的區域)的最小矩形;
二、不然由這個祖先元素的 padding box構成
若是都找不到,則爲 initial containing block

補充:
一、static/relative,它的父元素的內容框(即去掉padding的部分)
二、absolute:向上找最近的定位爲absolute、relative的元素
三、fixed:它的containing block一概爲根元素(html/body),根元素也是initial containing block

  • CSS裏的visibility屬性有個collapse屬性值得做用?在不一樣瀏覽器下有什麼區別?
對於普通元素 visibility:collapse;會將元素徹底隱藏,不佔據頁面佈局空間,與 display:none;表現相同。若是目標元素爲 tablevisibility:collapse;table隱藏,可是會佔據頁面佈局空間。僅在Firefox下起做用,IE會顯示元素,Chrome會將元素隱藏,可是佔據空間。
  • positiondisplaymargin collapseoverflowfloat這些特性相互疊加後會怎樣?
若是元素的 displaynone,那麼元素不被渲染, positionfloat不起做用;
若是元素擁有 position:absolute;position":fixed;屬性,那麼元素將爲絕對定位, float不起做用。
若是元素 float屬性不是 none,元素會脫離文檔流,根據 float屬性值來顯示。有浮動、絕對定位, inline-block屬性的元素, margin不會和垂直方向上的其餘元素 margin摺疊。
  • 對BFC規範(塊級格式化上下文)的理解?
它是一個獨立容器,決定了元素如何對其內容進行定位,以及與其餘元素的關係和相互做用。
一個頁面是由多個Box組成,元素的類型和 display屬性,決定了這個Box的類型
不一樣類型的Box會參與不一樣的 Formatting Context(決定如何渲染文檔的容器),所以Box內的元素會以不一樣的方式渲染,也就是說BFC內部的元素和外部的元素不會相互影響。
  • CSS定義的權重
權重的規則:標籤的權重爲 1class的權重爲 10id的權重爲 100
  • 請解釋一下爲何須要清除浮動?清除浮動的方法?
清除浮動是爲了清除使用浮動元素產生的影響。
浮動的元素,高度會塌陷,而高度的塌陷使咱們頁面後面的佈局不能正常顯示。

一、父級div定義height
二、父級div也一塊兒浮動;
三、常規的使用一個class

.clearfix:before, .clearfix:after {
    content: '';
    display: table;
}

.clearfix:after {
    clear: both;
}

.clearfix {
    *zoom: 1;
}
SASS編譯的時候,浮動元素的父級 div定義僞類 :after
div:after, div:before {
    content: '';
    visibility: hidden;
    display: block;
    height: 0;
    clear: both;
}
解析原理:
一、 displa:block;使生成的元素以塊級元素顯示,佔滿剩餘空間;
二、 height:0避免生成內容破壞原有佈局的高度;
三、 visibility:hidden;使生成的內容不可見,並容許可能被生成內容蓋住的內容能夠進行點擊和交互;
四、經過 content:"."生成內容做爲最後一個元素,
五、 zoom:1;觸發IE hasLayout

經過分析發現,除了clear:both用來閉合浮動,其餘代碼都是爲了隱藏content生成的內容,這也是其餘版本的閉合浮動爲何有font-size:0line-height:0

  • 什麼是外邊距合併?
外邊距合併指的是,當兩個垂直外邊距相遇時,它們將造成一個外邊距。
合併後的外邊距的高度等於兩個發生合併的外邊距的高度重的較大者
  • zoom:1的清除浮動原理?
清除浮動,觸發 hasLayout
zoom屬性時IE瀏覽器的專有屬性,它能夠設置或檢索對象的縮放比例。解決IE存在的 bug
好比外邊距的重疊,浮動清除,觸發IE的 hasLayout屬性等

當設置了zoom的值後,所設置的元素就會擴大或縮小,高度寬度就會從新計算,一旦改變zoom值時也會發生從新渲染,運用這個原理解決IE中子元素浮動時父元素不隨着自動擴大的問題。

目前非IE瀏覽器不支持這個屬性,能夠經過CSS3中的動畫屬性scale進行縮放。

  • 瀏覽器如何解析CSS選擇器?
從關鍵選擇器開始匹配,而後左移查找規則選擇器祖先元素。
只要選擇器的子樹一直在工做,樣式系統就會持續左移,直到和規則匹配,或由於不匹配而放棄規則。
  • marginpadding分別適用什麼場景?
margin用來隔開元素與元素的間距;
padding用來隔開元素與內容的間隔;
margin用於佈局分開元素使元素與元素互不相干;
padding用於元素與內容之間的間隔,讓內容與元素之間有一段距離
  • ::before:after中雙冒號和單冒號有什麼區別?解釋一下這兩個僞類的做用?
單冒號( :)用於CSS3僞類,雙冒號( ::)用於CSS3僞元素。(僞元素由雙冒號和僞元素組成)
雙冒號是在當前規範中引入的,用於區分僞類和僞元素。
  • 如何修改Chrome記住密碼後自動填充表單的黃色背景?

    input:-webkit-autofill, textarea:-webkit-autofill, select:-webkit-autofill {

    background-color: rgb(250, 250, 189);
    background-image: none;
    color: rgb(0, 0, 0);

    }

  • 設置元素浮動後,該元素的display值是多少?
自動變成 display:block
  • 如何讓Chrome支持小於12px的文字?
一、使用圖片:若是是內容固定不變的狀況下,使用將小於 12px文字內容切出作圖片,這樣既兼容又美觀。
二、使用 12px字體大小樣式設置,若是不考慮Chrome能夠不用考慮兼容同時在設置小於 12px對象設置 -webkit-text-adjust:none,作到最大兼容考慮。
四、使用 12px以上字體,從新考慮權重下兼容性。
  • 如何用CSS讓頁面的字體變得清晰,變細?
-webkit-font-smoothing:antialiased;
  • position:fixed;在Android下無效如何處理?
fixed的元素是相對整個頁面固定位置,在屏幕上滑動只是在移動這個所謂的 viewport
並非IOS不支持 fixed,只是 fixed的元素不是相對手機屏幕固定的。
  • 手動寫動畫,最小時間間隔是多少?
多數顯示器默認頻率是 60Hz,即1秒刷新 60次,因此理論上最小間隔爲 1/60*1000ms=16.7ms
  • display:inline-block何時會顯示間隙?
移除空格、使用 margin負值、使用 font-size:0letter-spacingword-spacing
  • 什麼是cookie隔離?(請求資源的時候不要讓它攜帶cookie)
若是靜態文件都放在主域名下,靜態文件請求的時都帶有 cookie的數據提交給 server,很是浪費流量。

由於cookie有域的限制,所以不能跨域提交請求,因此使用非主要域名的時候,請求頭中就不會帶有cookie數據。
這樣能夠下降請求頭的大小,下降請求時間,從而達到下降總體請求延時的目的。
同時這種方式不會將cookie傳入Web Server,也減小了Web Server對cookie的處理分析環節。
提升了webserver的HTTP請求的解析速度。

JavaScript

  • 介紹JS的基本數據類型
undefinednullBooleannumberstring
ES6新增: symbol(建立惟一且不可變數據類型)
  • 介紹JS有哪些內置對象?
Object是JS中全部對象的父對象
數據封裝類對象: ObjectArrayBooleanNumberString
其餘對象: FunctionargumentsMathDateRegExpError
  • 寫JS的基本規範
一、不在同一行聲明多個變量
二、使用 ===/!==來比較 true/false或者數值
三、使用對象字面量替代 new Array
四、不使用全局函數
五、 switch語句必須帶有 default分支
六、函數應該有返回值
七、 for循環必須使用大括號
八、 if語句必須使用大括號
九、 for-in循環中的變量,應該使用 var關鍵字明確限定做用域,從而避免做用域污染
  • JS原型,原型鏈?有什麼特色?
每一個對象都會在其內部初始化一個屬性,就是 prototype(原型),當訪問一個對象的屬性時,若是這個對象內部不存在這個屬性,就會去 prototype裏找這個屬性,這個 prototype又會有本身的 prototype,如此反覆,就是原型鏈的概念。

關係:instance.constructor.prototype=instance.__proto__

特色:
JS對象經過引用來傳遞,建立的每一個新對象實體中並無一份屬於本身的原型副本。當修改原型時,與之相關的對象也會繼承這一改變。

當須要一個屬性時,JS引擎會先看當前對象中是否有這個屬性,若是沒有,就會查找它的prototype對象是否有這個屬性,如此遞推,一直檢索到Object內建對象。

function Func() {}
Func.prototype.name = "Sean";
Func.prototype.getInfo = function () {
    return this.name;
};
var person = new Func();//var person=Object.create(oldObject)
console.log(person.getInfo());//Sean
console.log(Func.prototype);//Object {name: "Sean"}
  • JS有幾種類型的值?畫一下內存圖?
棧:原始數據類型( undefinednullBooleannumberstring
堆:引用數據類型(對象、數組和函數)

兩種類型的區別:存儲位置不一樣
原始數據類型直接存儲在棧中的簡單數據段,佔據空間小、大小固定,屬於被頻繁使用數據,因此放入棧中存儲;
引用數據類型存儲在堆中的對象,佔據空間大、大小不固定。若是存儲在棧中,將會影響程序運行的性能;
引用數據類型在棧中存儲了指針,該指針指向堆中該實體的起始地址。當解析器尋找引用值時,會首先檢索其在棧中的地址,取得地址後從堆中得到實體。

  • 如何將字符串轉化爲數字,例如12.3b
parseFloat('12.3b');
  • 如何將浮點數點左邊的數每三位添加一個逗號,如12000000.11轉化爲12,000,000.11
function commafy(num) {
    return num && num.toString().replace(/(\d)(?=(\d{3})+\.)/g, function ($1, $2) {
        return $2 + ',';
    })
}
  • 如何實現數組的隨機排序?
//方法一:
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
function randSort(arr) {
    for (var i = 0, len = arr.length; i < len; i++) {
        var rand = parseInt(Math.random() * len);
        var temp = arr[rand];
        arr[rand] = arr[i];
        arr[i] = temp;
    }
    return arr;
}
//方法二:
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
function randSort(arr) {
    var mixedArray = [];
    while (arr.length > 0) {
        var randomIndex = parseInt(Math.random() * arr.length);
        mixedArray.push(arr[randomIndex]);
        arr.splice(randomIndex, 1);
    }
    return mixedArray;
}
//方法三:
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
arr.sort(function () {
    return Math.random() - 0.5;
});
  • JS如何實現繼承?
一、構造
二、原型
三、實例
四、拷貝

原型prototype機制或applycall方法去實現比較簡單,建議使用構造函數與原型混合方式。

function Parent() {
    this.name = name;
}
function Child() {
    this.age = age;
}
Child.prototype = new Parent();//繼承Parent,經過原型
  • JS建立對象的方式?
JS建立對象,就是使用內置對象或各類自定義對象,還可使用 JSON
一、對象字面量 var person={firstname:"Mark",lastname:"Yun"}
二、用 function模擬無參數的構造函數
function Person() {}
var person = new Person();//定義一個function,若是使用new實例化,該function能夠看做一個class
person.name = "Mark";
person.age = "25";
person.word = function () {
    return person.name + 'hello'
};
三、用 function模擬參數構造函數來實現(用 this關鍵字定義構造的上下文屬性)
function Pet(name, age, hobby) {
    this.name = name;//this做用域,當前對象
    this.age = age;
    this.hobby = hobby;
    this.eat = function () {
        return "我是" + this.name + ",我喜歡" + this.hobby + ",是個程序員。";
    }
}
var maidou = new Pet("麥兜", 25, "coding");//實例化、建立對象
maidou.eat();//調用eat方法
四、用工廠方式來建立(內置對象)
var mcDog = new Object();
mcDog.name = "旺財";
mcDog.age = 3;
mcDog.work = function () {
    return mcDog.name + ',汪汪汪......';
};
mcDog.work();
五、用原型方式來建立
function Dog() {}
Dog.prototype.name = "旺財";
Dog.prototype.eat = function () {
    return this.name = "是個吃貨"
};
六、用混合方式來建立
function Car(name, price) {
    this.name = name;
    this.price = price;
}

Car.prototype.sell = function () {
    return "我是" + this.name + ",我如今賣" + this.price + "萬元。";
};
var camry = new Car("凱美瑞", 27);
  • JS做用域鏈?
全局函數沒法查看局部函數的內部細節,但局部函數能夠查看其上層的函數細節,直至全局細節。
當須要從局部函數查找某一屬性或方法時,若是當前做用域沒有找到,就會上溯到上層做用域查找,直至全局函數,這種組織形式就是做用域鏈。
  • 談談對this對象的理解?
this老是指向函數的直接調用者;
若是有 new關鍵字, this指向 new出來的對象;
在事件中, this指向觸發這個事件的對象,特殊的是IE中的 attachEvent中的 this老是指向全局對象 window
  • eval的做用?
它的功能是把對應的字符串解析成JS代碼並運行;
應該避免使用 eval,不安全,很是耗性能( 2次,一次解析成JS語句,一次執行)
JSON字符串轉換成 JSON對象的時候能夠用 evalvar obj=eval('('+str+')');
  • 什麼是window對象?什麼是document對象?
window對象是指瀏覽器打開的窗口
document對象時Document對象(HTML文檔對象)的一個只讀引用, window對象的一個屬性。
  • nullundefined的區別?
null表示一個對象的值爲
undefined表示一個變量聲明瞭,可是沒有初始化(賦值);

undefined不是一個有效的JSON,而null是;
undefined的類型(typeof)是undefined
null的類型typeofobject

JS將未賦值的變量默認設爲undefined
JS歷來不會將變量設爲null。它是用來標明某個用var聲明的變量時沒有值。

typeof undefined;//undefined
undefined:是一個表示的原始值或說表示缺乏值,就是此處應該有一個值,可是尚未定義。

typeof null;//null
null:是一個對象(空對象,沒有任何屬性和方法)
做爲函數的參數,表示該函數的參數不是對象;

注意:
在驗證null時,必定要使用===,由於==沒法區分nullundefined

null == undefined;//true
null === undefined;//false
寫一個通用的事件偵聽器函數

<p data-height="565" data-theme-id="0" data-slug-hash="bKjVvM" data-default-tab="js" data-user="whjin" data-embed-version="2" data-pen-title="通用的事件偵聽器函數" class="codepen">See the Pen 通用的事件偵聽器函數 by whjin (@whjin) on CodePen.</p>
<script async src="https://static.codepen.io/ass...;></script>

  • ['1', '2', '3'].map(parseInt);答案是多少?
['1', '2', '3'].map(parseInt);//[ 1, NaN, NaN ]
parseInt()函數能解析一個字符串,並返回一個整數,須要兩個參數( valradix);
其中 radix表示要解析的數字的基數。(該值介於 2~36之間,而且字符串中的數字不能大於 radix才能正確返回數字結果值);
此處 map穿了 3個( element,index,array),重寫 parseInt函數測試是否符合上面的規則。
function parseInt(str, radix) {
    return str + '-' + radix;
}
var a = ['1', '2', '3'];
console.log(a.map(parseInt));//[ '1-0', '2-1', '3-2' ]不能大於radix
由於二進制裏面沒有數字 3,致使出現超範圍的 radix賦值和不合法的進制解析,纔會返回 NaN
  • 什麼是事件?IE與火狐的事件機制有什麼區別?如何組織冒泡?
一、在網頁中的某個操做,例如點擊一個按鈕就會產生一個事件,能夠被JS偵測到的行爲。
二、事件處理機制:IE是事件冒泡、Firefox同時支持兩種事件模型,也就是:捕獲型事件和冒泡型事件;
三、 ev.stopPropation();(舊IE的方法 ev.cancelBubble=true;
  • 什麼是閉包(closure),爲何要使用它?
閉包是指有權訪問另外一個函數做用域中變量的函數,建立閉包的最多見方式是一個函數內建立另外一個函數,經過另外一個函數訪問這個函數的局部變量;
利用閉包能夠突破做用域鏈,將函數內部的變量和方法傳遞到外部。

閉包的特性:
一、函數內再嵌套函數;
二、內部函數能夠引用外層的參數和變量;
三、參數和變量不會被垃圾回收機制回收

li節點的onclick事件都能正確的彈出當前被點擊的li索引

var nodes = document.getElementsByTagName('li');
for (var i = 0, len = nodes.length; i < len; i++) {
    nodes[i].onclick = (function (i) {
        return function () {
            console.log(i);
        }
    })(i)
}
執行 sayNum()後, sayNum()閉包內部變量依舊存在,而閉包內部的函數的變量不會存在;
使得JS的垃圾回收機制GC不會收回 sayNum()所佔用的資源,由於 sayNum()的內部函數的執行須要依賴 sayNum()中的變量。這是對閉包做用的很是直白的描述。
function sayNum() {
    var num = 666;
    var sayLog = function () {
        console.log(num);
    };
    num++;
    return sayLog;
}
var sayLog = sayNum();
sayLog();//667
  • JS代碼中的use strict;有什麼做用?使用它區別是什麼?
use strict是一種ES6添加的(嚴格)運行模式,這種模式使得JS在更嚴格的條件下運行;

使JS編碼更佳規範化的模式,消除JS語法的一些不合理、不嚴謹的地方,減小一些怪異行爲。
默認支持的槽糕特性都會被禁用,好比不能使用with,也不能再意外的狀況下給全局變量賦值;
全局變量的顯示聲明,函數必須聲明在頂層,不容許再非函數代碼塊內聲明函數,arguments.callee也不容許使用;
消除代碼運行的一些不安全之處,保證代碼運行的安全,限制函數中的arguments修改,嚴格模式下的eval函數的行爲和非嚴格模式的也不相同。

提升編譯器效率,增長運行速度;

  • 如何判斷一個對象是否屬於某個類?
使用 instanceof
if (a instanceof Person) {
    console.log("yes");
}
  • 解釋一下new操做符?
一、建立一個空對象,而且 this變量引用該對象,同時還繼承了該函數的原型;
二、屬性和方法被加入到 this引用的對象中;
三、新建立的對象由 this所引用,而且最後隱式的返回 this
var obj = {};
obj.__proto__ = Base.prototype;
Base.call(obj);
  • JS中的hasOwnProperty函數,執行對象查找時不會去查找原型,詳細解釋一下?
JS中 hasOwnProperty函數方法是返回一個布爾值,指出一個對象是否具備指定名稱的屬性。
此方法沒法檢查該對象的原型鏈中是否具備該屬性;
該屬性必須是對象自己的一個成員。

使用方法:
Object.hasOwnProperty(proName)
其中參數object是必選項。一個對象的實例。
proName是必選項。一個屬性名稱的字符串值。

若是object具備指定名稱的屬性,JS中hasOwnproperty函數方法返回true,反之則返回false

  • 說一下你對JSON的瞭解?
JSON是一種輕量級的數據交換格式。
它是基於JS的一個子集。數據格式簡單,易於讀寫,佔用帶寬小

JSON字符串轉換成JSON對象:

var obj = eval('(' + str + ')');
var obj = str.parseJSON();
var obj = JSON.parse(str);
JSON對象轉換成 JSON字符串:
var last = obj.toJSONString();
var last = JSON.stringify(obj);
  • JS有哪些延遲加載的方式?
deferasync、動態建立DOM方式(用得最多)、按需異步加載JS
  • Ajax是什麼?如何建立一個Ajax
異步傳輸+JS+XML
異步:向服務器發送請求時,沒必要等待結果,而是能夠同時作其餘的事情,等到有告終果會本身根據設定進行後續操做;
與此同時,頁面不會發生總體刷新,提供了用戶體驗。

一、建立XMLHTTPRequest對象,也就是建立一個異步調用對象;
二、建立一個新的HTTP請求,並指定該HTTP請求的方法、URL及驗證信息;
三、設置響應HTTP請求狀態變化的函數;
四、發送HTTP請求
五、獲取異步調用返回的數據
六、使用JS和DOM實現局部刷新

  • Ajax解決瀏覽器緩存問題?
一、在 ajax發送請求前添加
AjaxObj.setRequestHeader("IF-Modified-Since","0");
二、在 ajax發送請求前添加
AjaxObj.setRequestHeader("Cache-Control", "no-cache");
三、在URL後面添加一個隨機數: "fresh=" + Math.random();

四、在URL後面添加時間戳:"nowtime=" + new Date().getTime();

五、若是使用jQuery,則$.ajaxSetup({cache: false});。這樣頁面的全部ajax都會執行這條語句,不須要保存緩存記錄。

  • 同步和異步的區別?
同步:不一樣進程爲協同完成某項工做,在前後次序上調整(經過 阻塞喚醒等方式)。

同步:瀏覽器訪問服務器請求,頁面刷新,從新發送請求,等待請求完成,頁面刷新顯示新內容,如此反覆。
異步:瀏覽器訪問服務器請求,操做頁面,瀏覽器後端進行請求。等待請求完成,頁面不刷新顯示新內容。

  • 如何解決跨域問題?
jsonpiframewindow.namewindow.postMessage、服務器上設置代理頁面
  • AMDCMD規範的卻別?
AMD異步模塊定義,全部的模塊將被異步加載,模塊加載不影響後面語句運行。
全部依賴某些模塊的語句都放置在回調函數中。

區別:
一、對於依賴的模塊,AMD是提早執行,CMD是延遲執行。
二、CMD推崇依賴就近,AMD推崇依賴前置

//AMD
define(['./a', './b'], function (a, b) {//依賴必須一開始就寫好
    a.doSomething();
    b.doSomething();
});

//CMD
define(function (require, exports, module) {
    var a = require('./a');
    a.doSomething();
    var b = require('./b');//依賴能夠就近寫
    b.doSomething();
});
  • document.writeinnerHTML的區別?
document.write只能重回整個頁面
innerHTML能夠重繪頁面的一部分
  • DOM操做——添加、移除、移動、賦值、建立和查找節點?
一、建立新節點
createDocumentFragment();//建立一個DOM片斷
createElement();//建立一個具體的元素
createTextNode();//建立一個文本節點
二、添加、移除、替換、插入
appendChild();//添加
removeChild();//移除
replaceChild();//替換
insertBefore();//在已有的子節點前插入一個新的子節點
三、查找
getElementsByTagName();//經過標籤名
getElementsByName();//經過元素的Name屬性的值(IE容錯能力較強,會獲得一個數組,其中包括id等於name值)
getElementById();//經過元素id,惟一性
  • jquery.extendjquery.fn.extend的區別?
jquery.extendjquery類添加類方法,能夠理解爲添加靜態方法
jquery.fn.extend:
源碼 jquery.fn=jquery.prototype,對 jquery.fn的擴展,就是爲 jquery類添加成員函數
使用
jquery.extend擴展,須要經過 jquery類調用,而 jquery.fn.extend擴展,全部 jquery實例均可以直接調用。
  • 針對jQuery的優化方法?
基於 class的選擇器的性能相對於 id選擇器開銷很大,由於須要遍歷全部DOM元素。

頻繁操做的DOM,先緩存起來再操做。用jQuery的鏈式調用更好。好比var str=$("a").attr("href");

for (var i = size, len = arr.length; i < len; i++) {}

  • 如何判斷當前腳本運行在瀏覽器仍是Node環境中?(阿里)
this === window ? 'browser' : 'node';
經過判斷 global對象是否爲 window,若是不爲 window,當前腳本沒有運行在瀏覽器中。
  • 哪些操做會形成內存泄漏?
垃圾回收器定義掃描對象,並計算引用了每一個對象的其餘對象的數量。若是一個對象的引用數量爲 0(沒有其餘對象引用過該對象),或對該對象的惟一引用是循環的,那麼該對象的內存便可回收。

setTimeout的第一個參數使用字符串而非函數,會引起內存泄漏。
閉包、控制檯日誌、循環(兩個對象彼此引用,且彼此保留時,就會產生一個循環)

  • 用JS實現千位分隔符?
function commafy(num) {
    return num && num
        .toString()
        .replace(/(\d)(?=(\d{3})+\.)/g, function ($0, $1) {
            return $1 + ',';
        })
}
  • 使用JS實現獲取文件擴展名?
function getFileExtension(filename) {
    return filename.splice((filename.ladtIndexOf(".") - 1 >>> 0) + 2);
}
String.lastIndexOf()方法返回指定值,在調用該方法的字符串中最後出現的位置,若是沒找到則返回 -1
對於 filename.hiddenfilelastIndexOf的返回值分別爲 0-1
String.prototype.splice()從計算的索引提取文件的擴展名。若是索引比文件名的長度大,結果爲 ""
  • webpack熱更新實現原理?
一、 webpack編譯期,爲須要熱更新的 entry注入熱更新代碼( EventSource通訊)
二、頁面首次打開後,服務端與客戶端經過 EventSource創建通訊渠道,把下一次的 hash返回前端
三、客戶端獲取到 hash,這個 hash將做爲下一次請求服務端 hot-update.jshot-update.jsonhash
四、修改頁面代碼, webpack監聽到文件修改後,開始編譯,編譯完成後發送 build消息給客戶端
五、客戶端獲取到 hash,成功後客戶端構造 hot-update.jsscript連接,然互毆插入主文檔
六、 hot-update.js插入成功後,執行 hotAPIcreateRecordreload方法,獲取到組件的 render方法,從新 render組件,從而實現UI無刷新更新。

ES6

  • Object.is()與原來的比較操做符=====的區別?
==判斷,會在比較時進行類型轉換
===判斷(嚴格判斷),比較時不進行隱式類型轉換,類型不一樣就會返回 false

Object.is()===判斷的基礎上特別處理了NaN-0+0,保證-0+0再也不相同,但Object.is(NaN,NaN)會返回true

  • 如何進行頁面重構?
網站重構:在不改變UI的狀況下對網站進行優化,在擴展的同時保持一致的UI。

對傳統的網站來講,重構一般是:
一、表格table佈局改成div+css
二、使網站前端兼容於現代瀏覽器
三、對於移動平臺的優化
四、針對SEO進行優化

深層次的網站重構應該考慮:
一、減小代碼間的耦合
二、讓代碼保持彈性
三、嚴格按照規範編寫代碼
四、設計可擴展的API
五、代替舊有的框架、語言
六、加強用戶體驗
七、對速度的優化

一、壓縮JS、CSS、image等前端資源(一般是由服務器來解決)
二、程序的性能優化(數據讀寫)
三、採用CDN來加速資源加載
四、對於JS DOM的優化
五、HTTP服務器的文件緩存

  • 列舉IE與其餘瀏覽器不一樣的特性?
事件:觸發事件的元素被認爲是目標( target)。在IE中,目標包含在 event對象的 SRCElement屬性;

獲取字符代碼:若是按鍵表明一個字符(shiftCtrlAlt除外),IE的keyCode會返回字符代碼unicode,DOM中按鍵的代碼和字符是分離的,要獲取字符代碼,須要使用charCode屬性;

阻止某個事件的默認行爲:IE中阻止某個事件的默認行爲,必須將returnValue屬性設置爲false,火狐瀏覽器中須要調用preventDefault()方法。

中止事件冒泡,IE中阻止事件進一步冒泡,須要設置cancelBubbletrue,火狐中須要調用stopPropagation()

  • 解析一下優雅降級和漸進加強?
優雅降級:Web站點在全部新式瀏覽器中都能正常工做,若是用戶使用的是舊式瀏覽器,則代碼會針對舊版本的IE進行降級處理,使之在舊式瀏覽器上以某種形式降級體驗而不至於徹底不能使用。
例如: border-shadow

漸進加強:從被全部瀏覽器支持的基本能工開始,逐步地添加那些只有新版本瀏覽器才支持的功能,向頁面增長不影響基礎瀏覽器的額外樣式和功能。當瀏覽器支持時,它們會自定地呈現出來併發揮做用。
例如:默認使用flash上傳,但若是瀏覽器支持HTML5的文件上傳功能,則使用HTML5實現更好的體驗。

  • Web應用從服務器主動推送Data到客戶端有哪些方式?
HTML5提供的 WebSocket
不可見的 iframe
WebSocket經過 flash
XHR長時間鏈接
XHR Multipart Streaming
<script>標籤的長時間鏈接(可跨域)
  • 談一下Node的優勢和缺點?
優勢:
由於Node是基於事件驅動和無阻塞的,因此很是適合處理併發請求;
所以構建在Node上的代理服務器相比其餘技術實現(如Ruby)的服務器表現要好不少。
此外,與Node代理服務器交互的客戶端代碼是由JS語言編寫,所以客戶端和服務器端都用同一種語言編寫。

缺點:
Node是一個相對新的開源項目,因此不太穩定,老是一直在變,並且缺乏足夠多的第三方庫支持。

  • 你使用過哪些前端性能優化的方法?
一、減小HTTP請求次數: CSS SpritesJSCSS源碼壓縮、控制圖片大小;網頁 Gzip,CDN託管, data緩存,圖片服務器
二、前端模板:JS+數據,減小因爲HTML標籤致使的帶寬浪費,前端用變量保存AJAX請求結果,每次操做本地變量,不用請求,減小請求次數
三、用 innerHTML代替DOM操做,減小DOM操做次數,優化JS性能
四、當須要設置的樣式不少時,設置 className而不是直接操做 style
五、少用全局變量、緩存DOM節點查找的結果。減小IO讀取操做。
六、避免使用 CSS表達式,又稱動態屬性
七、圖片預加載,將樣式表放在頂部,將腳本放在底部,加上時間戳
八、避免在頁面的主題佈局中使用 tabletable要等其中的內容徹底下載以後纔會顯示出來,顯示比 div+css佈局慢。

對普通的網站有一個統一的思路,就是儘可能向前端優化、減小數據庫操做、減小磁盤IO讀寫。
向前端優化指的是,在不影響功能和體驗的狀況下,
能在瀏覽器執行的不在服務器端執行,
能在緩存服務器上直接返回的不要到應用服務器執行,
程序能直接取得的結果不要到外部取得,
本機內能取得的數據不要到遠程取得,
內存能取到的不要到磁盤上取,
緩存中有得不要去數據庫查詢。

減小數據庫操做,指的是減小更新次數、緩存結果減小查詢次數、將數據庫執行的操做盡量的讓程序完成(例如join查詢),
減小磁盤IO指儘可能不適用文件系統做爲緩存、減小讀寫文件次數等。

  • HTTP狀態碼有哪些?分別表明什麼?
簡單版:
100- continue:繼續,通常在發送 post請求時,已發送 http header以後服務器端將返回此信息表示確認,以後發送具體參數信息。
200- OK:正常返回信息
201- created:請求成功而且服務器建立了新的資源
202- Accepted:服務器已接受請求,但還沒有處理

301-Moved Permanently:請求的網頁已經永久移動到新的位置
302-Found:臨時性重定向
303-See Other:臨時性重定向,且老是使用GET請求新的URI
304-Not Modified:自從上次請求後,請求的網頁未修改過
400-Bad Request:服務器沒法理解請求的格式,客戶端不該當嘗試再次使用相同的內容發起請求

401-Unauthorized:請求未受權
403-Forbidden:禁止訪問
404-Not Found:找不到如何與URI相匹配的資源

500-Internal Server Error:最多見的服務器端錯誤
503-Server Unavailable:服務器端暫時沒法處理請求(多是過載或維護)

完整版:
1**(信息類):表示接收到請求而且繼續處理
100——客戶必須繼續發出請求
101——客戶要求服務器根據請求轉換HTML協議版本

2**(響應成功):表示動做被成功接收、理解和接受
200——代表該請求被成功地完成,所請求的資源發送回客戶端
201——提示知道新文件的URL
202——接受和處理、但處理未完成
203——返回信息不肯定或不完整
204——請求收到,但返回信息爲空
205——服務器完成了請求,用戶代理必須復位當前已經瀏覽過的文件
206——服務器已經完成了部分用戶的GET請求

3**(重定向類):爲了完成指定的動做,必須接受進一步處理
300——請求的資源可在多處獲得
301——本網頁被永久性轉移到另外一個URL
302——請求的網頁被轉移到一個新的地址,但客戶訪問仍繼續經過原始URL地址,重定向,新的URL會在response中的Location中返回,瀏覽器將會使用新的URL發出新的request
303——建議客戶訪問其餘URL或訪問方式
304——自從上次請求後,請求的網頁未修改過,服務器返回此響應時,不會返回網頁內容,表明上次的文檔已經被緩存,還能夠繼續使用。
305——請求的資源必須從服務器指定的地址獲得
306——前一版本HTTP中使用的代碼,現行版本中再也不使用
307——申明請求的資源臨時性刪除

4**(客戶端錯誤類):請求包含錯誤語法或不能正確執行
400——客戶端請求有語法錯誤,不能被服務器所理解

401——請求未經受權,這個狀態碼必須和WWW-Authenticate報頭域一塊兒使用
HTTP 401.1——未受權:登陸失敗
HTTP 401.2——未受權:服務器配置問題致使登陸失敗
HTTP 401.3——ACL 禁止訪問資源
HTTP 401.4——未受權:受權被篩選器拒絕
HTTP 401.5——未受權:ISAPI或CGI受權失敗

402——保留有效ChargeTo頭響應

403——禁止訪問,服務器收到請求,可是拒絕提供服務
HTTP 403.1——禁止訪問:禁止可執行訪問
HTTP 403.2——禁止訪問:禁止讀訪問
HTTP 403.3——禁止訪問:禁止寫訪問
HTTP 403.4——禁止訪問:要求SSL
HTTP 403.5——禁止訪問:要求SSL 128
HTTP 403.6——禁止訪問:IP地址被拒絕
HTTP 403.7——禁止訪問:要求客戶證書
HTTP 403.8——禁止訪問:禁止站點訪問
HTTP 403.9——禁止訪問:鏈接的用戶過多
HTTP 403.10——禁止訪問:配置無效
HTTP 403.11——禁止訪問:密碼更改
HTTP 403.12——禁止訪問:映射器拒絕訪問
HTTP 403.13——禁止訪問:客戶證書已被吊銷
HTTP 403.15——禁止訪問:客戶訪問許可過多
HTTP 403.16——禁止訪問:客戶證書不可信或者無效
HTTP 403.17——禁止訪問:客戶證書已經到期或者還沒有生效

404——一個404錯誤代表可鏈接服務器,但服務器沒法取得所請求的網頁,請求資源不存在。
405——用戶在Request-Line字段定義的方法不予許
406——根據用戶發送的Accept頭,請求資源不可訪問
407——相似401,用戶必須首先在代理服務器上獲得受權
408——客戶端沒有在用戶指定的時間內完成請求
409——對當前資源狀態,請求不能完成
410——服務器上再也不有此資源,且無進一步的參考地址
411——服務器拒絕用戶定義的Content-Length屬性請求
412——一個或多個請求頭字段在當前請求中錯誤
413——請求的資源大於服務器容許的大小
414——請求的資源URL長於服務器容許的長度
415——請求的資源不支持請求項目格式
416——請求中包含Range請求頭字段,在當前請求資源範圍內沒有Range指示值,請求也不包含If-Rane請求頭字段
417——服務器不知足請求Expect頭字段指定的指望值,若是是代理服務器,多是下一級服務器不能知足請求。

5**(服務端錯誤類):服務器不能正確執行一個正確的請求
HTTP 500——服務器遇到錯誤,沒法完成請求
HTTP 500.100——內部服務器錯誤——ASP錯誤
HTTP 500.11——服務器關閉
HTTP 500.12——應用程序從新啓動
HTTP 500.13——服務器太忙
HTTP 500.14——應用程序無效
HTTP 500.15——不容許請求global.asa

Error 501——未實現

HTTP 502——網關錯誤
HTTP 503——因爲超載或停機維護,服務器目前沒法使用,一段時間後可能恢復正常

  • 一個頁面從輸入URL到頁面加載顯示完成,這個過程發生了什麼?(流程越詳細越好)
從URL規範、HTTP協議、DNS、CDN、數據庫查詢到瀏覽器解析、CSS規則構建、 layoutpaintonload/domready、JS執行、JS API綁定等

一、瀏覽器會開啓一個線程來處理這個請求,對URL分析判斷若是是HTTP協議就按照Web方式來處理;
二、調用瀏覽器內核中的對應方法,好比webview 中的loadUrl方法;
三、經過DNS解析獲取網址的IP地址,設置UA等信息發出第二個GET請求;
四、記性HTTP協議會話,客戶端發送報頭(請求報頭);
五、進入到web服務器上的Web Server,如Accept、Tomcat、Node.js等服務器;
六、進入部署好的後端應用,如PHP、Java、JavaScript、python等,找到對應的請求處理;
七、處理結束反饋報頭,此處若是瀏覽器訪問過,緩存上有對應資源,會與服務器最後修改時間對比,一致則返回304
八、瀏覽器開始下載HTML文檔(響應報頭,狀態碼200),同時是使用緩存;
九、文檔樹創建,根據標記請求所須要指定MIME類型的文件(好比css、js),同時設置了cookie
十、頁面開始渲染DOM,JS根據DOM API操做DOM,執行事件綁定等,頁面顯示完成。

瀏覽器把請求的URL交給DNS域名解析,找到真實IP,向服務器發起請求;服務器交給後臺處理完成後返回數據,瀏覽器接收文件;瀏覽器對加載到的資源進行語法解析,創建相應的內部數據結構;載入解析好的資源文件,渲染頁面顯示內容。

相關文章
相關標籤/搜索