本文旨在加深對前端知識點的理解,資料來源於網絡,由 trigkit4 收集整理。jquery
一些開放性題目
1
2
3
4
5
6
7
8
9
|
1.自我介紹:除了基本我的信息之外,面試官更想聽的是你不同凡響的地方和你的優點。
2.項目介紹
3.如何看待前端開發?
4.平時是如何學習前端開發的?
5.將來三到五年的規劃是怎樣的?
|
position的值, relative和absolute分別是相對於誰進行定位的?
absolute
:生成絕對定位的元素, 相對於最近一級的 定位不是 static 的父元素來進行定位。fixed
(老IE不支持)生成絕對定位的元素,一般相對於瀏覽器窗口或 frame 進行定位。relative
生成相對定位的元素,相對於其在普通流中的位置進行定位。static
默認值。沒有定位,元素出如今正常的流中sticky
生成粘性定位的元素,容器的位置根據正常文檔流計算得出
如何解決跨域問題
JSONP:android
原理是:動態插入script
標籤,經過script
標籤引入一個js
文件,這個js文件載入成功後會執行咱們在url參數中指定的函數,而且會把咱們須要的json
數據做爲參數傳入。webpack
因爲同源策略的限制,XmlHttpRequest
只容許請求當前源(域名、協議、端口)的資源,爲了實現跨域請求,能夠經過script
標籤實現跨域請求,而後在服務端輸出JSON數據並執行回調函數,從而解決了跨域的數據請求。
優勢是兼容性好,簡單易用,支持瀏覽器與服務器雙向通訊。缺點是隻支持GET請求。
JSONP
:json+padding
(內填充),顧名思義,就是把JSON填充到一個盒子裏
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<script>
function
createJs
(
sUrl
)
{
var
oScript
=
document
.
createElement
(
'script'
)
;
oScript
.
type
=
'text/javascript'
;
oScript
.
src
=
sUrl
;
document
.
getElementsByTagName
(
'head'
)
[
0
]
.
appendChild
(
oScript
)
;
}
createJs
(
'jsonp.js'
)
;
box
(
{
'name'
:
'test'
}
)
;
function
box
(
json
)
{
alert
(
json
.
name
)
;
}
</script>
|
CORS
服務器端對於CORS
的支持,主要就是經過設置Access-Control-Allow-Origin
來進行的。若是瀏覽器檢測到相應的設置,就能夠容許Ajax
進行跨域的訪問。
經過修改document.domain來跨子域
將子域和主域的document.domain
設爲同一個主域.前提條件:這兩個域名必須屬於同一個基礎域名!並且所用的協議,端口都要一致,不然沒法利用document.domain
進行跨域
主域相同的使用document.domain
使用window.name來進行跨域
window
對象有個name
屬性,該屬性有個特徵:即在一個窗口(window)的生命週期內,窗口載入的全部的頁面都是共享一個window.name
的,每一個頁面對window.name
都有讀寫的權限,window.name
是持久存在一個窗口載入過的全部頁面中的
使用HTML5中新引進的
window.postMessage
方法來跨域傳送數據
還有flash、在服務器上設置代理頁面等跨域方式。我的認爲window.name
的方法既不復雜,也能兼容到幾乎全部瀏覽器,這真是極好的一種跨域方法。
XML
和JSON
的區別?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
(
1
)
.數據體積方面。
JSON相對於
XML來說,數據的體積小,傳遞的速度更快些。
(
2
)
.數據交互方面。
JSON與
JavaScript的交互更加方便,更容易解析處理,更好的數據交互。
(
3
)
.數據描述方面。
JSON對數據的描述性比
XML較差。
(
4
)
.傳輸速度方面。
JSON的速度要遠遠快於
XML。
|
談談你對webpack的見解
WebPack
是一個模塊打包工具,你可使用WebPack
管理你的模塊依賴,並編繹輸出模塊們所需的靜態文件。它可以很好地管理、打包Web開發中所用到的HTML、Javascript、CSS
以及各類靜態文件(圖片、字體等),讓開發過程更加高效。對於不一樣類型的資源,webpack
有對應的模塊加載器。webpack
模塊打包器會分析模塊間的依賴關係,最後 生成了優化且合併後的靜態資源。
webpack
的兩大特點:
1
2
3
|
1.code
splitting(能夠自動完成)
2.loader能夠處理各類類型的靜態文件,而且支持串聯操做
|
webpack
是以commonJS
的形式來書寫腳本滴,但對 AMD/CMD
的支持也很全面,方便舊項目進行代碼遷移。
webpack
具備requireJs
和browserify
的功能,但仍有不少本身的新特性:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
1.對
CommonJS、
AMD、
ES6的語法作了兼容
2.對
js、
css、圖片等資源文件都支持打包
3.串聯式模塊加載器以及插件機制,讓其具備更好的靈活性和擴展性,例如提供對
CoffeeScript、
ES6的支持
4.有獨立的配置文件
webpack
.
config
.
js
5.能夠將代碼切割成不一樣的
chunk,實現按需加載,下降了初始化時間
6.支持
SourceUrls和
SourceMaps,易於調試
7.具備強大的
Plugin接口,大可能是內部插件,使用起來比較靈活
8.webpack使用異步
IO並具備多級緩存。這使得
webpack很快且在增量編譯上更加快
|
說說TCP傳輸的三次握手四次揮手策略
爲了準確無誤地把數據送達目標處,TCP
協議採用了三次握手策略。用TCP協議把數據包送出去後,TCP
不會對傳送 後的狀況置之不理,它必定會向對方確認是否成功送達。握手過程當中使用了TCP的標誌:SYN
和ACK
。
發送端首先發送一個帶SYN
標誌的數據包給對方。接收端收到後,回傳一個帶有SYN/ACK
標誌的數據包以示傳達確認信息。 最後,發送端再回傳一個帶ACK
標誌的數據包,表明「握手」結束。 若在握手過程當中某個階段莫名中斷,TCP
協議會再次以相同的順序發送相同的數據包。
斷開一個TCP鏈接則須要「四次握手」:
- 第一次揮手:主動關閉方發送一個
FIN
,用來關閉主動方到被動關閉方的數據傳送,也就是主動關閉方告訴被動關閉方:我已經不 會再給你發數據了(固然,在fin包以前發送出去的數據,若是沒有收到對應的ack確認報文,主動關閉方依然會重發這些數據),可是,此時主動關閉方還可 以接受數據。 - 第二次揮手:被動關閉方收到
FIN
包後,發送一個ACK
給對方,確認序號爲收到序號+1
(與SYN
相同,一個FIN
佔用一個序號)。 - 第三次揮手:被動關閉方發送一個
FIN
,用來關閉被動關閉方到主動關閉方的數據傳送,也就是告訴主動關閉方,個人數據也發送完了,不會再給你發數據了。 - 第四次揮手:主動關閉方收到
FIN
後,發送一個ACK
給被動關閉方,確認序號爲收到序號+1,至此,完成四次揮手。
TCP和UDP的區別
TCP
(Transmission Control Protocol,傳輸控制協議)是基於鏈接的協議,也就是說,在正式收發數據前,必須和對方創建可靠的鏈接。一個TCP
鏈接必需要通過三次「對話」才能創建起來
UDP
(User Data Protocol,用戶數據報協議)是與TCP相對應的協議。它是面向非鏈接的協議,它不與對方創建鏈接,而是直接就把數據包發送過去! UDP適用於一次只傳送少許數據、對可靠性要求不高的應用環境。
說說你對做用域鏈的理解
做用域鏈的做用是保證執行環境裏有權訪問的變量和函數是有序的,做用域鏈的變量只能向上訪問,變量訪問到window
對象即被終止,做用域鏈向下訪問變量是不被容許的。
建立ajax過程
1
2
3
4
5
6
7
8
9
10
11
|
(
1
)建立
XMLHttpRequest對象
,也就是建立一個異步調用對象
.
(
2
)建立一個新的
HTTP請求
,並指定該
HTTP請求的方法、
URL及驗證信息
.
(
3
)設置響應
HTTP請求狀態變化的函數
.
(
4
)發送
HTTP請求
.
(
5
)獲取異步調用返回的數據
.
(
6
)使用
JavaScript和
DOM實現局部刷新
.
|
漸進加強和優雅降級
漸進加強 :針對低版本瀏覽器進行構建頁面,保證最基本的功能,而後再針對高級瀏覽器進行效果、交互等改進和追加功能達到更好的用戶體驗。
優雅降級 :一開始就構建完整的功能,而後再針對低版本瀏覽器進行兼容。
常見web安全及防禦原理
sql注入原理
就是經過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。
總的來講有如下幾點:
1
2
3
4
5
6
7
|
1.永遠不要信任用戶的輸入,要對用戶的輸入進行校驗,能夠經過正則表達式,或限制長度,對單引號和雙
"-"進行轉換等。
2.永遠不要使用動態拼裝
SQL,可使用參數化的
SQL或者直接使用存儲過程進行數據查詢存取。
3.永遠不要使用管理員權限的數據庫鏈接,爲每一個應用使用單獨的權限有限的數據庫鏈接。
4.不要把機密信息明文存放,請加密或者
hash掉密碼和敏感的信息。
|
XSS原理及防範
Xss(cross-site scripting)攻擊指的是攻擊者往Web頁面裏插入惡意 html
標籤或者javascript
代碼。好比:攻擊者在論壇中放一個
看似安全的連接,騙取用戶點擊後,竊取cookie
中的用戶私密信息;或者攻擊者在論壇中加一個惡意表單,
當用戶提交表單的時候,卻把信息傳送到攻擊者的服務器中,而不是用戶本來覺得的信任站點。
XSS防範方法
首先代碼裏對用戶輸入的地方和變量都須要仔細檢查長度和對」<」,」>」,」;」,」’」
等字符作過濾;其次任何內容寫到頁面以前都必須加以encode
,避免不當心把html tag
弄出來。這一個層面作好,至少能夠堵住超過一半的XSS
攻擊。
首先,避免直接在cookie
中泄露用戶隱私,例如email、密碼等等。
其次,經過使cookie
和系統ip
綁定來下降cookie
泄露後的危險。這樣攻擊者獲得的cookie
沒有實際價值,不可能拿來重放。
若是網站不須要再瀏覽器端對cookie
進行操做,能夠在Set-Cookie
末尾加上HttpOnly
來防止javascript
代碼直接獲取cookie
。
儘可能採用POST
而非GET
提交表單
XSS與CSRF有什麼區別嗎?
XSS
是獲取信息,不須要提早知道其餘用戶頁面的代碼和數據包。CSRF
是代替用戶完成指定的動做,須要知道其餘用戶頁面的代碼和數據包。
要完成一次CSRF
攻擊,受害者必須依次完成兩個步驟:
1
2
3
|
登陸受信任網站
A,並在本地生成
Cookie。
在不登出
A的狀況下,訪問危險網站
B。
|
CSRF的防護
- 服務端的
CSRF
方式方法不少樣,但總的思想都是一致的,就是在客戶端頁面增長僞隨機數。 - 經過驗證碼的方法
Web Worker 和webSocket
worker主線程:
1
2
3
4
5
6
7
|
1.經過
worker
=
new
Worker
(
url
)加載一個
JS文件來建立一個
worker,同時返回一個
worker實例。
2.經過
worker
.
postMessage
(
data
)方法來向
worker發送數據。
3.綁定
worker
.
onmessage方法來接收
worker發送過來的數據。
4.可使用
worker
.
terminate
(
)來終止一個
worker的執行。
|
WebSocket
是Web
應用程序的傳輸協議,它提供了雙向的,按序到達的數據流。他是一個HTML5
協議,WebSocket
的鏈接是持久的,他經過在客戶端和服務器之間保持雙工鏈接,服務器的更新能夠被及時推送給客戶端,而不須要客戶端以必定時間間隔去輪詢。
HTTP和HTTPS
HTTP
協議一般承載於TCP協議之上,在HTTP
和TCP
之間添加一個安全協議層(SSL
或TSL
),這個時候,就成了咱們常說的HTTPS。
默認HTTP的端口號爲80,HTTPS
的端口號爲443。
爲何HTTPS
安全
由於網絡請求須要中間有不少的服務器路由器的轉發。中間的節點均可能篡改信息,而若是使用HTTPS
,密鑰在你和終點站纔有。https
之因此比http
安全,是由於他利用ssl/tls
協議傳輸。它包含證書,卸載,流量轉發,負載均衡,頁面適配,瀏覽器適配,refer傳遞等。保障了傳輸過程的安全性
對前端模塊化的認識
AMD 是
RequireJS
在推廣過程當中對模塊定義的規範化產出。CMD 是
SeaJS
在推廣過程當中對模塊定義的規範化產出。
AMD
是提早執行,CMD
是延遲執行。
AMD
推薦的風格經過返回一個對象作爲模塊對象,CommonJS
的風格經過對module.exports
或exports
的屬性賦值來達到暴露模塊對象的目的。
CMD模塊方式
1
2
3
4
5
|
define
(
function
(
require
,
exports
,
module
)
{
// 模塊代碼
}
)
;
|
Javascript垃圾回收方法
標記清除(mark and sweep)
這是JavaScript最多見的垃圾回收方式,當變量進入執行環境的時候,好比函數中聲明一個變量,垃圾回收器將其標記爲「進入環境」,當變量離開環境的時候(函數執行結束)將其標記爲「離開環境」。
垃圾回收器會在運行的時候給存儲在內存中的全部變量加上標記,而後去掉環境中的變量以及被環境中變量所引用的變量(閉包),在這些完成以後仍存在標記的就是要刪除的變量了
引用計數(reference counting)
在低版本IE中常常會出現內存泄露,不少時候就是由於其採用引用計數方式進行垃圾回收。引用計數的策略是跟蹤記錄每一個值被使用的次數,當聲明瞭一個 變量並將一個引用類型賦值給該變量的時候這個值的引用次數就加1,若是該變量的值變成了另一個,則這個值得引用次數減1,當這個值的引用次數變爲0的時 候,說明沒有變量在使用,這個值無法被訪問了,所以能夠將其佔用的空間回收,這樣垃圾回收器會在運行的時候清理掉引用次數爲0的值佔用的空間。
在IE中雖然JavaScript
對象經過標記清除的方式進行垃圾回收,但BOM與DOM對象倒是經過引用計數回收垃圾的, 也就是說只要涉及BOM
及DOM就會出現循環引用問題。
你以爲前端工程的價值體如今哪
1
2
3
4
5
6
7
8
9
|
爲簡化用戶使用提供技術支持(交互部分)
爲多個瀏覽器兼容性提供支持
爲提升用戶瀏覽速度(瀏覽器性能)提供支持
爲跨平臺或者其餘基於
webkit或其餘渲染引擎的應用提供支持
爲展現數據提供支持(數據接口)
|
談談性能優化問題
代碼層面:避免使用css表達式,避免使用高級選擇器,通配選擇器。
緩存利用:緩存Ajax,使用CDN,使用外部js和css文件以便緩存,添加Expires頭,服務端配置Etag,減小DNS查找等
請求數量:合併樣式和腳本,使用css圖片精靈,初始首屏以外的圖片資源按需加載,靜態資源延遲加載。
請求帶寬:壓縮文件,開啓GZIP,
代碼層面的優化
- 用
hash-table
來優化查找 - 少用全局變量
- 用
innerHTML
代替DOM
操做,減小DOM
操做次數,優化javascript
性能 - 用
setTimeout
來避免頁面失去響應 - 緩存DOM節點查找的結果
- 避免使用CSS Expression
- 避免全局查詢
- 避免使用with(with會建立本身的做用域,會增長做用域鏈長度)
- 多個變量聲明合併
- 避免圖片和iFrame等的空Src。空Src會從新加載當前頁面,影響速度和效率
- 儘可能避免寫在HTML標籤中寫Style屬性
移動端性能優化
- 儘可能使用css3動畫,開啓硬件加速。
- 適當使用
touch
事件代替click
事件。 - 避免使用
css3
漸變陰影效果。 - 能夠用
transform: translateZ(0)
來開啓硬件加速。 - 不濫用Float。Float在渲染時計算量比較大,儘可能減小使用
- 不濫用Web字體。Web字體須要下載,解析,重繪當前頁面,儘可能減小使用。
- 合理使用requestAnimationFrame動畫代替setTimeout
- CSS中的屬性(CSS3 transitions、CSS3 3D transforms、Opacity、Canvas、WebGL、Video)會觸發GPU渲染,請合理使用。過渡使用會引起手機過耗電增長
- PC端的在移動端一樣適用
相關閱讀:如何作到一秒渲染一個移動頁面
什麼是Etag?
當發送一個服務器請求時,瀏覽器首先會進行緩存過時判斷。瀏覽器根據緩存過時時間判斷緩存文件是否過時。
情景一:若沒有過時,則不向服務器發送請求,直接使用緩存中的結果,此時咱們在瀏覽器控制檯中能夠看到 200 OK
(from cache) ,此時的狀況就是徹底使用緩存,瀏覽器和服務器沒有任何交互的。
情景二:若已過時,則向服務器發送請求,此時請求中會帶上①中設置的文件修改時間,和Etag
而後,進行資源更新判斷。服務器根據瀏覽器傳過來的文件修改時間,判斷自瀏覽器上一次請求以後,文件是否是沒有被修改過;根據Etag
,判斷文件內容自上一次請求以後,有沒有發生變化
情形一:若兩種判斷的結論都是文件沒有被修改過,則服務器就不給瀏覽器發index.html
的內容了,直接告訴它,文件沒有被修改過,你用你那邊的緩存吧—— 304 Not Modified
,此時瀏覽器就會從本地緩存中獲取index.html
的內容。此時的狀況叫協議緩存,瀏覽器和服務器之間有一次請求交互。
情形二:若修改時間和文件內容判斷有任意一個沒有經過,則服務器會受理這次請求,以後的操做同①
① 只有get請求會被緩存,post請求不會
Expires和Cache-Control
Expires
要求客戶端和服務端的時鐘嚴格同步。HTTP1.1
引入Cache-Control
來克服Expires頭的限制。若是max-age和Expires同時出現,則max-age有更高的優先級。
1
2
3
4
5
6
7
8
9
|
Cache
-
Control
:
no
-
cache
,
private
,
max
-
age
=
0
ETag:
abcde
Expires
:
Thu
,
15
Apr
2014
20
:
00
:
00
GMT
Pragma
:
private
Last
-
Modified
:
$
now
// RFC1123 format
|
ETag應用:
Etag
由服務器端生成,客戶端經過If-Match
或者說If-None-Match
這個條件判斷請求來驗證資源是否修改。常見的是使用If-None-Match
。請求一個文件的流程可能以下:
====第一次請求===
1
2
3
|
1.客戶端發起
HTTP
GET請求一個文件;
2.服務器處理請求,返回文件內容和一堆
Header,固然包括
Etag
(例如
"2e681a-6-5d044840"
)
(假設服務器支持
Etag生成和已經開啓了
Etag
)
.狀態碼
200
|
====第二次請求===
1
|
客戶端發起
HTTP
GET請求一個文件,注意這個時候客戶端同時發送一個
If
-
None
-
Match頭,這個頭的內容就是第一次請求時服務器返回的
Etag:
2e681a
-
6
-
5d0448402.服務器判斷髮送過來的
Etag和計算出來的
Etag匹配,所以
If
-
None
-
Match爲
False,不返回
200,返回
304,客戶端繼續使用本地緩存;流程很簡單,問題是,若是服務器又設置了
Cache
-
Control
:
max
-
age和
Expires呢,怎麼辦
|
答案是同時使用,也就是說在徹底匹配If-Modified-Since
和If-None-Match
即檢查完修改時間和Etag
以後,
服務器才能返回304.(不要陷入到底使用誰的問題怪圈)
爲何使用Etag請求頭?
Etag 主要爲了解決 Last-Modified
沒法解決的一些問題。
棧和隊列的區別?
1
2
3
4
5
|
棧的插入和刪除操做都是在一端進行的,而隊列的操做倒是在兩端進行的。
隊列先進先出,棧先進後出。
棧只容許在表尾一端進行插入和刪除,而隊列只容許在表尾一端進行插入,在表頭一端進行刪除
|
棧和堆的區別?
1
2
3
4
5
6
7
|
棧區(
stack)—
由編譯器自動分配釋放
,存放函數的參數值,局部變量的值等。
堆區(
heap)
—
通常由程序員分配釋放,
若程序員不釋放,程序結束時可能由
OS回收。
堆(數據結構):堆能夠被當作是一棵樹,如:堆排序;
棧(數據結構):一種先進後出的數據結構。
|
快速 排序的思想並實現一個快排?
「快速排序」的思想很簡單,整個排序過程只須要三步:
(1)在數據集之中,找一個基準點
(2)創建兩個數組,分別存儲左邊和右邊的數組
(3)利用遞歸進行下次比較
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
<script
type
=
"text/javascript"
>
function
quickSort
(
arr
)
{
if
(
arr
.
length
<=
1
)
{
return
arr
;
//若是數組只有一個數,就直接返回;
}
var
num
=
Math
.
floor
(
arr
.
length
/
2
)
;
//找到中間數的索引值,若是是浮點數,則向下取整
var
numValue
=
arr
.
splice
(
num
,
1
)
;
//找到中間數的值
var
left
=
[
]
;
var
right
=
[
]
;
for
(
var
i
=
0
;
i
<
arr
.
length
;
i
++
)
{
if
(
arr
[
i
]
<
numValue
)
{
left
.
push
(
arr
[
i
]
)
;
//基準點的左邊的數傳到左邊數組
}
else
{
right
.
push
(
arr
[
i
]
)
;
//基準點的右邊的數傳到右邊數組
}
}
return
quickSort
(
left
)
.
concat
(
[
numValue
]
,
quickSort
(
right
)
)
;
//遞歸不斷重複比較
}
alert
(
quickSort
(
[
32
,
45
,
37
,
16
,
2
,
87
]
)
)
;
//彈出「2,16,32,37,45,87」
</script>
|
你以爲jQuery或zepto源碼有哪些寫的好的地方
(答案僅供參考)
jquery
源碼封裝在一個匿名函數的自執行環境中,有助於防止變量的全局污染,而後經過傳入window對象參數,可使window對象做爲局部變量使用,好處是當jquery
中訪問window對象的時候,就不用將做用域鏈退回到頂層做用域了,從而能夠更快的訪問window
對象。一樣,傳入undefined
參數,能夠縮短查找undefined時的做用域鏈。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
(
function
(
window
,
undefined
)
{
//用一個函數域包起來,就是所謂的沙箱
//在這裏邊var定義的變量,屬於這個函數域內的局部變量,避免污染全局
//把當前沙箱須要的外部變量經過函數參數引入進來
//只要保證參數對內提供的接口的一致性,你還能夠隨意替換傳進來的這個參數
window
.
jQuery
=
window
.
$
=
jQuery
;
}
)
(
window
)
;
|
jquery將一些原型屬性和方法封裝在了jquery.prototype
中,爲了縮短名稱,又賦值給了jquery.fn
,這是很形象的寫法。
有一些數組或對象的方法常常能使用到,jQuery將其保存爲局部變量以提升訪問速度。
jquery
實現的鏈式調用能夠節約代碼,所返回的都是同一個對象,能夠提升代碼效率。
ES6的瞭解
新增模板字符串(爲JavaScript提供了簡單的字符串插值功能)、箭頭函數(操做符左邊爲輸入的參數,而右邊則是進行的操做以及返回的值Inputs=>outputs
。)、for-of
(用來遍歷數據—例如數組中的值。)arguments
對象可被不定參數和默認參數完美代替。ES6
將promise
對象歸入規範,提供了原生的Promise
對象。增長了let
和const
命令,用來聲明變量。增長了塊級做用域。let命令實際上就增長了塊級做用域。ES6規定,var
命令和function
命令聲明的全局變量,屬於全局對象的屬性;let
命令、const
命令、class
命令聲明的全局變量,不屬於全局對象的屬性。。還有就是引入module
模塊的概念
js繼承方式及其優缺點
原型鏈繼承的缺點
1
|
一是字面量重寫原型會中斷關係,使用引用類型的原型,而且子類型還沒法給超類型傳遞參數。
|
借用構造函數(類式繼承)
1
|
借用構造函數雖然解決了剛纔兩種問題,但沒有原型,則複用無從談起。因此咱們須要原型鏈
+借用構造函數的模式,這種模式稱爲組合繼承
|
組合式繼承
1
|
組合式繼承是比較經常使用的一種繼承方法,其背後的思路是使用原型鏈實現對原型屬性和方法的繼承,而經過借用構造函數來實現對實例屬性的繼承。這樣,既經過在原型上定義方法實現了函數複用,又保證每一個實例都有它本身的屬性。
|
具體請看:JavaScript繼承方式詳解
關於Http 2.0 你知道多少?
HTTP/2
引入了「服務端推(server push)」的概念,它容許服務端在客戶端須要數據以前就主動地將數據發送到客戶端緩存中,從而提升性能。
HTTP/2
提供更多的加密支持
HTTP/2
使用多路技術,容許多個消息在一個鏈接上同時交差。
它增長了頭壓縮(header compression),所以即便很是小的請求,其請求和響應的header
都只會佔用很小比例的帶寬。
defer和async
defer並行加載js文件,會按照頁面上script標籤的順序執行 async並行加載js文件,下載完成當即執行,不會按照頁面上script標籤的順序執行
談談浮動和清除浮動
浮動的框能夠向左或向右移動,直到他的外邊緣碰到包含框或另外一個浮動框的邊框爲止。因爲浮動框不在文檔的普通流中,因此文檔的普通流的塊框表現得就像浮動框不存在同樣。浮動的塊框會漂浮在文檔普通流的塊框上。
如何評價AngularJS和BackboneJS
backbone
具備依賴性,依賴underscore.js
。Backbone + Underscore + jQuery(or Zepto)
就比一個AngularJS
多出了2 次HTTP請求.
Backbone
的Model
沒有與UI視圖數據綁定,而是須要在View中自行操做DOM來更新或讀取UI數據。AngularJS
與此相反,Model直接與UI視圖綁定,Model
與UI視圖的關係,經過directive
封裝,AngularJS
內置的通用directive
,就能實現大部分操做了,也就是說,基本沒必要關心Model
與UI視圖的關係,直接操做Model就好了,UI視圖自動更新。
AngularJS
的directive
,你輸入特定數據,他就能輸出相應UI視圖。是一個比較完善的前端MVW框架,包含模板,數據雙向綁定,路由,模塊化,服務,依賴注入等全部功能,模板功能強大豐富,而且是聲明式的,自帶了豐富的 Angular 指令。
用過哪些設計模式?
工廠模式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
主要好處就是能夠消除對象間的耦合,經過使用工程方法而不是
new關鍵字。將全部實例化的代碼集中在一個位置防止代碼重複。
工廠模式解決了重複實例化的問題,但還有一個問題
,那就是識別問題,由於根本沒法搞清楚他們究竟是哪一個對象的實例。
function
createObject
(
name
,
age
,
profession
)
{
//集中實例化的函數var obj = new Object();
obj
.
name
=
name
;
obj
.
age
=
age
;
obj
.
profession
=
profession
;
obj
.
move
=
function
(
)
{
return
this
.
name
+
' at '
+
this
.
age
+
' engaged in '
+
this
.
profession
;
}
;
return
obj
;
}
var
test1
=
createObject
(
'trigkit4'
,
22
,
'programmer'
)
;
//第一個實例var test2 = createObject('mike',25,'engineer');//第二個實例
|
構造函數模式
使用構造函數的方法 ,即解決了重複實例化的問題 ,又解決了對象識別的問題,該模式與工廠模式的不一樣之處在於:
1
2
3
4
5
|
1.構造函數方法沒有顯示的建立對象
(
new
Object
(
)
)
;
2.直接將屬性和方法賦值給
this對象
;
3.沒有
renturn語句。
|
說說你對閉包的理解
使用閉包主要是爲了設計私有的方法和變量。閉包的優勢是能夠避免全局變量的污染,缺點是閉包會常駐內存,會增大內存使用量,使用不當很容易形成內存泄露。在js中,函數即閉包,只有函數纔會產生做用域的概念
閉包有三個特性:
1.函數嵌套函數
2.函數內部能夠引用外部的參數和變量
3.參數和變量不會被垃圾回收機制回收
具體請看:詳解js閉包
請你談談Cookie的弊端
cookie
雖然在持久保存客戶端數據提供了方便,分擔了服務器存儲的負擔,但仍是有不少侷限性的。
第一:每一個特定的域名下最多生成20個cookie
1
2
3
4
5
6
7
|
1.IE6或更低版本最多
20個
cookie
2.IE7和以後的版本最後能夠有
50個
cookie。
3.Firefox最多
50個
cookie
4.chrome和
Safari沒有作硬性限制
|
IE
和Opera
會清理近期最少使用的cookie
,Firefox
會隨機清理cookie
。
cookie
的最大大約爲4096
字節,爲了兼容性,通常不能超過4095
字節。
IE 提供了一種存儲能夠持久化用戶數據,叫作userdata
,從IE5.0
就開始支持。每一個數據最多128K,每一個域名下最多1M。這個持久化數據放在緩存中,若是緩存沒有清理,那麼會一直存在。
優勢:極高的擴展性和可用性
1
2
3
4
5
6
7
|
1.經過良好的編程,控制保存在
cookie中的
session對象的大小。
2.經過加密和安全傳輸技術(
SSL),減小
cookie被破解的可能性。
3.只在
cookie中存放不敏感數據,即便被盜也不會有重大損失。
4.控制
cookie的生命期,使之不會永遠有效。偷盜者極可能拿到一個過時的
cookie。
|
缺點:
1
2
3
4
5
|
1.
`
Cookie
`數量和長度的限制。每一個
domain最多隻能有
20條
cookie,每一個
cookie長度不能超過
4KB,不然會被截掉
.
2.安全性問題。若是
cookie被人攔截了,那人就能夠取得全部的
session信息。即便加密也與事無補,由於攔截者並不須要知道
cookie的意義,他只要原樣轉發
cookie就能夠達到目的了。
3.有些狀態不可能保存在客戶端。例如,爲了防止重複提交表單,咱們須要在服務器端保存一個計數器。若是咱們把這個計數器保存在客戶端,那麼它起不到任何做用。
|
瀏覽器本地存儲
在較高版本的瀏覽器中,js
提供了sessionStorage
和globalStorage
。在HTML5
中提供了localStorage
來取代globalStorage
。
html5
中的Web Storage
包括了兩種存儲方式:sessionStorage
和localStorage
。
sessionStorage
用於本地存儲一個會話(session)中的數據,這些數據只有在同一個會話中的頁面才能訪問而且當會話結束後數據也隨之銷燬。所以sessionStorage
不是一種持久化的本地存儲,僅僅是會話級別的存儲。
而localStorage
用於持久化的本地存儲,除非主動刪除數據,不然數據是永遠不會過時的。
web storage和cookie的區別
Web Storage
的概念和cookie
類似,區別是它是爲了更大容量存儲設計的。Cookie
的大小是受限的,而且每次你請求一個新的頁面的時候Cookie
都會被髮送過去,這樣無形中浪費了帶寬,另外cookie
還須要指定做用域,不能夠跨域調用。
除此以外,Web Storage
擁有setItem,getItem,removeItem,clear
等方法,不像cookie
須要前端開發者本身封裝setCookie,getCookie
。
可是cookie
也是不能夠或缺的:cookie
的做用是與服務器進行交互,做爲HTTP
規範的一部分而存在 ,而Web Storage
僅僅是爲了在本地「存儲」數據而生
瀏覽器的支持除了IE7
及如下不支持外,其餘標準瀏覽器都徹底支持(ie及FF需在web服務器裏運行),值得一提的是IE老是辦好事,例如IE七、IE6中的userData
其實就是javascript
本地存儲的解決方案。經過簡單的代碼封裝能夠統一到全部的瀏覽器都支持web storage
。
localStorage
和sessionStorage
都具備相同的操做方法,例如setItem、getItem
和removeItem
等
cookie 和session 的區別:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
1、
cookie數據存放在客戶的瀏覽器上,
session數據放在服務器上。
2、
cookie不是很安全,別人能夠分析存放在本地的
COOKIE並進行
COOKIE欺騙
考慮到安全應當使用
session。
3、
session會在必定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能
考慮到減輕服務器性能方面,應當使用
COOKIE。
4、單個
cookie保存的數據不能超過
4K,不少瀏覽器都限制一個站點最多保存
20個
cookie。
5、因此我的建議:
將登錄信息等重要信息存放爲
SESSION
其餘信息若是須要保留,能夠放在
COOKIE中
|
display:none
和visibility:hidden
的區別?
1
2
3
|
display
:
none
隱藏對應的元素,在文檔佈局中再也不給它分配空間,它各邊的元素會合攏,就當他歷來不存在。
visibility
:
hidden
隱藏對應的元素,可是在文檔佈局中仍保留原來的空間。
|
CSS中
link
和@import
的區別是?
1
2
3
4
5
6
7
|
(
1
)
link屬於
HTML標籤,而
@
import是
CSS提供的
;
(
2
)頁面被加載的時,
link會同時被加載,而
@
import被引用的
CSS會等到引用它的
CSS文件被加載完再加載
;
(
3
)
import只在
IE5以上才能識別,而
link是
HTML標籤,無兼容問題
;
(
4
)
link方式的樣式的權重高於
@
import的權重
.
|
position:absolute
和float
屬性的異同
- 共同點:對內聯元素設置
float
和absolute
屬性,可讓元素脫離文檔流,而且能夠設置其寬高。 - 不一樣點:
float
仍會佔據位置,absolute
會覆蓋文檔流中的其餘元素。
介紹一下box-sizing屬性?
box-sizing
屬性主要用來控制元素的盒模型的解析模式。默認值是content-box
。
content-box
:讓元素維持W3C的標準盒模型。元素的寬度/高度由border + padding + content
的寬度/高度決定,設置width/height
屬性指的是content
部分的寬/高border-box
:讓元素維持IE傳統盒模型(IE6如下版本和IE6~7的怪異模式)。設置width/height
屬性指的是border + padding + content
標準瀏覽器下,按照W3C規範對盒模型解析,一旦修改了元素的邊框或內距,就會影響元素的盒子尺寸,就不得不從新計算元素的盒子尺寸,從而影響整個頁面的佈局。
CSS 選擇符有哪些?哪些屬性能夠繼承?優先級算法如何計算? CSS3新增僞類有那些?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
1.id選擇器(
#
myid)
2.類選擇器(
.
myclassname)
3.標籤選擇器(
div
,
h1
,
p)
4.相鄰選擇器(
h1
+
p)
5.子選擇器(
ul
>
li)
6.後代選擇器(
li
a)
7.通配符選擇器(
*)
8.屬性選擇器(
a
[
rel
=
"external"
])
9.僞類選擇器(
a
:
hover
,
li
:
nth
-
child)
|
優先級爲:
!important > id > class > tag
important
比 內聯優先級高,但內聯比 id
要高
CSS3新增僞類舉例:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
p
:
first
-
of
-
type選擇屬於其父元素的首個
<
p
>元素的每一個
<
p
>元素。
p
:
last
-
of
-
type
選擇屬於其父元素的最後
<
p
>元素的每一個
<
p
>元素。
p
:
only
-
of
-
type
選擇屬於其父元素惟一的
<
p
>元素的每一個
<
p
>元素。
p
:
only
-
child
選擇屬於其父元素的惟一子元素的每一個
<
p
>元素。
p
:
nth
-
child
(
2
)
選擇屬於其父元素的第二個子元素的每一個
<
p
>元素。
:
enabled
:
disabled控制表單控件的禁用狀態。
:
checked
單選框或複選框被選中。
|
CSS3有哪些新特性?
1
2
3
4
5
6
7
8
9
10
11
12
13
|
CSS3實現圓角(
border
-
radius),陰影(
box
-
shadow),
對文字加特效(
text
-
shadow、),線性漸變(
gradient),旋轉(
transform)
transform
:
rotate
(
9deg
)
scale
(
0.85
,
0.90
)
translate
(
0px
,
-
30px
)
skew
(
-
9deg
,
0deg
)
;
//旋轉,縮放,定位,傾斜
增長了更多的
CSS選擇器
多背景
rgba
在
CSS3中惟一引入的僞元素是
::
selection
.
媒體查詢,多欄佈局
border
-
image
|
CSS3中新增了一種盒模型計算方式:box-sizing
。盒模型默認的值是content-box
, 新增的值是padding-box
和border-box
,幾種盒模型計算元素寬高的區別以下:
content-box(默認)
佈局所佔寬度Width:
1
|
Width
=
width
+
padding
-
left
+
padding
-
right
+
border
-
left
+
border
-
right
|
佈局所佔高度Height:
1
|
Height
=
height
+
padding
-
top
+
padding
-
bottom
+
border
-
top
+
border
-
bottom
|
padding-box
佈局所佔寬度Width:
1
|
Width
=
width
(包含
padding
-
left
+
padding
-
right
)
+
border
-
top
+
border
-
bottom
|
佈局所佔高度Height:
1
|
Height
=
height
(包含
padding
-
top
+
padding
-
bottom
)
+
border
-
top
+
border
-
bottom
|
border-box
佈局所佔寬度Width:
1
|
Width
=
width
(包含
padding
-
left
+
padding
-
right
+
border
-
left
+
border
-
right
)
|
佈局所佔高度Height:
1
|
Height
=
height
(包含
padding
-
top
+
padding
-
bottom
+
border
-
top
+
border
-
bottom
)
|
對BFC規範的理解?
1
2
3
|
BFC,塊級格式化上下文,一個建立了新的
BFC的盒子是獨立佈局的,盒子裏面的子元素的樣式不會影響到外面的元素。在同一個
BFC中的兩個毗鄰的塊級盒在垂直方向(和佈局方向有關係)的
margin會發生摺疊。
(
W3C
CSS
2.1規範中的一個概念,它決定了元素如何對其內容進行佈局,以及與其餘元素的關係和相互做用。
|
說說你對語義化的理解?
1
2
3
4
5
6
7
|
1,去掉或者丟失樣式的時候可以讓頁面呈現出清晰的結構
2,有利於
SEO:和搜索引擎創建良好溝通,有助於爬蟲抓取更多的有效信息:爬蟲依賴於標籤來肯定上下文和各個關鍵字的權重;
3,方便其餘設備解析(如屏幕閱讀器、盲人閱讀器、移動設備)以意義的方式來渲染網頁;
4,便於團隊開發和維護,語義化更具可讀性,是下一步吧網頁的重要動向,遵循
W3C標準的團隊都遵循這個標準,能夠減小差別化。
|
Doctype做用? 嚴格模式與混雜模式如何區分?它們有何意義?
1)、<!DOCTYPE>
聲明位於文檔中的最前面,處於 <html>
標籤以前。告知瀏覽器以何種模式來渲染文檔。
2)、嚴格模式的排版和 JS
運做模式是 以該瀏覽器支持的最高標準運行。
3)、在混雜模式中,頁面以寬鬆的向後兼容的方式顯示。模擬老式瀏覽器的行爲以防止站點沒法工做。
4)、DOCTYPE
不存在或格式不正確會致使文檔以混雜模式呈現。
你知道多少種Doctype
文檔類型?
1
2
3
4
5
6
7
8
9
|
該標籤可聲明三種
DTD類型,分別表示嚴格版本、過渡版本以及基於框架的
HTML文檔。
HTML
4.01規定了三種文檔類型:
Strict、
Transitional以及
Frameset。
XHTML
1.0規定了三種
XML文檔類型:
Strict、
Transitional以及
Frameset。
Standards(標準)模式(也就是嚴格呈現模式)用於呈現遵循最新標準的網頁,而
Quirks
(包容)模式(也就是鬆散呈現模式或者兼容模式)用於呈現爲傳統瀏覽器而設計的網頁。
|
HTML與XHTML——兩者有什麼區別
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
區別:
1.全部的標記都必需要有一個相應的結束標記
2.全部標籤的元素和屬性的名字都必須使用小寫
3.全部的
XML標記都必須合理嵌套
4.全部的屬性必須用引號
""括起來
5.把全部
<和
&特殊符號用編碼表示
6.給全部屬性賦一個值
7.不要在註釋內容中使「
--」
8.圖片必須有說明文字
|
常見兼容性問題?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
png24位的圖片在
iE6瀏覽器上出現背景,解決方案是作成
PNG8
.也能夠引用一段腳本處理
.
瀏覽器默認的
margin和
padding不一樣。解決方案是加一個全局的
*
{
margin
:
0
;
padding
:
0
;
}來統一。
IE6雙邊距
bug
:塊屬性標籤
float後,又有橫行的
margin狀況下,在
ie6顯示
margin比設置的大。
浮動
ie產生的雙倍距離(
IE6雙邊距問題:在
IE6下,若是對元素設置了浮動,同時又設置了
margin
-
left或
margin
-
right,
margin值會加倍。)
#
box
{
float
:
left
;
width
:
10px
;
margin
:
0
0
0
100px
;
}
這種狀況之下
IE會產生
20px的距離,解決方案是在
float的標籤樣式控制中加入
_display
:
inline
;將其轉化爲行內屬性。
(
_這個符號只有
ie6會識別
)
漸進識別的方式,從整體中逐漸排除局部。
首先,巧妙的使用「
\
9」這一標記,將
IE遊覽器從全部狀況中分離出來。
接着,再次使用「
+」將
IE8和
IE7、
IE6分離開來,這樣
IE8已經獨立識別。
css
.
bb
{
background
-
color
:
#
f1ee18
;
|