前端開發面試題
站點地址: 全棧開發
原文連接: 前端開發面試題
HTML
- Doctype做用?標準模式與兼容模式各有什麼區別?
一、<!DOCTYPE>
聲明位於HTML文檔中的第一行,處於<html>
標籤以前,告知瀏覽器的解析器用什麼文檔標準解析。DOCTYPE不存在或格式不正確會致使文檔以兼容模式呈現。
二、標準模式的排版和JS運行模式都是以該瀏覽器支持的最高標準運行。在兼容模式中,頁面以寬鬆的向後兼容的方式顯示,模擬老式瀏覽器的行爲以防止站點沒法工做。
- HTML5爲何只須要寫
<!DOCTYPE HTML>
?
HTML5不基於SGML(標準通用標記語言),所以不須要對DTD(文檔類型定義)進行引用,可是須要doctype
來規範瀏覽器的行爲(讓瀏覽器按照它們應該的方式來運行)
HTML4.01基於SGML,因此須要對DTD進行引用,才能告知瀏覽器文檔所使用的文檔類型。
- 行內元素有哪些?塊級元素有哪些?空(
void
)元素有哪些?
首先:CSS規範規定,每一個元素都有display
屬性,肯定鈣元素的類型,每一個元素都有默認的display
值,如div
的display
默認值爲block
,都是塊級元素;span
默認display
屬性值爲inline
,是行內元素。
一、行內元素:a
、b
、span
、img
、input
、select
、strong
(強調的語氣)
二、塊級元素:div
、ul
、ol
、li
、dl
、dt
、dd
、h1
、h2
、h3
、h4
、p
三、常見的空元素:br
、hr
、img
、input
、link
、meta
不經常使用的空元素:area
、base
、col
、command
、embed
、keygen
、param
、source
、track
、wbr
- 頁面導入樣式時,使用
link
和@import
有什麼區別?
一、link
屬於XHTML
標籤,除了加載CSS
外,還能用於定義RSS
,定義rel
鏈接屬性等做用;而@import
是CSS
提供的,只能用於加載CSS
。
二、頁面被加載時,link
會同時被加載,而@import
引用的CSS
會等到頁面被加載完再加載。
三、import
是CSS2.1
提出的,只在IE5
以上才能被識別,而link
是XHTML
標籤,無兼容問題。
四、link
支持使用JS
控制DOM
改變樣式,而@import
不支持。
- 介紹一下你對瀏覽器內核的理解?
主要分紅兩部分:渲染引擎(layout
或engine
)和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
用於媒介回放的video
和audio
元素
本地離線存儲localStorage
長期存儲數據,瀏覽器關閉後數據不丟失
sessionStorage
的數據在瀏覽器關閉後自動刪除語義化更好的內容元素,好比
article
、footer
、header
、nav
、section
表單控件:calendar
、date
、time
、url
、search
新技術:webworker
、websocket
、Geolocation
css移除的元素:
純表現的元素:basefont
、big
、center
、font
、s
、strike
、tt
、u
對可用性產生負面影響的元素:frame
、frameset
、noframes
html支持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
文件,若是文件沒有發生改變,就不作任何操做,不然就會從新下載文件中的資源並進行離線存儲。
離線的狀況下,瀏覽器直接使用離線存儲的資源。
- 請描述一下
cookie
,sessionStorage
,localStorage
的區別?
cookie
是網站爲了標識用戶身份而存儲在用戶本地終端上的數據(一般通過加密)
cookie
數據始終在同源的http
請求中攜帶(即便不須要),就會在瀏覽器和服務器間來回傳遞
sessionStorage
和localStorage
不會自動把數據發給服務器,僅在本地保存存儲大小:
cookie
數據大小不能超過4k
sessionStorage
和localStorage
雖然也有存儲大小的限制,但比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
- 如何實現瀏覽器內多個標籤頁之間的通訊?(阿里)
WebSocket
,SharedWorkder
也能夠調用localStorage
、cookies
等本地存儲方式
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
部分把border
和padding
計算進去
- CSS選擇符有哪些?哪些屬性能夠繼承?
一、ID選擇器
二、類選擇器
三、標籤選擇器
四、相鄰選擇器(h1+p
)
五、子選擇器(ul>li
)
六、後代選擇器(li a
)
七、通配符選擇器(*
)
八、屬性選擇器(a[rel="external"]
)
九、僞類選擇器(a:hover,li:nth-child
)可繼承的樣式:
font-size
、font-family
、color
、ul
、li
、dl
、dd
、dt
不可繼承的樣式:border
、padding
、margin
、width
、height
webpack
- 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
的值relative
和absolute
定位原點?
absolute
生成絕對定位的元素,相對於值不爲static
的第一個父元素進行定位
fixed
(老IE不支持)生成絕對定位的元素,相對於瀏覽器窗口進行定位
relative
生成相對定位的元素,相對於其正常位置進行定位
static
默認值。沒有定位,元素出如今正常的流中(忽略top
、right
、bottom
、left
聲明)
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; }
- 如何設計一個滿屏
品
字佈局?
簡單方式:
上面的div
寬100%
下面的兩個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
瀏覽器默認的margin
和padding
不一樣。解決方案是加一個全局{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
對象有x
、y
屬性,可是沒有pageX
、pageY
屬性;
Firefox下event
對象有pageX
、pageY
屬性,可是沒有x
、y
屬性
解決方法:(條件註釋)缺點是在IE瀏覽器下可能會增長額外的HTTP請求數程序員chrome中文界面下默認會將小於
12px
的文本強制按照12px
顯示
可經過加入CSS屬性-webkit-text-size-adjust:none;
解決超連接訪問事後
hover
樣式不出現,被點擊訪問過的超連接樣式再也不具備hover
和avtive
。
解決方法:改變CSS屬性的排列順序。
L-V-H-A:a:link{} a:visited{} a:hover{} a:active{}
-
li
與li
之間有看不見的空白間隔是什麼緣由引發的?有什麼解決辦法?
行框的排列會受到中間空白(回車/空格)等的影響,由於空格也屬於字符,這些空白也會被應用樣式,佔據空間,因此會有間隔,把字符大小設爲
0
,就沒有空格。
- 爲什嗎要初始化CSS樣式?
瀏覽器有兼容問題,不一樣瀏覽器對有些標籤的默認值不一樣,沒有CSS初始化會出現瀏覽器之間的頁面顯示差別。初始化樣式會對SEO有必定的影響,儘可能在影響最小的狀況下進行初始化。
-
absolute
的containing block
(容器塊)計算方式跟正常流有什麼不一樣?
不管屬於哪一種,都要先找到其祖先元素中最近的position
值不爲static
的元素,而後再判斷:
一、若此元素爲inline
元素,則containing block
爲可以包含這個元素生成的第一個和最後一個inline box
的padding box
(除margin
,border
外的區域)的最小矩形;
二、不然由這個祖先元素的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;
表現相同。若是目標元素爲table
,visibility:collapse;
將table
隱藏,可是會佔據頁面佈局空間。僅在Firefox下起做用,IE會顯示元素,Chrome會將元素隱藏,可是佔據空間。
-
position
跟display
、margin collapse
、overflow
、float
這些特性相互疊加後會怎樣?
若是元素的display
爲none
,那麼元素不被渲染,position
,float
不起做用;
若是元素擁有position:absolute;
或position":fixed;
屬性,那麼元素將爲絕對定位,float
不起做用。
若是元素float
屬性不是none
,元素會脫離文檔流,根據float
屬性值來顯示。有浮動、絕對定位,inline-block
屬性的元素,margin
不會和垂直方向上的其餘元素margin
摺疊。
- 對BFC規範(塊級格式化上下文)的理解?
它是一個獨立容器,決定了元素如何對其內容進行定位,以及與其餘元素的關係和相互做用。
一個頁面是由多個Box組成,元素的類型和display
屬性,決定了這個Box的類型
不一樣類型的Box會參與不一樣的Formatting Context
(決定如何渲染文檔的容器),所以Box內的元素會以不一樣的方式渲染,也就是說BFC內部的元素和外部的元素不會相互影響。
- CSS定義的權重
權重的規則:標籤的權重爲1
,class
的權重爲10
,id
的權重爲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;
觸發IEhasLayout
經過分析發現,除了clear:both
用來閉合浮動,其餘代碼都是爲了隱藏content
生成的內容,這也是其餘版本的閉合浮動爲何有font-size:0
,line-height:0
- 什麼是外邊距合併?
外邊距合併指的是,當兩個垂直外邊距相遇時,它們將造成一個外邊距。
合併後的外邊距的高度等於兩個發生合併的外邊距的高度重的較大者
-
zoom:1
的清除浮動原理?
清除浮動,觸發hasLayout
;
zoom
屬性時IE瀏覽器的專有屬性,它能夠設置或檢索對象的縮放比例。解決IE存在的bug
好比外邊距的重疊,浮動清除,觸發IE的hasLayout
屬性等當設置了
zoom
的值後,所設置的元素就會擴大或縮小,高度寬度就會從新計算,一旦改變zoom
值時也會發生從新渲染,運用這個原理解決IE中子元素浮動時父元素不隨着自動擴大的問題。目前非IE瀏覽器不支持這個屬性,能夠經過CSS3中的動畫屬性
scale
進行縮放。
- 瀏覽器如何解析CSS選擇器?
從關鍵選擇器開始匹配,而後左移查找規則選擇器祖先元素。
只要選擇器的子樹一直在工做,樣式系統就會持續左移,直到和規則匹配,或由於不匹配而放棄規則。
-
margin
和padding
分別適用什麼場景?
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:0
、letter-spacing
、word-spacing
- 什麼是
cookie
隔離?(請求資源的時候不要讓它攜帶cookie)
若是靜態文件都放在主域名下,靜態文件請求的時都帶有cookie
的數據提交給server
,很是浪費流量。由於
cookie
有域的限制,所以不能跨域提交請求,因此使用非主要域名的時候,請求頭中就不會帶有cookie
數據。
這樣能夠下降請求頭的大小,下降請求時間,從而達到下降總體請求延時的目的。
同時這種方式不會將cookie
傳入Web Server,也減小了Web Server對cookie
的處理分析環節。
提升了webserver的HTTP請求的解析速度。
JavaScript
- 介紹JS的基本數據類型
undefined
、null
、Boolean
、number
、string
ES6新增:symbol
(建立惟一且不可變數據類型)
- 介紹JS有哪些內置對象?
Object
是JS中全部對象的父對象
數據封裝類對象:Object
、Array
、Boolean
、Number
和String
其餘對象:Function
、arguments
、Math
、Date
、RegExp
、Error
- 寫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有幾種類型的值?畫一下內存圖?
棧:原始數據類型(undefined
,null
、Boolean
、number
、string
)
堆:引用數據類型(對象、數組和函數)兩種類型的區別:存儲位置不一樣
原始數據類型直接存儲在棧中的簡單數據段,佔據空間小、大小固定,屬於被頻繁使用數據,因此放入棧中存儲;
引用數據類型存儲在堆中的對象,佔據空間大、大小不固定。若是存儲在棧中,將會影響程序運行的性能;
引用數據類型在棧中存儲了指針,該指針指向堆中該實體的起始地址。當解析器尋找引用值時,會首先檢索其在棧中的地址,取得地址後從堆中得到實體。
- 如何將字符串轉化爲數字,例如
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
機制或apply
和call
方法去實現比較簡單,建議使用構造函數與原型混合方式。
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
對象的時候能夠用eval
,var obj=eval('('+str+')');
- 什麼是
window
對象?什麼是document
對象?
window
對象是指瀏覽器打開的窗口
document
對象時Document對象(HTML文檔對象)的一個只讀引用,window
對象的一個屬性。
-
null
、undefined
的區別?
null
表示一個對象的值爲 空;
undefined
表示一個變量聲明瞭,可是沒有初始化(賦值);
undefined
不是一個有效的JSON
,而null
是;undefined
的類型(typeof
)是undefined
null
的類型typeof
是object
JS將未賦值的變量默認設爲
undefined
;
JS歷來不會將變量設爲null
。它是用來標明某個用var
聲明的變量時沒有值。
typeof undefined;//undefined
undefined
:是一個表示無的原始值或說表示缺乏值,就是此處應該有一個值,可是尚未定義。
typeof null;//null
null
:是一個對象(空對象,沒有任何屬性和方法)
做爲函數的參數,表示該函數的參數不是對象;注意:
在驗證null
時,必定要使用===
,由於==
沒法區分null
和undefined
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()
函數能解析一個字符串,並返回一個整數,須要兩個參數(val
、radix
);
其中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有哪些延遲加載的方式?
defer
和async
、動態建立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
都會執行這條語句,不須要保存緩存記錄。
- 同步和異步的區別?
同步:不一樣進程爲協同完成某項工做,在前後次序上調整(經過 阻塞, 喚醒等方式)。同步:瀏覽器訪問服務器請求,頁面刷新,從新發送請求,等待請求完成,頁面刷新顯示新內容,如此反覆。
異步:瀏覽器訪問服務器請求,操做頁面,瀏覽器後端進行請求。等待請求完成,頁面不刷新顯示新內容。
- 如何解決跨域問題?
jsonp
、iframe
、window.name
、window.postMessage
、服務器上設置代理頁面
-
AMD
、CMD
規範的卻別?
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.write
和innerHTML
的區別?
document.write
只能重回整個頁面
innerHTML
能夠重繪頁面的一部分
-
DOM
操做——添加、移除、移動、賦值、建立和查找節點?
一、建立新節點
createDocumentFragment();//建立一個DOM片斷 createElement();//建立一個具體的元素 createTextNode();//建立一個文本節點
二、添加、移除、替換、插入
appendChild();//添加 removeChild();//移除 replaceChild();//替換 insertBefore();//在已有的子節點前插入一個新的子節點
三、查找
getElementsByTagName();//經過標籤名 getElementsByName();//經過元素的Name屬性的值(IE容錯能力較強,會獲得一個數組,其中包括id等於name值) getElementById();//經過元素id,惟一性
-
jquery.extend
和jquery.fn.extend
的區別?
jquery.extend
爲jquery
類添加類方法,能夠理解爲添加靜態方法
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
和.hiddenfile
,lastIndexOf
的返回值分別爲0
和-1
。
String.prototype.splice()
從計算的索引提取文件的擴展名。若是索引比文件名的長度大,結果爲""
。
- webpack熱更新實現原理?
一、webpack
編譯期,爲須要熱更新的entry
注入熱更新代碼(EventSource
通訊)
二、頁面首次打開後,服務端與客戶端經過EventSource
創建通訊渠道,把下一次的hash
返回前端
三、客戶端獲取到hash
,這個hash
將做爲下一次請求服務端hot-update.js
和hot-update.json
的hash
四、修改頁面代碼,webpack
監聽到文件修改後,開始編譯,編譯完成後發送build
消息給客戶端
五、客戶端獲取到hash
,成功後客戶端構造hot-update.js
的script
連接,然互毆插入主文檔
六、hot-update.js
插入成功後,執行hotAPI
的createRecord
和reload
方法,獲取到組件的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
屬性;獲取字符代碼:若是按鍵表明一個字符(
shift
、Ctrl
、Alt
除外),IE的keyCode
會返回字符代碼unicode
,DOM中按鍵的代碼和字符是分離的,要獲取字符代碼,須要使用charCode
屬性;阻止某個事件的默認行爲:IE中阻止某個事件的默認行爲,必須將
returnValue
屬性設置爲false
,火狐瀏覽器中須要調用preventDefault()
方法。中止事件冒泡,IE中阻止事件進一步冒泡,須要設置
cancelBubble
爲true
,火狐中須要調用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 Sprites
、JS
、CSS
源碼壓縮、控制圖片大小;網頁Gzip
,CDN託管,data
緩存,圖片服務器
二、前端模板:JS+數據,減小因爲HTML標籤致使的帶寬浪費,前端用變量保存AJAX請求結果,每次操做本地變量,不用請求,減小請求次數
三、用innerHTML
代替DOM操做,減小DOM操做次數,優化JS性能
四、當須要設置的樣式不少時,設置className
而不是直接操做style
五、少用全局變量、緩存DOM節點查找的結果。減小IO讀取操做。
六、避免使用CSS
表達式,又稱動態屬性
七、圖片預加載,將樣式表放在頂部,將腳本放在底部,加上時間戳
八、避免在頁面的主題佈局中使用table
,table
要等其中的內容徹底下載以後纔會顯示出來,顯示比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
報頭域一塊兒使用
HTTP401.1
——未受權:登陸失敗
HTTP401.2
——未受權:服務器配置問題致使登陸失敗
HTTP401.3
——ACL 禁止訪問資源
HTTP401.4
——未受權:受權被篩選器拒絕
HTTP401.5
——未受權:ISAPI或CGI受權失敗
402
——保留有效ChargeTo
頭響應
403
——禁止訪問,服務器收到請求,可是拒絕提供服務
HTTP403.1
——禁止訪問:禁止可執行訪問
HTTP403.2
——禁止訪問:禁止讀訪問
HTTP403.3
——禁止訪問:禁止寫訪問
HTTP403.4
——禁止訪問:要求SSL
HTTP403.5
——禁止訪問:要求SSL128
HTTP403.6
——禁止訪問:IP地址被拒絕
HTTP403.7
——禁止訪問:要求客戶證書
HTTP403.8
——禁止訪問:禁止站點訪問
HTTP403.9
——禁止訪問:鏈接的用戶過多
HTTP403.10
——禁止訪問:配置無效
HTTP403.11
——禁止訪問:密碼更改
HTTP403.12
——禁止訪問:映射器拒絕訪問
HTTP403.13
——禁止訪問:客戶證書已被吊銷
HTTP403.15
——禁止訪問:客戶訪問許可過多
HTTP403.16
——禁止訪問:客戶證書不可信或者無效
HTTP403.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**
(服務端錯誤類):服務器不能正確執行一個正確的請求
HTTP500
——服務器遇到錯誤,沒法完成請求
HTTP500.100
——內部服務器錯誤——ASP錯誤
HTTP500.11
——服務器關閉
HTTP500.12
——應用程序從新啓動
HTTP500.13
——服務器太忙
HTTP500.14
——應用程序無效
HTTP500.15
——不容許請求global.asa
Error
501
——未實現HTTP
502
——網關錯誤
HTTP503
——因爲超載或停機維護,服務器目前沒法使用,一段時間後可能恢復正常
- 一個頁面從輸入URL到頁面加載顯示完成,這個過程發生了什麼?(流程越詳細越好)
從URL規範、HTTP協議、DNS、CDN、數據庫查詢到瀏覽器解析、CSS規則構建、layout
、paint
、onload/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,向服務器發起請求;服務器交給後臺處理完成後返回數據,瀏覽器接收文件;瀏覽器對加載到的資源進行語法解析,創建相應的內部數據結構;載入解析好的資源文件,渲染頁面顯示內容。