以下是收集一些面試中經常會遇到的經典面試題以及自己面試過程中有一些未解決的問題,通過對知識的整理以及經驗的總結,重新鞏固自身的前端基礎知識,如有錯誤或更好的答案,歡迎指正,水平有限,望各位不吝指教。:)。(原文連結:http://www.cnblogs.com/bigboyLin/p/5272902.html)
HTML/CSS部分
1、什麼是盒子模型?
在網頁中,一個元素佔有空間的大小由幾個部分構成,其中包括元素的內容(content),元素的內邊距(padding),元素的邊框(border),元素的外邊距(margin)四個部分。這四個部分佔有的空間中,有的部分可以顯示相應的內容,而有的部分只用來分隔相鄰的區域或區域。4個部分一起構成了css中元素的盒模型。
2、行內元素有哪些?塊級元素有哪些? 空(void)元素有那些?
行內元素:a、b、span、img、input、strong、select、label、em、button、textarea 塊級元素:div、ul、li、dl、dt、dd、p、h1-h6、blockquote 空元素:即系沒有內容的HTML元素,例如:br、meta、hr、link、input、img
3、CSS實現垂直水平居中
一道經典的問題,實現方法有很多種,以下是其中一種實現: HTML結構:
1 2 3 4 |
<div class="wrapper"> <div class="content"></div> </div> |
CSS:
1 2 3 4 5 6 7 8 9 10 11 12 |
.wrapper{position:relative;} .content{ background-color:#6699FF; width:200px; height:200px; position: absolute; //父元素需要相對定位 top: 50%; left: 50%; margin-top:-100px ; //二分之一的height,width margin-left: -100px; } |
4、簡述一下src與href的區別
href 是指向網路資源所在位置,建立和當前元素(錨點)或當前文件(連結)之間的連結,用於超連結。
src是指向外部資源的位置,指向的內容將會嵌入到文件中當前標籤所在位置;在請求src資源時會將其指向的資源下載並應用到文件內,例如js指令碼,img圖片和frame等元素。當瀏覽器解析到該元素時,會暫停其他資源的下載和處理,直到將該資源載入、編譯、執行完畢,圖片和框架等元素也如此,類似於將所指向資源嵌入當前標籤內。這也是為什麼將js指令碼放在底部而不是頭部。
5、什麼是CSS Hack?
一般來說是針對不同的瀏覽器寫不同的CSS,就是 CSS Hack。 IE瀏覽器Hack一般又分為三種,條件Hack、屬性級Hack、選擇符Hack(詳細參考CSS文件:css文件)。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// 1、條件Hack <!--[if IE]> <style> .test{color:red;} </style> <![endif]--> // 2、屬性Hack .test{ color:#090\9; /* For IE8+ */ *color:#f00; /* For IE7 and earlier */ _color:#ff0; /* For IE6 and earlier */ } // 3、選擇符Hack * html .test{color:#090;} /* For IE6 and earlier */ * + html .test{color:#ff0;} /* For IE7 */ |
6、簡述同步和非同步的區別
同步是阻塞模式,非同步是非阻塞模式。 同步就是指一個程式在執行某個請求的時候,若該請求需要一段時間才能返回資訊,那麼這個程式將會一直等待下去,直到收到返回資訊才繼續執行下去; 非同步是指程式不需要一直等下去,而是繼續執行下面的操作,不管其他程式的狀態。當有訊息返回時系統會通知程式進行處理,這樣可以提高執行的效率。
7、px和em的區別
px和em都是長度單位,區別是,px的值是固定的,指定是多少就是多少,計算比較容易。em得值不是固定的,並且em會繼承父級元素的字型大小。 瀏覽器的預設字型高都是16px。所以未經調整的瀏覽器都符合: 1em=16px。那麼12px=0.75em, 10px=0.625em
8、什麼叫優雅降級和漸進增強?
漸進增強 progressive enhancement: 針對低版本瀏覽器進行構建頁面,保證最基本的功能,然後再針對高階瀏覽器進行效果、互動等改進和追加功能達到更好的使用者體驗。
優雅降級 graceful degradation: 一開始就構建完整的功能,然後再針對低版本瀏覽器進行相容。
區別: a. 優雅降級是從複雜的現狀開始,並試圖減少使用者體驗的供給 b. 漸進增強則是從一個非常基礎的,能夠起作用的版本開始,並不斷擴充,以適應未來環境的需要 c. 降級(功能衰減)意味著往回看;而漸進增強則意味著朝前看,同時保證其根基處於安全地帶
9、瀏覽器的核心分別是什麼?
IE: trident核心 Firefox:gecko核心 Safari:webkit核心 Opera:以前是presto核心,Opera現已改用Google Chrome的Blink核心 Chrome:Blink(基於webkit,Google與Opera Software共同開發)
JavaScript部分
怎樣新增、移除、移動、複製、建立和查詢節點?
1)建立新節點 createDocumentFragment() //建立一個DOM片段 createElement() //建立一個具體的元素 createTextNode() //建立一個文字節點
2)新增、移除、替換、插入 appendChild() //新增 removeChild() //移除 replaceChild() //替換 insertBefore() //插入
3)查詢 getElementsByTagName() //通過標籤名稱 getElementsByName() //通過元素的Name屬性的值 getElementById() //通過元素Id,唯一性
實現一個函式clone,可以對JavaScript中的5種主要的資料型別(包括Number、String、Object、Array、Boolean)進行值複製。
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 39 40 41 42 43 |
/** * 物件克隆 * 支援基本資料型別及物件 * 遞迴方法 */ function clone(obj) { var o; switch (typeof obj) { case "undefined": break; case "string": o = obj + ""; break; case "number": o = obj - 0; break; case "boolean": o = obj; break; case "object": // object 分為兩種情況 物件(Object)或陣列(Array) if (obj === null) { o = null; } else { if (Object.prototype.toString.call(obj).slice(8, -1) === "Array") { o = []; for (var i = 0; i < obj.length; i++) { o.push(clone(obj[i])); } } else { o = {}; for (var k in obj) { o[k] = clone(obj[k]); } } } break; default: o = obj; break; } return o; } |
如何消除一個陣列裡面重復的元素?
1 2 3 4 5 6 7 8 9 10 |
// 方法一: var arr1 =[1,2,2,2,3,3,3,4,5,6], arr2 = []; for(var i = 0,len = arr1.length; i< len; i++){ if(arr2.indexOf(arr1[i]) < 0){ arr2.push(arr1[i]); } } document.write(arr2); // 1,2,3,4,5,6 |
在Javascript中什麼是偽陣列?如何將偽陣列轉化為標準陣列?
偽陣列(類陣列):無法直接呼叫陣列方法或期望length屬性有什麼特殊的行為,但仍可以對真正陣列遍歷方法來遍歷它們。典型的是函式的argument引數,還有像呼叫getElementsByTagName,document.childNodes之類的,它們都返回NodeList物件都屬於偽陣列。可以使用Array.prototype.slice.call(fakeArray)將陣列轉化為真正的Array物件。
1 2 3 4 5 6 7 8 |
function log(){ var args = Array.prototype.slice.call(arguments); //為了使用unshift陣列方法,將argument轉化為真正的陣列 args.unshift('(app)'); console.log.apply(console, args); }; |
Javascript中callee和caller的作用?
caller是返回一個對函式的引用,該函式呼叫了當前函式;
callee是返回正在被執行的function函式,也就是所指定的function物件的正文。
請描述一下cookies,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僅僅是為了在本地“儲存”資料而生。
統計字串中字母個數或統計最多字母數。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
var str = "aaaabbbccccddfgh"; var obj = {}; for(var i=0;i<str.length;i++){ var v = str.charAt(i); if(obj[v] && obj[v].value == v){ obj[v].count = ++ obj[v].count; }else{ obj[v] = {}; obj[v].count = 1; obj[v].value = v; } } for(key in obj){ document.write(obj[key].value +'='+obj[key].count+' '); // a=4 b=3 c=4 d=2 f=1 g=1 h=1 } |
jQuery的事件委託方法on、live、delegate之間有什麼區別?
HTTP
一次完整的HTTP事務是怎樣的一個過程?
基本流程: a. 域名解析 b. 發起TCP的3次握手 c. 建立TCP連線後發起http請求 d. 伺服器端響應http請求,瀏覽器得到html程式碼 e. 瀏覽器解析html程式碼,並請求html程式碼中的資源 f. 瀏覽器對頁面進行渲染呈現給使用者
HTTP的狀態碼有哪些?
HTTPS是如何實現加密?
演算法相關
手寫陣列快速排序
關於快排演算法的詳細說明,可以參考阮一峰老師的文章快速排序 “快速排序”的思想很簡單,整個排序過程只需要三步: (1)在資料集之中,選擇一個元素作為”基準”(pivot)。 (2)所有小於”基準”的元素,都移到”基準”的左邊;所有大於”基準”的元素,都移到”基準”的右邊。 (3)對”基準”左邊和右邊的兩個子集,不斷重複第一步和第二步,直到所有子集只剩下一個元素為止。 參考程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
var quickSort = function(arr) { if (arr.length <= 1) { return arr; } var pivotIndex = Math.floor(arr.length / 2); var pivot = arr.splice(pivotIndex, 1)[0]; var left = []; var right = []; for (var i = 0; i < arr.length; i++){ if (arr[i] < pivot) { left.push(arr[i]); } else { right.push(arr[i]); } } return quickSort(left).concat([pivot], quickSort(right)); }; |
JavaScript實現二分法查詢
二分法查詢,也稱折半查詢,是一種在有序陣列中查詢特定元素的搜尋演算法。查詢過程可以分為以下步驟: (1)首先,從有序陣列的中間的元素開始搜尋,如果該元素正好是目標元素(即要查詢的元素),則搜尋過程結束,否則進行下一步。 (2)如果目標元素大於或者小於中間元素,則在陣列大於或小於中間元素的那一半區域查詢,然後重複第一步的操作。 (3)如果某一步陣列為空,則表示找不到目標元素。 參考程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// 非遞迴演算法 function binary_search(arr, key) { var low = 0, high = arr.length - 1; while(low <= high){ var mid = parseInt((high + low) / 2); if(key == arr[mid]){ return mid; }else if(key > arr[mid]){ low = mid + 1; }else if(key < arr[mid]){ high = mid -1; }else{ return -1; } } }; var arr = [1,2,3,4,5,6,7,8,9,10,11,23,44,86]; var result = binary_search(arr,10); alert(result); // 9 返回目標元素的索引值 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// 遞迴演算法 function binary_search(arr,low, high, key) { if (low > high){ return -1; } var mid = parseInt((high + low) / 2); if(arr[mid] == key){ return mid; }else if (arr[mid] > key){ high = mid - 1; return binary_search(arr, low, high, key); }else if (arr[mid] < key){ low = mid + 1; return binary_search(arr, low, high, key); } }; var arr = [1,2,3,4,5,6,7,8,9,10,11,23,44,86]; var result = binary_search(arr, 0, 13, 10); alert(result); // 9 返回目標元素的索引值 |
Web安全
你所瞭解到的Web攻擊技術
(1)XSS(Cross-Site Scripting,跨站指令碼攻擊):指通過存在安全漏洞的Web網站註冊使用者的瀏覽器內執行非法的HTML標籤或者JavaScript進行的一種攻擊。 (2)SQL隱碼攻擊 (3)CSRF(Cross-Site Request Forgeries,跨站點請求偽造):指攻擊者通過設定好的陷阱,強制對已完成的認證使用者進行非預期的個人資訊或設定資訊等某些狀態更新。
前端效能
如何優化影像、影像格式的區別
瀏覽器是如何解析HTML
前端架構
對MVC、MVVM的理解
正規表示式相關
寫一個function,清除字串前後的空格。(相容所有瀏覽器)
1 2 3 4 5 6 |
function trim(str) { if (str && typeof str === "string") { return str.replace(/(^\s*)|(\s*)$/g,""); //去除前後空白符 } } |
使用正規表示式驗證郵箱格式
1 2 3 4 |
var reg = /^(\w)+(\.\w+)*@(\w)+((\.\w{2,3}){1,3})$/; var email = "example@qq.com"; console.log(reg.test(email)); // true |
職業規劃
對前端工程師這個職位你是怎麼樣理解的?
a. 前端是最貼近使用者的程式設計師,前端的能力就是能讓產品從 90分進化到 100 分,甚至更好 b. 參與專案,快速高質量完成實現效果圖,精確到1px; c. 與團隊成員,UI設計,產品經理的溝通; d. 做好的頁面結構,頁面重構和使用者體驗; e. 處理hack,相容、寫出優美的程式碼格式; f. 針對伺服器的優化、擁抱最新前端技術。
打賞支援我寫出更多好文章,謝謝!
打賞作者
打賞支援我寫出更多好文章,謝謝!
任選一種支付方式