本文旨在加深對前端知識點的理解,資料來源於網絡,由本人(博客:http://segmentfault.com/u/trigkit4) 收集整理。javascript
1.自我介紹:除了基本我的信息之外,面試官更想聽的是你不同凡響的地方和你的優點。 2.項目介紹 3.如何看待前端開發? 4.平時是如何學習前端開發的? 5.將來三年的規劃是怎樣的?
absolute
:生成絕對定位的元素, 相對於最近一級的 定位不是 static 的父元素來進行定位。php
fixed
(老IE不支持)生成絕對定位的元素,相對於瀏覽器窗口進行定位。css
relative
生成相對定位的元素,相對於其在普通流中的位置進行定位。html
static
默認值。沒有定位,元素出如今正常的流中前端
原理是:動態插入script
標籤,經過script
標籤引入一個js
文件,這個js文件載入成功後會執行咱們在url參數中指定的函數,而且會把咱們須要的json
數據做爲參數傳入。html5
因爲同源策略的限制,XmlHttpRequest
只容許請求當前源(域名、協議、端口)的資源,爲了實現跨域請求,能夠經過script
標籤實現跨域請求,而後在服務端輸出JSON數據並執行回調函數,從而解決了跨域的數據請求。java
優勢是兼容性好,簡單易用,支持瀏覽器與服務器雙向通訊。缺點是隻支持GET請求。jquery
JSONP
:json+padding
(內填充),顧名思義,就是把JSON填充到一個盒子裏webpack
<script>functioncreateJs(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' }); functionbox(json){ alert(json.name); } </script>
服務器端對於CORS
的支持,主要就是經過設置Access-Control-Allow-Origin
來進行的。若是瀏覽器檢測到相應的設置,就能夠容許Ajax
進行跨域的訪問。css3
將子域和主域的document.domain
設爲同一個主域.前提條件:這兩個域名必須屬於同一個基礎域名!並且所用的協議,端口都要一致,不然沒法利用document.domain
進行跨域
主域相同的使用document.domain
window
對象有個name
屬性,該屬性有個特徵:即在一個窗口(window)的生命週期內,窗口載入的全部的頁面都是共享一個window.name
的,每一個頁面對window.name
都有讀寫的權限,window.name
是持久存在一個窗口載入過的全部頁面中的
window.postMessage
方法來跨域傳送數據還有flash、在服務器上設置代理頁面等跨域方式。我的認爲window.name
的方法既不復雜,也能兼容到幾乎全部瀏覽器,這真是極好的一種跨域方法。
XML
和JSON
的區別?(1).數據體積方面。 JSON相對於XML來說,數據的體積小,傳遞的速度更快些。 (2).數據交互方面。 JSON與JavaScript的交互更加方便,更容易解析處理,更好的數據交互。 (3).數據描述方面。 JSON對數據的描述性比XML較差。 (4).傳輸速度方面。 JSON的速度要遠遠快於XML。
WebPack
是一個模塊打包工具,你能夠使用WebPack
管理你的模塊依賴,並編繹輸出模塊們所需的靜態文件。它可以很好地管理、打包Web開發中所用到的HTML、Javascript、CSS
以及各類靜態文件(圖片、字體等),讓開發過程更加高效。對於不一樣類型的資源,webpack
有對應的模塊加載器。webpack
模塊打包器會分析模塊間的依賴關係,最後 生成了優化且合併後的靜態資源。
webpack
是增強版的Browserify
。
webpack
的兩大特點:
1.code splitting(能夠自動完成) 2.loader 能夠處理各類類型的靜態文件,而且支持串聯操做
require.js
的全部功能它都有。
編繹過程更快,由於require.js
會去處理不須要的文件
webpack
是以commonJS
的形式來書寫腳本滴,但對 AMD/CMD
的支持也很全面,方便舊項目進行代碼遷移。
webpack
具備requireJs
和browserify
的功能,但仍有不少本身的新特性:
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的標誌:SYN
和ACK
。
發送端首先發送一個帶SYN
標誌的數據包給對方。接收端收到後,回傳一個帶有SYN/ACK
標誌的數據包以示傳達確認信息。 最後,發送端再回傳一個帶ACK
標誌的數據包,表明「握手」結束。 若在握手過程當中某個階段莫名中斷,TCP
協議會再次以相同的順序發送相同的數據包。
斷開一個TCP鏈接則須要「四次握手」:
第一次揮手:主動關閉方發送一個FIN
,用來關閉主動方到被動關閉方的數據傳送,也就是主動關閉方告訴被動關閉方:我已經不 會再給你發數據了(固然,在fin包以前發送出去的數據,若是沒有收到對應的ack確認報文,主動關閉方依然會重發這些數據),可是,此時主動關閉方還可 以接受數據。
第二次揮手:被動關閉方收到FIN
包後,發送一個ACK
給對方,確認序號爲收到序號+1
(與SYN
相同,一個FIN
佔用一個序號)。
第三次揮手:被動關閉方發送一個FIN
,用來關閉被動關閉方到主動關閉方的數據傳送,也就是告訴主動關閉方,個人數據也發送完了,不會再給你發數據了。
第四次揮手:主動關閉方收到FIN
後,發送一個ACK
給被動關閉方,確認序號爲收到序號+1,至此,完成四次揮手。
TCP
(Transmission Control Protocol,傳輸控制協議)是基於鏈接的協議,也就是說,在正式收發數據前,必須和對方創建可靠的鏈接。一個TCP
鏈接必需要通過三次「對話」才能創建起來
UDP
(User Data Protocol,用戶數據報協議)是與TCP相對應的協議。它是面向非鏈接的協議,它不與對方創建鏈接,而是直接就把數據包發送過去! UDP適用於一次只傳送少許數據、對可靠性要求不高的應用環境。
做用域鏈的做用是保證執行環境裏有權訪問的變量和函數是有序的,做用域鏈的變量只能向上訪問,變量訪問到window
對象即被終止,做用域鏈向下訪問變量是不被容許的。
時間上:onmousemove事件觸發後,再觸發onmouseover事件。 按鈕上:不區分鼠標按鈕。 動做上:onmouseover只在剛進入區域時觸發,onmousemove除了剛進入區域觸發外,在區域內移動鼠標,也會觸發
(1)建立XMLHttpRequest對象,也就是建立一個異步調用對象. (2)建立一個新的HTTP請求,並指定該HTTP請求的方法、URL及驗證信息. (3)設置響應HTTP請求狀態變化的函數. (4)發送HTTP請求. (5)獲取異步調用返回的數據. (6)使用JavaScript和DOM實現局部刷新.
漸進加強 :針對低版本瀏覽器進行構建頁面,保證最基本的功能,而後再針對高級瀏覽器進行效果、交互等改進和追加功能達到更好的用戶體驗。
優雅降級 :一開始就構建完整的功能,而後再針對低版本瀏覽器進行兼容。
就是經過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。
總的來講有如下幾點:
1.永遠不要信任用戶的輸入,要對用戶的輸入進行校驗,能夠經過正則表達式,或限制長度,對單引號和雙"-"進行轉換等。 2.永遠不要使用動態拼裝SQL,能夠使用參數化的SQL或者直接使用存儲過程進行數據查詢存取。 3.永遠不要使用管理員權限的數據庫鏈接,爲每一個應用使用單獨的權限有限的數據庫鏈接。 4.不要把機密信息明文存放,請加密或者hash掉密碼和敏感的信息。
Xss(cross-site scripting)攻擊指的是攻擊者往Web頁面裏插入惡意 html
標籤或者javascript
代碼。好比:攻擊者在論壇中放一個
看似安全的連接,騙取用戶點擊後,竊取cookie
中的用戶私密信息;或者攻擊者在論壇中加一個惡意表單,
當用戶提交表單的時候,卻把信息傳送到攻擊者的服務器中,而不是用戶本來覺得的信任站點。
首先代碼裏對用戶輸入的地方和變量都須要仔細檢查長度和對」<」,」>」,」;」,」’」
等字符作過濾;其次任何內容寫到頁面以前都必須加以encode
,避免不當心把html tag
弄出來。這一個層面作好,至少能夠堵住超過一半的XSS
攻擊。
首先,避免直接在cookie
中泄露用戶隱私,例如email、密碼等等。
其次,經過使cookie
和系統ip
綁定來下降cookie
泄露後的危險。這樣攻擊者獲得的cookie
沒有實際價值,不可能拿來重放。
儘可能採用POST
而非GET
提交表單
XSS
是獲取信息,不須要提早知道其餘用戶頁面的代碼和數據包。CSRF
是代替用戶完成指定的動做,須要知道其餘用戶頁面的代碼和數據包。
要完成一次CSRF
攻擊,受害者必須依次完成兩個步驟:
登陸受信任網站A,並在本地生成Cookie。 在不登出A的狀況下,訪問危險網站B。
服務端的CSRF
方式方法不少樣,但總的思想都是一致的,就是在客戶端頁面增長僞隨機數。
經過驗證碼的方法
1.經過 worker =newWorker( url ) 加載一個JS文件來建立一個worker,同時返回一個worker實例。 2.經過worker.postMessage( data ) 方法來向worker發送數據。 3.綁定worker.onmessage方法來接收worker發送過來的數據。 4.能夠使用 worker.terminate() 來終止一個worker的執行。
WebSocket
是Web
應用程序的傳輸協議,它提供了雙向的,按序到達的數據流。他是一個HTML5
協議,WebSocket
的鏈接是持久的,他經過在客戶端和服務器之間保持雙工鏈接,服務器的更新能夠被及時推送給客戶端,而不須要客戶端以必定時間間隔去輪詢。
HTTP
協議一般承載於TCP協議之上,有時也承載於TLS
或SSL
協議層之上,這個時候,就成了咱們常說的HTTPS。
默認HTTP的端口號爲80,HTTPS
的端口號爲443。
HTTPS
安全由於網絡請求須要中間有不少的服務器路由器的轉發。中間的節點均可能篡改信息,而若是使用HTTPS
,密鑰在你和終點站纔有。https
之因此比http
安全,是由於他利用ssl/tls
協議傳輸。它包含證書,卸載,流量轉發,負載均衡,頁面適配,瀏覽器適配,refer傳遞等。保障了傳輸過程的安全性
AMD 是
RequireJS
在推廣過程當中對模塊定義的規範化產出。CMD 是
SeaJS
在推廣過程當中對模塊定義的規範化產出。
AMD
是提早執行,CMD
是延遲執行。
AMD
推薦的風格經過返回一個對象作爲模塊對象,CommonJS
的風格經過對module.exports
或exports
的屬性賦值來達到暴露模塊對象的目的。
CMD模塊方式
define(function(require, exports, module) { // 模塊代碼 });
這是JavaScript最多見的垃圾回收方式,當變量進入執行環境的時候,好比函數中聲明一個變量,垃圾回收器將其標記爲「進入環境」,當變量離開環境的時候(函數執行結束)將其標記爲「離開環境」。
垃圾回收器會在運行的時候給存儲在內存中的全部變量加上標記,而後去掉環境中的變量以及被環境中變量所引用的變量(閉包),在這些完成以後仍存在標記的就是要刪除的變量了
在低版本IE中常常會出現內存泄露,不少時候就是由於其採用引用計數方式進行垃圾回收。引用計數的策略是跟蹤記錄每一個值被使用的次數,當聲明瞭一個 變量並將一個引用類型賦值給該變量的時候這個值的引用次數就加1,若是該變量的值變成了另一個,則這個值得引用次數減1,當這個值的引用次數變爲0的時 候,說明沒有變量在使用,這個值無法被訪問了,所以能夠將其佔用的空間回收,這樣垃圾回收器會在運行的時候清理掉引用次數爲0的值佔用的空間。
在IE中雖然JavaScript
對象經過標記清除的方式進行垃圾回收,但BOM與DOM對象倒是經過引用計數回收垃圾的, 也就是說只要涉及BOM
及DOM就會出現循環引用問題。
爲簡化用戶使用提供技術支持(交互部分) 爲多個瀏覽器兼容性提供支持 爲提升用戶瀏覽速度(瀏覽器性能)提供支持 爲跨平臺或者其餘基於webkit或其餘渲染引擎的應用提供支持 爲展現數據提供支持(數據接口)
代碼層面:避免使用css表達式,避免使用高級選擇器,通配選擇器。
緩存利用:緩存Ajax,使用CDN,使用外部js和css文件以便緩存,添加Expires頭,服務端配置Etag,減小DNS查找等
請求數量:合併樣式和腳本,使用css圖片精靈,初始首屏以外的圖片資源按需加載,靜態資源延遲加載。
請求帶寬:壓縮文件,開啓GZIP,
代碼層面的優化
用hash-table
來優化查找
少用全局變量
用innerHTML
代替DOM
操做,減小DOM
操做次數,優化javascript
性能
用setTimeout
來避免頁面失去響應
緩存DOM節點查找的結果
避免使用CSS Expression
避免全局查詢
避免使用width(width會建立本身的做用域,會增長做用域鏈長度)
多個變量聲明合併
1.儘可能使用css3動畫,開啓硬件加速。適當使用touch
事件代替click
事件。避免使用css3
漸變陰影效果。
當發送一個服務器請求時,瀏覽器首先會進行緩存過時判斷。瀏覽器根據緩存過時時間判斷緩存文件是否過時。
情景一:若沒有過時,則不向服務器發送請求,直接使用緩存中的結果,此時咱們在瀏覽器控制檯中能夠看到 200 OK
(from cache) ,此時的狀況就是徹底使用緩存,瀏覽器和服務器沒有任何交互的。
情景二:若已過時,則向服務器發送請求,此時請求中會帶上①中設置的文件修改時間,和Etag
而後,進行資源更新判斷。服務器根據瀏覽器傳過來的文件修改時間,判斷自瀏覽器上一次請求以後,文件是否是沒有被修改過;根據Etag
,判斷文件內容自上一次請求以後,有沒有發生變化
情形一:若兩種判斷的結論都是文件沒有被修改過,則服務器就不給瀏覽器發index.html
的內容了,直接告訴它,文件沒有被修改過,你用你那邊的緩存吧—— 304 Not Modified
,此時瀏覽器就會從本地緩存中獲取index.html
的內容。此時的狀況叫協議緩存,瀏覽器和服務器之間有一次請求交互。
情形二:若修改時間和文件內容判斷有任意一個沒有經過,則服務器會受理這次請求,以後的操做同①
① 只有get請求會被緩存,post請求不會
Expires
要求客戶端和服務端的時鐘嚴格同步。HTTP1.1
引入Cache-Control
來克服Expires頭的限制。若是max-age和Expires同時出現,則max-age有更高的優先級。
Cache-Control: no-cache, private, max-age=0 ETag: abcde Expires: Thu, 15 Apr 201420:00:00GMT Pragma:private Last-Modified: $now // RFC1123 format
Etag
由服務器端生成,客戶端經過If-Match
或者說If-None-Match
這個條件判斷請求來驗證資源是否修改。常見的是使用If-None-Match
。請求一個文件的流程可能以下:
====第一次請求===
1.客戶端發起 HTTP GET 請求一個文件; 2.服務器處理請求,返回文件內容和一堆Header,固然包括Etag(例如"2e681a-6-5d044840")(假設服務器支持Etag生成和已經開啓了Etag).狀態碼200
====第二次請求===
客戶端發起 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
沒法解決的一些問題。
棧的插入和刪除操做都是在一端進行的,而隊列的操做倒是在兩端進行的。 隊列先進先出,棧先進後出。 棧只容許在表尾一端進行插入和刪除,而隊列只容許在表尾一端進行插入,在表頭一端進行刪除
棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。 堆區(heap) — 通常由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收。 堆(數據結構):堆能夠被當作是一棵樹,如:堆排序; 棧(數據結構):一種先進後出的數據結構。
"快速排序"的思想很簡單,整個排序過程只須要三步:
(1)在數據集之中,找一個基準點
(2)創建兩個數組,分別存儲左邊和右邊的數組
(3)利用遞歸進行下次比較
<script type="text/javascript">functionquickSort(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]);//基準點的右邊的數傳到右邊數組 } } returnquickSort(left).concat([numValue],quickSort(right));//遞歸不斷重複比較 } alert(quickSort([32,45,37,16,2,87]));//彈出「2,16,32,37,45,87」</script>
jquery
源碼封裝在一個匿名函數的自執行環境中,有助於防止變量的全局污染,而後經過傳入window對象參數,能夠使window對象做爲局部變量使用,好處是當jquery
中訪問window對象的時候,就不用將做用域鏈退回到頂層做用域了,從而能夠更快的訪問window
對象。一樣,傳入undefined
參數,能夠縮短查找undefined時的做用域鏈。
(function( window, undefined ) { //用一個函數域包起來,就是所謂的沙箱//在這裏邊var定義的變量,屬於這個函數域內的局部變量,避免污染全局//把當前沙箱須要的外部變量經過函數參數引入進來//只要保證參數對內提供的接口的一致性,你還能夠隨意替換傳進來的這個參數window.jQuery =window.$ = jQuery; })( window );
jquery將一些原型屬性和方法封裝在了jquery.prototype
中,爲了縮短名稱,又賦值給了jquery.fn
,這是很形象的寫法。
有一些數組或對象的方法常常能使用到,應將它們保存爲局部變量以提升訪問速度。
將全局對象window做爲參數傳入,則能夠使之在匿名函數內部做爲局部變量訪問,提供訪問速度。
jquery
實現的鏈式調用能夠節約代碼,所返回的都是同一個對象,能夠提升代碼效率。
新增模板字符串(爲JavaScript提供了簡單的字符串插值功能)、箭頭函數(操做符左邊爲輸入的參數,而右邊則是進行的操做以及返回的值Inputs=>outputs
。)、for-of
(用來遍歷數據—例如數組中的值。)arguments
對象可被不定參數和默認參數完美代替。ES6
將promise
對象歸入規範,提供了原生的Promise
對象。增長了let
和const
命令,用來聲明變量。增長了塊級做用域。let命令實際上就增長了塊級做用域。ES6規定,var
命令和function
命令聲明的全局變量,屬於全局對象的屬性;let
命令、const
命令、class
命令聲明的全局變量,不屬於全局對象的屬性。。還有就是引入module
模塊的概念
原型鏈繼承的缺點
一是字面量重寫原型會中斷關係,使用引用類型的原型,而且子類型還沒法給超類型傳遞參數。
借用構造函數(類式繼承)
借用構造函數雖然解決了剛纔兩種問題,但沒有原型,則複用無從談起。因此咱們須要原型鏈+借用構造函數的模式,這種模式稱爲組合繼承
組合式繼承
組合式繼承是比較經常使用的一種繼承方法,其背後的思路是 使用原型鏈實現對原型屬性和方法的繼承,而經過借用構造函數來實現對實例屬性的繼承。這樣,既經過在原型上定義方法實現了函數複用,又保證每一個實例都有它本身的屬性。
具體請看:JavaScript繼承方式詳解
HTTP/2
引入了「服務端推(server push)」的概念,它容許服務端在客戶端須要數據以前就主動地將數據發送到客戶端緩存中,從而提升性能。
HTTP/2
提供更多的加密支持
HTTP/2
使用多路技術,容許多個消息在一個鏈接上同時交差。
它增長了頭壓縮(header compression),所以即便很是小的請求,其請求和響應的header
都只會佔用很小比例的帶寬。
defer並行加載js文件,會按照頁面上script標籤的順序執行 async並行加載js文件,下載完成當即執行,不會按照頁面上script標籤的順序執行
浮動的框能夠向左或向右移動,直到他的外邊緣碰到包含框或另外一個浮動框的邊框爲止。因爲浮動框不在文檔的普通流中,因此文檔的普通流的塊框表現得就像浮動框不存在同樣。浮動的塊框會漂浮在文檔普通流的塊框上。
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 指令。
工廠模式:
主要好處就是能夠消除對象間的耦合,經過使用工程方法而不是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.構造函數方法沒有顯示的建立對象 (new Object()); 2.直接將屬性和方法賦值給 this 對象; 3.沒有 renturn 語句。
使用閉包主要是爲了設計私有的方法和變量。閉包的優勢是能夠避免全局變量的污染,缺點是閉包會常駐內存,會增大內存使用量,使用不當很容易形成內存泄露。
閉包有三個特性:
1.函數嵌套函數
2.函數內部能夠引用外部的參數和變量
3.參數和變量不會被垃圾回收機制回收
具體請看:詳解js閉包
cookie
雖然在持久保存客戶端數據提供了方便,分擔了服務器存儲的負擔,但仍是有不少侷限性的。
第一:每一個特定的域名下最多生成20個cookie
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.經過良好的編程,控制保存在cookie中的session對象的大小。 2.經過加密和安全傳輸技術(SSL),減小cookie被破解的可能性。 3.只在cookie中存放不敏感數據,即便被盜也不會有重大損失。 4.控制cookie的生命期,使之不會永遠有效。偷盜者極可能拿到一個過時的cookie。
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
類似,區別是它是爲了更大容量存儲設計的。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數據放在服務器上。 二、cookie不是很安全,別人能夠分析存放在本地的COOKIE並進行COOKIE欺騙 考慮到安全應當使用session。 三、session會在必定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能 考慮到減輕服務器性能方面,應當使用COOKIE。 四、單個cookie保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個cookie。 五、因此我的建議: 將登錄信息等重要信息存放爲SESSION 其餘信息若是須要保留,能夠放在COOKIE中
display:none
和visibility:hidden
的區別?
display:none 隱藏對應的元素,在文檔佈局中再也不給它分配空間,它各邊的元素會合攏,就當他歷來不存在。 visibility:hidden 隱藏對應的元素,可是在文檔佈局中仍保留原來的空間。
CSS中
link
和@import
的區別是?
(1) link屬於HTML標籤,而@import是CSS提供的; (2) 頁面被加載的時,link會同時被加載,而@import引用的CSS會等到頁面被加載完再加載; (3) import只在IE5以上才能識別,而link是HTML標籤,無兼容問題; (4) link方式的樣式的權重 高於@import的權重.
position:absolute
和float
屬性的異同
共同點:對內聯元素設置float
和absolute
屬性,可讓元素脫離文檔流,而且能夠設置其寬高。
不一樣點:float
仍會佔據位置,position
會覆蓋文檔流中的其餘元素。
介紹一下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.id選擇器( # myid) 2.類選擇器(.myclassname) 3.標籤選擇器(div, h1, p) 4.相鄰選擇器(h1 + p) 5.子選擇器(ul > li) 6.後代選擇器(lia) 7.通配符選擇器( * ) 8.屬性選擇器(a[rel = "external"]) 9.僞類選擇器(a: hover, li:nth-child)
優先級爲:
!important > id > class > tag
important
比 內聯優先級高,但內聯比 id
要高
CSS3新增僞類舉例:
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有哪些新特性?
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:
Width = width + padding-left + padding-right + border-left + border-right
佈局所佔高度Height:
Height = height + padding-top + padding-bottom + border-top + border-bottom padding-box
佈局所佔寬度Width:
Width = width(包含padding-left + padding-right) + border-top + border-bottom
佈局所佔高度Height:
Height = height(包含padding-top + padding-bottom) + border-top + border-bottom border-box
佈局所佔寬度Width:
Width = width(包含padding-left + padding-right + border-left + border-right)
佈局所佔高度Height:
Height = height(包含padding-top + padding-bottom + border-top + border-bottom)
對BFC規範的理解?
BFC,塊級格式化上下文,一個建立了新的BFC的盒子是獨立佈局的,盒子裏面的子元素的樣式不會影響到外面的元素。在同一個BFC中的兩個毗鄰的塊級盒在垂直方向(和佈局方向有關係)的margin會發生摺疊。 (W3C CSS 2.1 規範中的一個概念,它決定了元素如何對其內容進行佈局,以及與其餘元素的關係和相互做用。)
1,去掉或者丟失樣式的時候可以讓頁面呈現出清晰的結構 2,有利於SEO:和搜索引擎創建良好溝通,有助於爬蟲抓取更多的有效信息:爬蟲依賴於標籤來肯定上下文和各個關鍵字的權重; 3,方便其餘設備解析(如屏幕閱讀器、盲人閱讀器、移動設備)以意義的方式來渲染網頁; 4,便於團隊開發和維護,語義化更具可讀性,是下一步吧網頁的重要動向,遵循W3C標準的團隊都遵循這個標準,能夠減小差別化。
1)、<!DOCTYPE>
聲明位於文檔中的最前面,處於 <html>
標籤以前。告知瀏覽器以何種模式來渲染文檔。
2)、嚴格模式的排版和 JS
運做模式是 以該瀏覽器支持的最高標準運行。
3)、在混雜模式中,頁面以寬鬆的向後兼容的方式顯示。模擬老式瀏覽器的行爲以防止站點沒法工做。
4)、DOCTYPE
不存在或格式不正確會致使文檔以混雜模式呈現。
Doctype
文檔類型?該標籤可聲明三種 DTD 類型,分別表示嚴格版本、過渡版本以及基於框架的 HTML 文檔。 HTML 4.01 規定了三種文檔類型:Strict、Transitional 以及 Frameset。 XHTML 1.0 規定了三種 XML 文檔類型:Strict、Transitional 以及 Frameset。 Standards (標準)模式(也就是嚴格呈現模式)用於呈現遵循最新標準的網頁,而 Quirks (包容)模式(也就是鬆散呈現模式或者兼容模式)用於呈現爲傳統瀏覽器而設計的網頁。
區別: 1.全部的標記都必需要有一個相應的結束標記 2.全部標籤的元素和屬性的名字都必須使用小寫 3.全部的XML標記都必須合理嵌套 4.全部的屬性必須用引號""括起來 5.把全部<和&特殊符號用編碼表示 6.給全部屬性賦一個值 7.不要在註釋內容中使「--」 8.圖片必須有說明文字
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和IE七、IE6分離開來,這樣IE8已經獨立識別。 css .bb{ background-color:#f1ee18;/*全部識別*/ .background-color:#00deff\9; /*IE六、七、8識別*/ +background-color:#a200ff;/*IE六、7識別*/ _background-color:#1e0bd1;/*IE6識別*/ } 怪異模式問題:漏寫DTD聲明,Firefox仍然會按照標準模式來解析網頁,但在IE中會觸發 怪異模式。爲避免怪異模式給咱們帶來沒必要要的麻煩,最好養成書寫DTD聲明的好習慣。如今 能夠使用[html5](http://www.w3.org/TR/html5/single-page.html)推薦的寫法:`<doctype html>`
上下margin重合問題
ie和ff都存在,相鄰的兩個div的margin-left和margin-right不會重合,可是margin-top和margin-bottom卻會發生重合。 解決方法,養成良好的代碼編寫習慣,同時採用margin-top或者同時採用margin-bottom。
浮動元素脫離文檔流,不佔據空間。浮動元素碰到包含它的邊框或者浮動元素的邊框停留。 1.使用空標籤清除浮動。 這種方法是在全部浮動標籤後面添加一個空標籤 定義css clear:both. 弊端就是增長了無心義標籤。 2.使用overflow。 給包含浮動元素的父標籤添加css屬性 overflow:auto; zoom:1; zoom:1用於兼容IE6。 3.使用after僞對象清除浮動。 該方法只適用於非IE瀏覽器。具體寫法可參照如下示例。使用中需注意如下幾點。1、該方法中必須爲須要清除浮動元素的僞對象中設置 height:0,不然該元素會比實際高出若干像素;
浮動元素引發的問題: (1)父元素的高度沒法被撐開,影響與父元素同級的元素 (2)與浮動元素同級的非浮動元素(內聯元素)會跟隨其後 (3)若非第一個元素浮動,則該元素以前的元素也須要浮動,不然會影響頁面顯示的結構
解決方法:
使用CSS
中的clear:both
;屬性來清除元素的浮動可解決二、3問題,對於問題1,添加以下樣式,給父元素添加clearfix
樣式:
.clearfix:after{content: ".";display: block;height: 0;clear: both;visibility: hidden;} .clearfix{display: inline-block;} /* for IE/Mac */
清除浮動的幾種方法:
1,額外標籤法,<divstyle="clear:both;"></div>(缺點:不過這個辦法會增長額外的標籤使HTML結構看起來不夠簡潔。) 2,使用after僞類 #parent:after{ content:"."; height:0; visibility:hidden; display:block; clear:both; } 3,浮動外部元素 4,設置overflow爲hidden或者auto
1)建立新節點
createDocumentFragment() //建立一個DOM片斷 createElement() //建立一個具體的元素 createTextNode() //建立一個文本節點
2)添加、移除、替換、插入
appendChild() removeChild() replaceChild() insertBefore() //並無insertAfter()
3)查找
getElementsByTagName() //經過標籤名稱 getElementsByName() //經過元素的Name屬性的值(IE容錯能力較強, 會獲得一個數組,其中包括id等於name值的) getElementById() //經過元素Id,惟一性
HTML5 如今已經不是 SGML 的子集,主要是關於圖像,位置,存儲,多任務等功能的增長。 拖拽釋放(Drag and drop) API 語義化更好的內容標籤(header,nav,footer,aside,article,section) 音頻、視頻API(audio,video) 畫布(Canvas) API 地理(Geolocation) API 本地離線存儲 localStorage 長期存儲數據,瀏覽器關閉後數據不丟失; sessionStorage 的數據在瀏覽器關閉後自動刪除 表單控件,calendar、date、time、email、url、search 新的技術webworker, websocket, Geolocation
移除的元素
純表現的元素:basefont,big,center,font, s,strike,tt,u; 對可用性產生負面影響的元素:frame,frameset,noframes;
支持HTML5新標籤:
IE8/IE7/IE6支持經過document.createElement方法產生的標籤, 能夠利用這一特性讓這些瀏覽器支持HTML5新標籤, 固然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架 <!--[if lt IE 9]> <script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script> <![endif]--> 如何區分: DOCTYPE聲明\新增的結構元素\功能元素
調用localstorge、cookies等本地存儲方式
FOUC - Flash Of Unstyled Content 文檔樣式閃爍 <styletype="text/css"media="all">@import"../fouc.css";</style> 而引用CSS文件的@import就是形成這個問題的罪魁禍首。IE會先加載整個HTML文檔的DOM,而後再去導入外部的CSS文件,所以,在頁面DOM加載完成到CSS導入完成中間會有一段時間頁面上的內容是沒有樣式的,這段時間的長短跟網速,電腦速度都有關係。 解決方法簡單的出奇,只要在<head>之間加入一個<link>或者<script>元素就能夠了。
null
是一個表示"無"的對象,轉爲數值時爲0;undefined
是一個表示"無"的原始值,轉爲數值時爲NaN
。
當聲明的變量還未被初始化時,變量的默認值爲undefined
。
null
用來表示還沒有存在的對象,經常使用來表示函數企圖返回一個不存在的對象。
undefined
表示"缺乏值",就是此處應該有一個值,可是尚未定義。典型用法是:
(1)變量被聲明瞭,但沒有賦值時,就等於undefined。 (2) 調用函數時,應該提供的參數沒有提供,該參數等於undefined。 (3)對象沒有賦值的屬性,該屬性的值爲undefined。 (4)函數沒有返回值時,默認返回undefined。
null
表示"沒有對象",即該處不該該有值。典型用法是:
(1) 做爲函數的參數,表示該函數的參數不是對象。 (2) 做爲對象原型鏈的終點。
一、建立一個空對象,而且 this 變量引用該對象,同時還繼承了該函數的原型。 二、屬性和方法被加入到 this 引用的對象中。 三、新建立的對象由 this 所引用,而且最後隱式的返回 this 。 var obj = {}; obj.__proto__ = Base.prototype; Base.call(obj);
defer和async、動態建立DOM方式(建立script,插入到DOM中,加載完畢後callBack)、按需異步載入js
call()
和 apply()
的區別和做用?做用:動態改變某個類的某個方法的運行環境(執行上下文)。
區別參見:JavaScript學習總結(四)function函數部分
內存泄漏指任何對象在您再也不擁有或須要它以後仍然存在。 垃圾回收器按期掃描對象,並計算引用了每一個對象的其餘對象的數量。若是一個對象的引用數量爲 0(沒有其餘對象引用過該對象),或對該對象的唯一引用是循環的,那麼該對象的內存便可回收。 setTimeout 的第一個參數使用字符串而非函數的話,會引起內存泄漏。 閉包、控制檯日誌、循環(在兩個對象彼此引用且彼此保留時,就會產生一個循環)
IE支持currentStyle
,FIrefox使用getComputStyle
IE 使用innerText
,Firefox使用textContent
濾鏡方面:IE:filter:alpha(opacity= num)
;Firefox:-moz-opacity:num
事件方面:IE:attachEvent
:火狐是addEventListener
鼠標位置:IE是event.clientX
;火狐是event.pageX
IE使用event.srcElement
;Firefox使用event.target
IE中消除list的原點僅需margin:0便可達到最終效果;FIrefox須要設置margin:0;padding:0以及list-style:none
CSS圓角:ie7如下不支持圓角
Javascript數據推送
Commet
:基於HTTP長鏈接的服務器推送技術
基於WebSocket
的推送方案
SSE
(Server-Send Event):服務器推送數據新方式
前端是最貼近用戶的程序員,比後端、數據庫、產品經理、運營、安全都近。 一、實現界面交互 二、提高用戶體驗 三、有了Node.js,前端能夠實現服務端的一些事情 前端是最貼近用戶的程序員,前端的能力就是能讓產品從 90分進化到 100 分,甚至更好, 參與項目,快速高質量完成實現效果圖,精確到1px; 與團隊成員,UI設計,產品經理的溝通; 作好的頁面結構,頁面重構和用戶體驗; 處理hack,兼容、寫出優美的代碼格式; 針對服務器的優化、擁抱最新前端技術。
分爲4個步驟: (1),當發送一個URL請求時,無論這個URL是Web頁面的URL仍是Web頁面上每一個資源的URL,瀏覽器都會開啓一個線程來處理這個請求,同時在遠程DNS服務器上啓動一個DNS查詢。這能使瀏覽器得到請求對應的IP地址。 (2), 瀏覽器與遠程`Web`服務器經過`TCP`三次握手協商來創建一個`TCP/IP`鏈接。該握手包括一個同步報文,一個同步-應答報文和一個應答報文,這三個報文在 瀏覽器和服務器之間傳遞。該握手首先由客戶端嘗試創建起通訊,然後服務器應答並接受客戶端的請求,最後由客戶端發出該請求已經被接受的報文。 (3),一旦`TCP/IP`鏈接創建,瀏覽器會經過該鏈接向遠程服務器發送`HTTP`的`GET`請求。遠程服務器找到資源並使用HTTP響應返回該資源,值爲200的HTTP響應狀態表示一個正確的響應。 (4),此時,`Web`服務器提供資源服務,客戶端開始下載資源。 請求返回後,便進入了咱們關注的前端模塊 簡單來講,瀏覽器會解析`HTML`生成`DOM Tree`,其次會根據CSS生成CSS Rule Tree,而`javascript`又能夠根據`DOM API`操做`DOM`
詳情:從輸入 URL 到瀏覽器接收的過程當中發生了什麼事情?
1,工廠模式 2,構造函數模式 3,原型模式 4,混合構造函數和原型模式 5,動態原型模式 6,寄生構造函數模式 7,穩妥構造函數模式
1,原型鏈繼承 2,借用構造函數繼承 3,組合繼承(原型+借用構造) 4,原型式繼承 5,寄生式繼承 6,寄生組合式繼承
(1)建立`XMLHttpRequest`對象,也就是建立一個異步調用對象. (2)建立一個新的`HTTP`請求,並指定該`HTTP`請求的方法、`URL`及驗證信息. (3)設置響應`HTTP`請求狀態變化的函數. (4)發送`HTTP`請求. (5)獲取異步調用返回的數據. (6)使用JavaScript和DOM實現局部刷新. var xmlHttp =newXMLHttpRequest(); xmlHttp.open('GET','demo.php','true'); xmlHttp.send() xmlHttp.onreadystatechange=function(){ if(xmlHttp.readyState===4& xmlHttp.status===200){ } }
詳情:JavaScript學習總結(七)Ajax和Http狀態字
1.異步加載的方案: 動態插入script標籤 2.經過ajax去獲取js代碼,而後經過eval執行 3.script標籤上添加defer或者async屬性 4.建立並插入iframe,讓它異步執行js 5.延遲加載:有些 js 代碼並非頁面初始化的時候就馬上須要的,而稍後的某些狀況才須要的。
IE6 兩個併發,iE7升級以後的6個併發,以後版本也是6個 Firefox,chrome也是6個
Flash
、Ajax
各自的優缺點,在使用中如何取捨?Flash
適合處理多媒體、矢量圖形、訪問機器;對CSS
、處理文本上不足,不容易被搜索。-Ajax
對CSS
、文本支持很好,支持搜索;多媒體、矢量圖形、機器訪問不足。
概念:同源策略是客戶端腳本(尤爲是Javascript
)的重要的安全度量標準。它最先出自Netscape Navigator2.0
,其目的是防止某個文檔或腳本從多個不一樣源裝載。
這裏的同源策略指的是:協議,域名,端口相同,同源策略是一種安全協議。
指一段腳本只能讀取來自同一來源的窗口和文檔的屬性。
咱們舉例說明:好比一個黑客程序,他利用Iframe
把真正的銀行登陸頁面嵌到他的頁面上,當你使用真實的用戶名,密碼登陸時,他的頁面就能夠經過Javascript
讀取到你的表單中input
中的內容,這樣用戶名,密碼就輕鬆到手了。
缺點:
如今網站的JS
都會進行壓縮,一些文件用了嚴格模式,而另外一些沒有。這時這些原本是嚴格模式的文件,被 merge
後,這個串就到了文件的中間,不只沒有指示嚴格模式,反而在壓縮後浪費了字節。
GET:通常用於信息獲取,使用URL傳遞參數,對所發送信息的數量也有限制,通常在2000個字符 POST:通常用於修改服務器上的資源,對所發送的信息沒有限制。 GET方式須要使用Request.QueryString來取得變量的值,而POST方式經過Request.Form來獲取變量的值, 也就是說Get是經過地址欄來傳值,而Post是經過提交表單來傳值。 然而,在如下狀況中,請使用 POST 請求: 沒法使用緩存文件(更新服務器上的文件或數據庫) 向服務器發送大量數據(POST 沒有數據量限制) 發送包含未知字符的用戶輸入時,POST 比 GET 更穩定也更可靠
1. 咱們在網頁中的某個操做(有的操做對應多個事件)。例如:當咱們點擊一個按鈕就會產生一個事件。是能夠被 JavaScript 偵測到的行爲。 2. 事件處理機制:IE是事件冒泡、firefox同時支持兩種事件模型,也就是:捕獲型事件和冒泡型事件。; 3. `ev.stopPropagation()`;注意舊ie的方法 `ev.cancelBubble = true`;
詳情請見:JavaScript學習總結(七)Ajax和Http狀態字
ajax的缺點
一、ajax不支持瀏覽器back按鈕。 二、安全問題 AJAX暴露了與服務器交互的細節。 三、對搜索引擎的支持比較弱。 四、破壞了程序的異常機制。 五、不容易調試。
IE緩存問題
在IE瀏覽器下,若是請求的方法是GET
,而且請求的URL
不變,那麼這個請求的結果就會被緩存。解決這個問題的辦法能夠經過實時改變請求的URL
,只要URL改變,就不會被緩存,能夠經過在URL末尾添加上隨機的時間戳參數('t'= + new Date().getTime()
)
或者:
open('GET','demo.php?rand=+Math.random()',true);//
Ajax請求的頁面歷史記錄狀態問題
能夠經過錨點來記錄狀態,location.hash
。讓瀏覽器記錄Ajax請求時頁面狀態的變化。
還能夠經過HTML5
的history.pushState
,來實現瀏覽器地址欄的無刷新改變
functionclone(Obj) { var buf; if (Obj instanceofArray) { buf = []; //建立一個空的數組var i = Obj.length; while (i--) { buf[i] =clone(Obj[i]); } return buf; }elseif (Obj instanceofObject){ buf = {}; //建立一個空對象for (var k in Obj) { //爲這個對象添加新的屬性 buf[k] =clone(Obj[k]); } return buf; }else{ return Obj; } }
網站重構:在不改變外部行爲的前提下,簡化結構、添加可讀性,而在網站前端保持一致的行爲。也就是說是在不改變UI的狀況下,對網站進行優化,在擴展的同時保持一致的UI。 對於傳統的網站來講重構一般是: 表格(table)佈局改成DIV+CSS 使網站前端兼容於現代瀏覽器(針對於不合規範的CSS、如對IE6有效的) 對於移動平臺的優化 針對於SEO進行優化 深層次的網站重構應該考慮的方面 減小代碼間的耦合 讓代碼保持彈性 嚴格按規範編寫代碼 設計可擴展的API 代替舊有的框架、語言(如VB) 加強用戶體驗 一般來講對於速度的優化也包含在重構中 壓縮JS、CSS、image等前端資源(一般是由服務器來解決) 程序的性能優化(如數據讀寫) 採用CDN來加速資源加載 對於JS DOM的優化 HTTP服務器的文件緩存
如下是數組去重的三種方法:
Array.prototype.unique1=function () { var n = []; //一個新的臨時數組for (var i =0; i <this.length; i++) //遍歷當前數組 { //若是當前數組的第i已經保存進了臨時數組,那麼跳過,//不然把當前項push到臨時數組裏面if (n.indexOf(this[i]) ==-1) n.push(this[i]); } return n; } Array.prototype.unique2=function() { var n = {},r=[]; //n爲hash表,r爲臨時數組for(var i =0; i <this.length; i++) //遍歷當前數組 { if (!n[this[i]]) //若是hash表中沒有當前項 { n[this[i]] =true; //存入hash表 r.push(this[i]); //把當前數組的當前項push到臨時數組裏面 } } return r; } Array.prototype.unique3=function() { var n = [this[0]]; //結果數組for(var i =1; i <this.length; i++) //從第二項開始遍歷 { //若是當前數組的第i項在當前數組中第一次出現的位置不是i,//那麼表示第i項是重複的,忽略掉。不然存入結果數組if (this.indexOf(this[i]) == i) n.push(this[i]); } return n; }
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 Service Unavailable 服務器端暫時沒法處理請求(多是過載或維護)。
依照 Promise/A+
的定義,Promise
有四種狀態:
pending: 初始狀態, 非 fulfilled 或 rejected. fulfilled: 成功的操做. rejected: 失敗的操做. settled: Promise已被fulfilled或rejected,且不是pending
另外, fulfilled
與 rejected
一塊兒合稱 settled
。
Promise
對象用來進行延遲(deferred) 和異步(asynchronous ) 計算。
Promise 的構造函數
構造一個 Promise
,最基本的用法以下:
var promise =newPromise(function(resolve, reject) { if (...) { // succeedresolve(result); } else { // failsreject(Error(errMessage)); } });
Promise
實例擁有 then
方法(具備 then
方法的對象,一般被稱爲 thenable
)。它的使用方法以下:
promise.then(onFulfilled, onRejected)
接收兩個函數做爲參數,一個在 fulfilled
的時候被調用,一個在 rejected
的時候被調用,接收參數就是 future,onFulfilled
對應 resolve
, onRejected
對應 reject
。
負責前端團隊的管理及與其餘團隊的協調工做,提高團隊成員能力和總體效率; 帶領團隊完成研發工具及平臺前端部分的設計、研發和維護; 帶領團隊進行前端領域前沿技術研究及新技術調研,保證團隊的技術領先 負責前端開發規範制定、功能模塊化設計、公共組件搭建等工做,並組織培訓。
Object.prototype.clone=function(){ var o =this.constructor===Array? [] : {}; for(var e inthis){ o[e] =typeofthis[e] ==="object"?this[e].clone() :this[e]; } return o; }
嚴格模式主要有如下限制:
變量必須聲明後再使用 函數的參數不能有同名屬性,不然報錯 不能使用with語句 不能對只讀屬性賦值,不然報錯 不能使用前綴0表示八進制數,不然報錯 不能刪除不可刪除的屬性,不然報錯 不能刪除變量delete prop,會報錯,只能刪除屬性delete global[prop] eval不會在它的外層做用域引入變量 eval和arguments不能被從新賦值 arguments不會自動反映函數參數的變化 不能使用arguments.callee 不能使用arguments.caller 禁止this指向全局對象 不能使用fn.caller和fn.arguments獲取函數調用的堆棧 增長了保留字(好比protected、static和interface)
設立"嚴格模式"的目的,主要有如下幾個:
消除Javascript
語法的一些不合理、不嚴謹之處,減小一些怪異行爲;
消除代碼運行的一些不安全之處,保證代碼運行的安全;
提升編譯器效率,增長運行速度;
爲將來新版本的Javascript
作好鋪墊。
注:通過測試IE6,7,8,9
均不支持嚴格模式。
所謂組件,即封裝起來的具備獨立功能的UI部件。
component , widget , module , plugin ...etc
1.將時間設爲當前時間往前一點。
var date =newDate(); date.setDate(date.getDate() -1);//真正的刪除
setDate()
方法用於設置一個月的某一天。
2.expires的設置
document.cookie='user='+encodeURIComponent('name') +';expires = '+newDate(0)
<strong>
,<em>
和<b>
,<i>
標籤<strong> 標籤和 <em> 標籤同樣,用於強調文本,但它強調的程度更強一些。 em 是 斜體強調標籤,更強烈強調,表示內容的強調點。至關於html元素中的 <i>...</i>; < b > < i >是視覺要素,分別表示無心義的加粗,無心義的斜體。 em 和 strong 是表達要素(phrase elements)。
CommonJS
是服務器端模塊的規範,Node.js採用了這個規範。CommonJS
規範加載模塊是同步的,也就是說,只有加載完成,才能執行後面的操做。AMD規範則是非同步加載模塊,容許指定回調函數。
AMD
推薦的風格經過返回一個對象作爲模塊對象,CommonJS
的風格經過對module.exports
或exports
的屬性賦值來達到暴露模塊對象的目的。
document.write()
方法能夠用在兩個方面:頁面載入過程當中用實時腳本建立頁面內容,以及用延時腳本建立本窗口或新窗口的內容。
document.write
只能重繪整個頁面。innerHTML
能夠重繪頁面的一部分
假設:一個英文字符佔用一個字節,一箇中文字符佔用兩個字節
functionGetBytes(str){ var len = str.length; var bytes = len; for(var i=0; i<len; i++){ if (str.charCodeAt(i) >255) bytes++; } return bytes; } alert(GetBytes("你好,as"));
git pull:至關因而從遠程獲取最新版本並merge到本地 git fetch:至關因而從遠程獲取最新版本到本地,不會自動merge
父元素和子元素同時左浮動,而後父元素相對左移動50%,再而後子元素相對右移動50%,或者子元素相對左移動-50%也就能夠了。
<style type="text/css"> .p{ position:relative; left:50%; float:left; } .c{ position:relative; float:left; right:50%; } </style> <div class="p"> <h1 class="c">Test Float Element Center</h1> </div>
<style type="text/css"> .align-center{ /* 負邊距+定位:水平垂直居中(Negative Margin) 使用絕對定位將content的定點定位到body的中心,而後使用負margin(content寬高的一半), 將content的中心拉回到body的中心,已到達水平垂直居中的效果。 */position:absolute; left:50%; top:50%; width:400px; height:400px; margin-top:-200px; margin-left:-200px; border:1pxdashed#333; }
方法一:自身浮動法。左欄左浮動,右欄右浮動。
.left , .right{ height: 300px; width: 200px; } .right{ float: right; background-color: red; } .left{ float: left; background-color: #080808; } .middle{ height: 300px; margin: 0200px;//沒有這行,當寬度縮小到必定程度的時候,中間的內容可能換行 background-color: blue; }
方法二:margin負值法
<style> body{ margin: 0; padding: 0; } .left , .right{ height: 300px; width: 200px; float: left; } .right{ margin-left: -200px; background-color: red; } .left{ margin-left: -100%; background-color: #080808; } .middle{ height: 300px; width: 100%; float: left; background-color: blue; } </style> <!--放第一行--> <div class="middle">middle</div> <div class="left">left</div> <div class="right">right</div>
方法三:絕對定位法。左右兩欄採用絕對定位,分別固定於頁面的左右兩側,中間的主體欄用左右margin值撐開距離。
<style> body{ margin: 0; padding: 0; } .left , .right{ top: 0; height: 300px; width: 200px; position: absolute; } .right{ right: 0; background-color: red; } .left{ left: 0; background-color: #080808; } .middle{ margin: 0200px; height: 300px; background-color: blue; } </style> <div class="left">left</div> <!--這種方法沒有嚴格限定中間這欄放置何處--> <div class="middle">middle</div> <div class="right">right</div>
參考答案:
1) 單例: 任意對象都是單例,無須特別處理 var obj = {name:'michaelqin', age:30}; 2) 工廠: 就是一樣形式參數返回不一樣的實例 functionPerson() { this.name='Person1'; } functionAnimal() { this.name='Animal1'; } functionFactory() {} Factory.prototype.getInstance=function(className) { returneval('new '+ className +'()'); } var factory =newFactory(); var obj1 = factory.getInstance('Person'); var obj2 = factory.getInstance('Animal'); console.log(obj1.name); // Person1console.log(obj2.name); // Animal13) 代理: 就是新建個類調用老類的接口,包一下 functionPerson() { } Person.prototype.sayName=function() { console.log('michaelqin'); } Person.prototype.sayAge=function() { console.log(30); } functionPersonProxy() { this.person =newPerson(); var that =this; this.callMethod=function(functionName) { console.log('before proxy:', functionName); that.person[functionName](); // 代理console.log('after proxy:', functionName); } } var pp =newPersonProxy(); pp.callMethod('sayName'); // 代理調用Person的方法sayName() pp.callMethod('sayAge'); // 代理調用Person的方法sayAge()4) 觀察者: 就是事件模式,好比按鈕的onclick這樣的應用. functionPublisher() { this.listeners = []; } Publisher.prototype= { 'addListener':function(listener) { this.listeners.push(listener); }, 'removeListener':function(listener) { deletethis.listeners[listener]; }, 'notify':function(obj) { for(var i =0; i <this.listeners.length; i++) { var listener =this.listeners[i]; if (typeof listener !=='undefined') { listener.process(obj); } } } }; // 發佈者functionSubscriber() { } Subscriber.prototype= { 'process':function(obj) { console.log(obj); } }; // 訂閱者var publisher =newPublisher(); publisher.addListener(newSubscriber()); publisher.addListener(newSubscriber()); publisher.notify({name:'michaelqin', ageo:30}); // 發佈一個對象到全部訂閱者 publisher.notify('2 subscribers will both perform process'); // 發佈一個字符串到全部訂閱者
MVC
View 傳送指令到 Controller Controller 完成業務邏輯後,要求 Model 改變狀態 Model 將新的數據發送到 View,用戶獲得反饋
全部通訊都是單向的。
Angular
它採用雙向綁定(data-binding):View
的變更,自動反映在 ViewModel
,反之亦然。
組成部分Model、View、ViewModel View:UI界面 ViewModel:它是View的抽象,負責View與Model之間信息轉換,將View的Command傳送到Model; Model:數據訪問層
事件代理(Event Delegation),又稱之爲事件委託。是 JavaScript
中經常使用綁定事件的經常使用技巧。顧名思義,「事件代理」便是把本來須要綁定的事件委託給父元素,讓父元素擔當事件監聽的職務。事件代理的原理是DOM
元素的事件冒泡。使用事件代理的好處是能夠提升性能。
attribute
是dom
元素在文檔中做爲html
標籤擁有的屬性;
property
就是dom
元素在js
中做爲對象擁有的屬性。
因此:
對於html
的標準屬性來講,attribute
和property
是同步的,是會自動更新的,
可是對於自定義的屬性來講,他們是不一樣步的,
應用層:應用層、表示層、會話層(從上往下)(HTTP、FTP、SMTP、DNS
)
傳輸層(TCP
和UDP
)
網絡層(IP
)
物理和數據鏈路層(以太網)
每一層的做用以下:
物理層:經過媒介傳輸比特,肯定機械及電氣規範(比特Bit) 數據鏈路層:將比特組裝成幀和點到點的傳遞(幀Frame) 網絡層:負責數據包從源到宿的傳遞和網際互連(包PackeT) 傳輸層:提供端到端的可靠報文傳遞和錯誤恢復(段Segment) 會話層:創建、管理和終止會話(會話協議數據單元SPDU) 表示層:對數據進行翻譯、加密和壓縮(表示協議數據單元PPDU) 應用層:容許訪問OSI環境的手段(應用協議數據單元APDU)
各類協議
ICMP協議
: 因特網控制報文協議。它是TCP/IP協議族的一個子協議,用於在IP主機、路由器之間傳遞控制消息。 TFTP協議
: 是TCP/IP協議族中的一個用來在客戶機與服務器之間進行簡單文件傳輸的協議,提供不復雜、開銷不大的文件傳輸服務。HTTP協議
: 超文本傳輸協議,是一個屬於應用層的面向對象的協議,因爲其簡捷、快速的方式,適用於分佈式超媒體信息系統。 DHCP協議
: 動態主機配置協議,是一種讓系統得以鏈接到網絡上,並獲取所須要的配置參數手段。
MySQL
是傳統的關係型數據庫,MongoDB
則是非關係型數據庫
mongodb
以BSON
結構(二進制)進行存儲,對海量數據存儲有着很明顯的優點。
服務器首先產生ETag
,服務器可在稍後使用它來判斷頁面是否已經被修改。本質上,客戶端經過將該記號傳回服務器要求服務器驗證其(客戶端)緩存。
304是HTTP狀態碼,服務器用來標識這個文件沒修改,不返回內容,瀏覽器在接收到個狀態碼後,會使用瀏覽器已緩存的文件
客戶端請求一個頁面(A)。 服務器返回頁面A,並在給A
加上一個ETag
。 客戶端展示該頁面,並將頁面連同ETag
一塊兒緩存。 客戶再次請求頁面A
,並將上次請求時服務器返回的ETag
一塊兒傳遞給服務器。 服務器檢查該ETag
,並判斷出該頁面自上次客戶端請求以後還未被修改,直接返回響應304
(未修改——Not Modified
)和一個空的響應體。
高複用低耦合,這樣文件小,好維護,並且好擴展。