搜房面试经历
接到搜房面试邀请让我有些猝不及防,估计是在招聘网站看到我简历了吧,说起来搜房也算是我人生的一个老师,来北京后再上面找房被黑中介坑了好多次,终于决定多花一些钱在靠谱房地产公司租房,当时心里就有一种邪恶的赶脚,不过那天正好没有去上班,就答应了,毕竟面试多多少少还是能学到不少东西的。
从地铁出来的时候被眼前的景象震慑住了,举目荒凉,陆续有三条野狗从我身边经过,按照指示到了公司门口,搜房的大楼还是修的很气派的,进门登记后,前台也是人事把我领到了一个小会议室,很诧异会议室只有桌子和椅子,没有白板投影仪神马的,人事妹子看到我简历说的第一句话就让我心里拔凉拔凉的了,“你工作两年,工资就已经xxx了,很不错呀!”,当时我就惊呆了,很不错是嘛。。。。
胡乱聊了几句后终于进入正题,一个技术哥哥进来拿了两份试题,问我要做哪个,我说这一年来都在做前端的东西,我先看看前端的吧,但是技术哥哥拿着.net的试卷说,你先看看这题,随便说说,不用写了。说实话将近一年没有用.net知识了,多少真的有些生疏了。主要就是几个问答题,顺序记不住了
.NET
1. SQL注入
这个我侃侃而谈了一番,因为很简单,大家都会,什么过滤字符啦、什么不拼接SQL语句,使用模板啦、什么数据库权限啦。。。
2. ORM
我们公司用的是linq自己实现的很简单的、称不上是ORM的解决方案或者IBATIS,没有仔细研究过,平时又懒,对NHibernate、Entity Framework总想着要了解,却没有去研究,所以除了一些对linq的简单解释我只说了呵呵。
3. 分布式
这个实在是没有接触过,所以没有答,确实需要回去后看看。
4. 缓存
对浏览器页面缓存倒是了解一些,但是这是.net的题,我只说了一些.net的文件依赖和数据库依赖的缓存,也没有研究过代码,只是调用过接口,所以也没有说出所以然来。
5. xss攻击
这个名词把握震慑住了,不知道是什么,期间技术哥哥问了我一些jsonp跨域的知识,回去后一百度才知道是怎么回事儿,原来有个这么洋气的名字。
6.设计模式
这个就是简单说了说工厂模式、观察者模式、策略模式和单例模式,问我使用场景,拿.net类库举了下例子。
7. asp.net Button控件原理
之前写过几篇相关的博客,正想大说一番呢,刚说出表单提交,面试哥哥就说可以了,做做前端的题吧,看得出挺失望的,回顾一下也是,大部分题要么没听说过,要么表述不出来,要么一知半解。技术哥哥让我浏览一下问我多久能做完,大概20道题左右,只有一个编程题,其它都是写执行结果或者改错,我说半个小时,技术哥哥就出去了。
总体而言前端的题还是比较简单的,但是说是前端,没有一个CSS相关,只有第一题是HTML改错,其它都是JavaScript,出来后只记得一部分了,反正很多都是考察引用传递和闭包知识的。
所谓前端
1. HTML改错
<div> <ol> <form method="get" action="xxx.aspx"> <li>用户名:<input id="inpupt1" type="text" /></li> <li>密码:<input id="inpupt1" type="text" /></li> <li><input type="submit" value="登陆"/></li> </form> </ol> </div>
说实话我看出来的第一个错是“登陆”,应该是”登录”,大学毕设的时候,导师刻意纠正的,我就在想是不是该指出来。。。
主要错误就是id重复、post表单元素需要name属性在服务器获取,密码的类型应该是password、表单方法应该是post,我不确定form这么奇葩的位置是不是正确,即使放到外面也不会把div提交啊
2. onclick与addEventListener
<div id="test">Click Here</div>
var node=document.getElementById('test'); node.onclick=function(){ console.log('1'); } node.addEventListener('click',function(){ console.log('2'); },false); node.onclick=function(){ console.log('3'); } node.addEventListener('click',function(){ console.log('4'); },false);
这个就是onclick会被覆盖,addEventListener会依次添加,这样就会输出2,3,4
3. 常识,哪些有错,应该是都没有错
var a= a||null; //null var b= c||null; //null var c= typeof f; //undefined
这个题看起来简单,实际还是很有意思的,尤其是第二个,如果改为 var b= d || null; ,这样就会报错了。
4. 数组和引用
var a=[0],b=a; b[0]=2; console.log(a+b); //22 a=[0], b=a, b=[1]; console.log(a+b); //01
这个题最有意思了,有几个知识点,首先[0]这样的写法是定义了一个数组,只有一个元素0,然后就是关于引用的知识了,前后两个还是有一定混淆度的,最好玩儿的是全明白了,很容易写出两个数字相加的结果,实际上会调用数组的toString方法,然后拼接字符串,这道题能做对的同学肯定是很细心的。
5. 闭包
function test(){ var a=0; var node=document.getElementById('test'); node.onclick=function(){ b=0; console.log(a++ + ++b); } for(var i=0;i<10;i++){ node.onclick(); } } test();
这个会输出从1到10,由于闭包原因,a的值会一直保留,而b每次都会被重置为0
6. 类似闭包,改错
function test(){ var param=1; var node=document.getElementById('test'); node.onclick=function(){ console.log(param); } return node; }
这个我一看不知道错在哪里,或者说他希望我改成什么样,于是就这样了
function test(){ var param=1; var node=document.getElementById('test'); (function(n){ n.onclick=function(){ console.log(param); } })(node); return node; }
7. 然后就是window.onload和jQuery的ready区别
老生常谈,因为当时时间充裕,就卖弄的写了一下实现原理
8. setTimeOut和setInterval区别
这个之前写过篇博客setTimeout()和setInterval() 何时被调用执行中说过,除了其本身调用次数区别,主要是时间参数处理时机问题,setTimeOut是n毫秒后执行,setInterval是间隔n毫秒执行一次,无论函数本身调用执行占多少时间,顺别提了提JavaScript单线程导致时间并不精确的问题。
9.为字符串添加一个count方法,统计字符串中’H’出现的次数
这个没有想到比较好的办法,就用数组处理了,不知道大家有没有什么其它办法
String.prototype.count=function(){ return this.split('H').length-1; }
就记得这几个了,最后问了一些现在工作的问题,由于暂时没太想跳槽,没太详细说。之后技术哥哥说我前端比后台技术要好多了,听起来很惭愧的感觉,果真.net答的很让人失望。
总结
1. 这段日子确实疏忽了对.net基本知识原理的学习,很多知识都是一知半解,需要研究原理
2. 对一些公司不使用的热门技术没有足够重视,没有去主动学习
3. 对前端一些知识了解不够深入