------------------------------------------------
1. 談談你對js閉包的理解:
使用閉包主要是為了設計私有的方法和變量。閉包的優點是可以避免全局變量的污染,缺點是閉包會常駐內存,會增大內存使用量,使用不當很容易造成內存泄露。
閉包三個特性:
①:函數嵌套函數 ;
②:函數內部可以引用外部的參數和變量 ;
③:參數和變量不會被垃圾回收機制回收
2. 談談你對Cookie的理解和優缺點:【客戶端】
cookie雖然在持久保存客戶端數據提供了方便,分擔了服務器存儲的負擔,但還是有很多局限性的;
每個特定的域名下最多生成20個cookie;IE和Opera 會清理近期最少使用的cookie,Firefox會隨機清理cookie;cookie的最大大約為4096字節,為了兼容性,一般不能超過4095字節;
優點:極高的擴展性和可用性
1.通過良好的編程,控制保存在cookie中的session對象的大小。
2.通過加密和安全傳輸技術(SSL),減少cookie被破解的可能性。
3.只在cookie中存放不敏感數據,即使被盜也不會有重大損失。
4.控制cookie的生命期,使之不會永遠有效。偷盜者很可能拿到一個過期的cookie。
缺點:
1.Cookie數量和長度的限制。每個domain最多只能有20條cookie,每個cookie長度不能超過4KB,否則會被截掉。
2.安全性問題。如果cookie被人攔截了,那人就可以取得所有的session信息。即使加密也與事無補,因為攔截者並不需要知道cookie的意義,他只要原樣轉發cookie就可以達到目的了。
3.有些狀態不可能保存在客戶端。例如,為了防止重復提交表單,我們需要在服務器端保存一個計數器。如果我們把這個計數器保存在客戶端,那么它起不到任何作用。
3. html5瀏覽器本地存儲有哪些?
在較高版本的瀏覽器中,js提供了sessionStorage和globalStorage。在HTML5中提供了localStorage來取代globalStorage。
html5中的Web Storage包括了兩種存儲方式:sessionStorage和localStorage。
sessionStorage:用於本地存儲一個會話(session)中的數據,這些數據只有在同一個會話中的頁面才能訪問並且當會話結束后數據也隨之銷毀。因此sessionStorage不是一種持久化的本地存儲,僅僅是會話級別的存儲。
localStorage:用於持久化的本地存儲,除非主動刪除數據,否則數據是永遠不會過期的。
4. web storage和cookie的區別?
Web Storage的概念和cookie相似,區別是:
Web storage:1.是為了更大容量存儲設計的。2.Web Storage擁有setItem,getItem,removeItem,clear等方法.3.Web Storage僅僅是為了在本地“存儲”數據而生
Cookie:1.大小是受限的,並且每次你請求一個新的頁面的時候Cookie都會被發送過去,這樣無形中浪費了帶寬;2.cookie還需要指定作用域,不可以跨域調用。3.需要前端開發者自己封裝setCookie,getCookie.4.cookie的作用是與服務器進行交互,作為HTTP規范的一部分而存在;
**localStorage和sessionStorage都具有相同的操作方法,例如setItem、getItem和removeItem等**
5. cookie 和session 的區別:
1.cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
2.cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙 考慮到安全應當使用session。
3.session會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能 考慮到減輕服務器性能方面,應當使用COOKIE。
4.單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。
5.所以個人建議:將登陸信息等重要信息存放為SESSION其他信息如果需要保留,可以放在COOKIE中
6. display:none和visibility:hidden的區別?
display:none:隱藏對應的元素,在文檔布局中不再給它分配空間,它各邊的元素會合攏, 就當他從來不存在。
visibility:hidden:隱藏對應的元素,但是在文檔布局中仍保留原來的空間。
7. position:absolute和float屬性的異同
共同點:對內聯元素設置`float`和`absolute`屬性,可以讓元素脫離文檔流,並且可以設置其寬高。
不同點:float仍會占據位置,position會覆蓋文檔流中的其他元素。
8. 介紹一下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規范對盒模型解析,一旦修改了元素的邊框或內距,就會影響元素的盒子尺寸,就不得不重新計算元素的盒子尺寸,從而影響整個頁面的布局。
9. CSS選擇符有哪些?哪些屬性可以繼承?優先級算法如何計算?CSS3新增偽類有那些?
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)
可繼承的樣式: font-size font-family color, text-indent;
不可繼承的樣式:border padding margin width height ;
優先級就近原則,同權重情況下樣式定義最近者為准;
載入樣式以最后載入的定位為准;
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 :單選框或復選框被選中。
10. position的值, relative和absolute分別是相對於誰進行定位的?
absolute :生成絕對定位的元素,相對於最近一級的定位不是 static 的父元素來進行定位。fixed (老IE不支持)生成絕對定位的元素,相對於瀏覽器窗口進行定位。
relative :生成相對定位的元素,相對於其在普通流中的位置進行定位。static 默認值。沒有定位,元素出現在正常的流中(相對於父容器來說)
11. 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
12. XML和JSON的區別?
1.數據體積方面。JSON相對於XML來講,數據的體積小,傳遞的速度更快些。
2.數據交互方面。JSON與JavaScript的交互更加方便,更容易解析處理,更好的數據交互。
3.數據描述方面。JSON對數據的描述性比XML較差。
4.傳輸速度方面。JSON的速度要遠遠快於XML。
13. 說說你對語義化標簽的理解?address title header footer
1.去掉或者丟失樣式的時候能夠讓頁面呈現出清晰的結構
2.有利於SEO:和搜索引擎建立良好溝通,有助於爬蟲抓取更多的有效信息:爬蟲依賴於標簽來確定上下文和各個關鍵字的權重;[爬蟲]
3.方便其他設備解析(如屏幕閱讀器、盲人閱讀器、移動設備)以意義的方式來渲染網頁;
4.便於團隊開發和維護,語義化更具可讀性,是下一步吧網頁的重要動向,遵循W3C標准的團隊都遵循這個標准,可以減少差異化。
14. 網頁設計常見兼容性問題有哪些,如何解決?
Document.getElementByid('name')
1.png24位的圖片在iE6瀏覽器上出現背景,解決方案是做成PNG8.也可以引用一段腳本處理.
2.瀏覽器默認的margin和padding不同。解決方案是加一個全局的*{margin:0;padding:0;}來統一。
3.IE6雙邊距bug:塊屬性標簽float后,又有橫行的margin情況下,在ie6顯示margin比設置的大。
4.浮動ie產生的雙倍距離(IE6雙邊距問題:在IE6下,如果對元素設置了浮動,同時又設置了margin-left或margin-right,margin值會加倍。) #box{ float:left; width:10px; margin:0 0 0 100px;} 這種情況之下IE會產生20px的距離,解決方案是在float的標簽樣式控制中加入 ——_display:inline;將其轉化為行內屬性。(_這個符號只有ie6會識別)
5.漸進識別的方式,從總體中逐漸排除局部。
首先,巧妙的使用“\9”這一標記,將IE游覽器從所有情況中分離出來。 接着,再次使用“+”將IE8和IE7、IE6分離開來,這樣IE8已經獨立識別。
6.IE下,可以使用獲取常規屬性的方法來獲取自定義屬性, 也可以使用getAttribute()獲取自定義屬性; Firefox下,只能使用getAttribute()獲取自定義屬性. 解決方法:統一通過getAttribute()獲取自定義屬性.
7.IE下,event對象有x,y屬性,但是沒有pageX,pageY屬性; Firefox下,event對象有pageX,pageY屬性,但是沒有x,y屬性.
8.解決方法:(條件注釋)缺點是在IE瀏覽器下可能會增加額外的HTTP請求數。
9.Chrome 中文界面下默認會將小於 12px 的文本強制按照 12px 顯示, 可通過加入 CSS 屬性 -webkit-text-size-adjust: none; 解決.
10.超鏈接訪問過后hover樣式就不出現了 被點擊訪問過的超鏈接樣式不在具有hover和active了解決方法是改變CSS屬性的排列順序: L-V-H-A : a:link {} a:visited {} a:hover {} a:active {}
11.怪異模式問題:漏寫DTD聲明,Firefox仍然會按照標准模式來解析網頁,但在IE中會觸發怪異模式。為避免怪異模式給我們帶來不必要的麻煩,最好養成書寫DTD聲明的好習慣。現在可以使用[html5](http://www.w3.org/TR/html5/single-page.html)推薦的寫法:<doctype html>
12.上下margin重合問題 ie和ff都存在,相鄰的兩個div的margin-left和margin-right不會重合,但是margin-top和margin-bottom卻會發生重合。 解決方法,養成良好的代碼編寫習慣,同時采用margin-top或者同時采用margin-bottom。
ie6對png圖片格式支持不好(引用一段腳本處理)
15. 解釋下浮動和它的工作原理?清除浮動的技巧
浮動元素脫離文檔流,不占據空間。浮動元素碰到包含它的邊框或者浮動元素的邊框停留。
1.使用空標簽清除浮動。 這種方法是在所有浮動標簽后面添加一個空標簽 定義css clear:both. 弊端就是增加了無意義標簽。
2.使用overflow。 給包含浮動元素的父標簽添加css屬性 overflow:auto; zoom:1; zoom:1用於兼容IE6。
3.使用after偽對象清除浮動。 該方法只適用於非IE瀏覽器。具體寫法可參照以下示例。 ::after
使用中需注意:該方法中必須為需要清除浮動元素的偽對象中設置 height:0,否則該元素會比實際高出若干像素.
16. 浮動元素引起的問題和解決辦法?
浮動元素引起的問題:1.父元素的高度無法被撐開,影響與父元素同級的元素; 2.與浮動元素同級的非浮動元素(內聯元素)會跟隨其后; 3.若非第一個元素浮動,則該元素之前的元素也需要浮動,否則會影響頁面顯示的結構
解決方法:使用CSS中的clear:both;屬性來清除元素的浮動可解決2、3問題,對於問題1,添加如下樣式,給父元素添加clearfix樣式
17. DOM操作——怎樣添加、移除、移動、復制、創建和查找節點
1.創建新節點 createDocumentFragment() //創建一個DOM片段 createElement() //創建一個具體的元素 createTextNode() //創建一個文本節點
2.添加、移除、替換、插入 appendChild() removeChild() replaceChild() insertBefore() //在已有的子節點前插入一個新的子節點
3.查找 getElementsByTagName() //通過標簽名稱 getElementsByName() //通過元素的Name屬性的值(IE容錯能力較強,會得到一個數組,其中包括id等於name值的) getElementById() //通過元素Id,唯一性
18. html5有哪些新特性、移除了那些元素?如何處理HTML5新標簽的瀏覽器兼容問題?如何區分 HTML 和 HTML5?
1.HTML5 現在已經不是 SGML 的子集,主要是關於圖像,位置,存儲,多任務等功能的增加。
2.拖拽釋放(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
3.移除的元素 純表現的元素:basefont,big,center,font, s,strike,tt,u; 對可用性產生負面影響的元素:frame,frameset,noframes;支持HTML5新標簽:
4.IE8/IE7/IE6支持通過document.createElement方法產生的標簽, 可以利用這一特性讓這些瀏覽器支持HTML5新標簽, 瀏覽器支持新標簽后,還需要添加標簽默認的樣式:
5.當然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架 <!--[if lt IE 9]> <script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script> <![endif]-->
19. iframe的優缺點?
<iframe>優點: 解決加載緩慢的第三方內容如圖標和廣告等的加載問題 Security sandbox 並行加載腳本 solve slow to load third-party content such as icons and advertisements of loading problems Security sandbox parallel load script
<iframe>的缺點: 1.iframe會阻塞主頁面的Onload事件;2.即時內容為空,加載也需要時間 3.沒有語意
(爬蟲抓不到iframe內容)
20. 如何實現瀏覽器內多個標簽頁之間的通信?
調用localstorge、cookies等本地存儲方式
21. 請說出三種減少頁面加載時間的方法
1.優化圖片
2.圖像格式的選擇(GIF:提供的顏色較少,可用在一些對顏色要求不高的地方)
3.優化CSS(壓縮合並css,如margin-top,margin-left...)
4.網址后加斜杠(如www.campr.com/目錄,會判斷這個“目錄是什么文件類型,或者是目錄。)——(最好加上斜杠)
5.標明高度和寬度(如果瀏覽器沒有找到這兩個參數,它需要一邊下載圖片一邊計算大小,如果圖片很多,瀏覽器需要不斷地調整頁面。這不但影響速度,也影響瀏覽體驗。 當瀏覽器知道了高度和寬度參數后,即使圖片暫時無法顯示,頁面上也會騰出圖片的空位,然后繼續加載后面的內容。從而加載時間快了,瀏覽體驗也更好了。)
減少http請求(合並文件,合並圖片)。
22. documen.write和 innerHTML的區別
Document.write: 只能重繪整個頁面; innerHTML: 可以重繪頁面的一部分
23. sql注入原理
就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。總的來說有以下幾點:
1.永遠不要信任用戶的輸入,要對用戶的輸入進行校驗,可以通過正則表達式,或限制長度,對單引號和雙"-"進行轉換等。
2.永遠不要使用動態拼裝SQL,可以使用參數化的SQL或者直接使用存儲過程進行數據查詢存取。
3.永遠不要使用管理員權限的數據庫連接,為每個應用使用單獨的權限有限的數據庫連接。
不要把機密信息明文存放,請加密或者hash掉密碼和敏感的信息。
select * from users where username="aa" and password="aa";
A' or 1=1 #
24. XSS原理及防范
Xss(cross-site scripting)攻擊指的是攻擊者往Web頁面里插入惡意html標簽或者javascript代碼。比如:攻擊者在論壇中放一個看似安全的鏈接,騙取用戶點擊后,竊取cookie中的用戶私密信息;或者攻擊者在論壇中加一個惡意表單,當用戶提交表單的時候,卻把信息傳送到攻擊者的服務器中,而不是用戶原本以為的信任站點.
(跨域攻擊)
25. XSS與CSRF有什么區別嗎?
XSS是獲取信息,不需要提前知道其他用戶頁面的代碼和數據包。CSRF是代替用戶完成指定的動作,需要知道其他用戶頁面的代碼和數據包。
要完成一次CSRF攻擊,受害者必須依次完成兩個步驟:
1.登錄受信任網站A,並在本地生成Cookie。
2.在不登出A的情況下,訪問危險網站B。
26. CSRF的防御
1.服務端的CSRF方式方法很多樣,但總的思想都是一致的,就是在客戶端頁面增加偽隨機數。
使用驗證碼
27. Flash、Ajax各自的優缺點,在使用中如何取舍?
Flash ajax對比 Flash適合處理多媒體、矢量圖形、訪問機器;對CSS、處理文本上不足,不容易被搜索。Ajax對CSS、文本支持很好,支持搜索;多媒體、矢量圖形、機器訪問不足。共同點:與服務器的無刷新傳遞消息、用戶離線和在線狀態、操作DOM
28. GET和POST的區別,何時使用POST?
GET:一般用於信息獲取,使用URL傳遞參數,對所發送信息的數量也有限制,一般在2000個字符
POST:一般用於修改服務器上的資源,對所發送的信息沒有限制。 GET方式需要使用Request.QueryString來取得變量的值,而POST方式通過Request.Form來獲取變量的值,也就是說Get是通過地址欄來傳值,而Post是通過提交表單來傳值。然而,在以下情況中,請使用 POST 請求: 無法使用緩存文件(更新服務器上的文件或數據庫) 向服務器發送大量數據(POST 沒有數據量限制)發送包含未知字符的用戶輸入時,POST 比 GET 更穩定也更可靠
29. 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 Service Unavailable 服務器端暫時無法處理請求(可能是過載或維護)。
30. 談談網頁性能優化問題
代碼層面:避免使用css表達式,避免使用高級選擇器,通配選擇器。
緩存利用:緩存Ajax,使用CDN,使用外部js和css文件以便緩存,添加Expires頭,服務端配置Etag,減少DNS查找等
請求數量:合並樣式和腳本,使用css圖片精靈,初始首屏之外的圖片資源按需加載,靜態資源延遲加載。
請求帶寬:壓縮文件,開啟GZIP,
移動端性能優化:盡量使用css3動畫,開啟硬件加速。適當使用touch事件代替click事件.避免使用css3漸變陰影效果.盡可能少的使用box-shadow與gradients box-shadow與gradients往往都是頁面的性能殺手