最近面试遇到的一些面试题记录分享下。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的事件模型: 冒泡