最近面試遇到的一些面試題記錄分享下。javascript
公司A:
題目一:
不用jquery等框架/庫,查找一個頁面上有多少種標籤,每種標籤的個數,僞代碼實現亦可css
代碼:java
var map = {}; function dfs(node) { if(node.nodeType === 1) { var tagName = node.tagName; map[tagName] = map.hasOwnProperty(tagName) ? map[tagName] + 1 : 1; var children = node.childNodes; for(var i = 0, len = children.length; i < len; i++) { dfs(children[i]); } } } dfs(document.body); console.log(map);
這裏估計也就是考察遞歸搜索吧,當時寫的沒有這麼完整,思路同樣,這裏沒有考慮到有iframe的狀況。node
公司B:
題目一:
typeof []
答案:objectjquery
一開始個人回答是object,面試官問的時候特地問了下肯定嗎,而後就有點猶豫了,而後面試官又問了下javascript的數據類型有哪些,string,number,null,undefined,object當時忘記了boolean面試
題目二:
你知道的http的狀態碼有哪些,表明什麼意思
https://segmentfault.com/a/1190000004356...
寫出經常使用的一些狀態碼就能夠了,我也就寫了200 304 403 404 500 502 這幾個
引伸:304是什麼意思,是根據什麼判斷的?
這個還真不太清楚,緩存過時時間?文件內容?待我搞清楚以後再補充...segmentfault
題目三:
cookie跟session的區別?
一、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
二、cookie不是很安全,別人能夠分析存放在本地的COOKIE並進行COOKIE欺騙數組
考慮到安全應當使用session。
三、session會在必定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能瀏覽器
考慮到減輕服務器性能方面,應當使用COOKIE。
四、單個cookie保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個cookie。
五、因此我的建議:緩存
將登錄信息等重要信息存放爲SESSION 其餘信息若是須要保留,能夠放在COOKIE中
出處:https://segmentfault.com/a/1190000004071...
題目四:
有一個數組譬若有十個數字,一秒鐘打印一個怎麼實現?
代碼:
var num = [1, 2, 3, 4, 5, 6], len = num.length, index = 0; var timer = setInterval(function () { if(index >= len) { clearInterval(timer); } else { console.log(num[index]); } index++; }, 1000);
題目五:
position有哪些值?absolute相對於什麼定位?
position 屬性值的含義:
static
元素框正常生成。塊級元素生成一個矩形框,做爲文檔流的一部分,行內元素則會建立一個或多個行框,置於其父元素中。
relative
元素框偏移某個距離。元素仍保持其未定位前的形狀,它本來所佔的空間仍保留。
absolute
元素框從文檔流徹底刪除,並相對於其包含塊定位。包含塊多是文檔中的另外一個元素或者是初始包含塊。元素原先在正常文檔流中所佔的空間會關閉,就好像元素原來不存在同樣。元素定位後生成一個塊級框,而不論原來它在正常流中生成何種類型的框。
fixed
元素框的表現相似於將 position 設置爲 absolute,不過其包含塊是視窗自己。
資料:http://www.w3school.com.cn/css/css_posit...
絕對定位的元素的位置相對於最近的已定位祖先元素,若是元素沒有已定位的祖先元素,那麼它的位置相對於最初的包含塊。
資料:http://www.w3school.com.cn/css/css_posit...
題目六:
一個數組,求出裏面連續和最大的一段的起始下標,譬如[1, 3, -4, 4, 2]最大連續和爲6 下表爲3, 4
var arr = [1, 3, -5, 4, 2, -9, 3, 6], sum = arr[0], sumIndex = {l: 0, r: 0}; max = [], retIndex = {l: 0, r: 0}; max[0] = arr[0]; for(var i = 1, len = arr.length; i < len; i++) { max[i] = Math.max(sum + arr[i], max[i-1], arr[i]); if(max[i] === sum + arr[i]) { retIndex.l = sumIndex.l; retIndex.r = sumIndex.r = i; } else if(max[i] === arr[i]) { retIndex.l = i; retIndex.r = i; } else { retIndex.l = sumIndex.l; retIndex.r = sumIndex.r; } if(sum + arr[i] >= 0) { sum = sum + arr[i]; sumIndex.r = i; } else { sum = arr[i]; sumIndex.l = i; sumIndex.r = i; } } console.log(max[len - 1] + ' ' + retIndex.l + ' ' + retIndex.r);
題目七:
實現一個once函數 參數是一個函數 返回值也是個函數 只能執行一次 下次執行就是undefined 例如:
var foo = once(function() { console.log(123); }); foo();//123 foo();//undefined foo();//undefined
實現:
function once(cb) { var flag = 1; return function() { if(flag) { cb.apply(cb.caller, arguments); flag = 0; } } }
題目八:
一個由整數構成的有序數組(有可能有重複的),給一個數,找出它在數組裏面出現的位置
解析:
這個就是一個二分查找,由於可能有重複的一直要找到它的前一個元素不等於當前找到的元素爲止。
代碼就不寫了
題目九:
移動端的手勢事件有哪些?
因爲移動端作的少,當時只記得touchstart touchmove touchend這幾個,沒有處理這些事件的經驗
題目十:
寫一個兼容各瀏覽器的事件監聽函數
function addListener(ele, eventName, handler) { if(ele.addEventListener) { ele.addEventListener(eventName, handler); } else if (ele.attachEvent) { ele.attachEvent('on' + eventName, handler); } }
主要考慮到兼容IE
引伸:
addEventListener 第三個參數有啥用
第三個參數爲true在捕獲階段執行處理函數,爲false在冒泡階段執行處理函數默認爲false
還有事件模型 IE支持哪一種事件模型事件模型: 捕獲->目標->冒泡IE的事件模型: 冒泡