百度前端二面总结(已过)
前言
昨天,进行了百度第二次前端面试,结果今天中午就通知我过了,准备本周五进行三面,百度的办事效率还挺高的哈。 写这篇文章为了记录和总结一下,已经回顾自己的不足,以及展望下后面的计划。
开始前夕
我听取了一面面试官的建议,花了一周时间捣鼓了一个静态博客,所以我就在简历上加上了我的博客地址,然后发了一份新的简历给二面面试官。 二面面试官比一面面试官「活跃」些,互动也多了些。
视频开始
中午二点,正式开始视频面试,出乎我意料之外的是,面试官居然也露出了庐山真面目。 一开始面试官就吐英语了!听得我一愣一愣的(可能在文字聊天的时候我一直有发okok,让面试官误以为我英语不错),还好没听明白的地方,面试官会翻译。 简单做了一下自我介绍后,面试官便进入了自己的节奏,说明这次面试主要是测试我的编码能力,需要共享我的电脑桌面,看我敲代码。 当时内心还是有点慌的,「怎么跟网上的二面面经不太一样啊!」,于是便开始了出题编码环节。
第一题
/*
用 javascript 语言,手工实现 repeat 函数.两个参数:
1.要重复的原始字符串
2.需要重复的次数
例如:
repeat ('a', 3) => 'aaa'
*/
function repeat (str, count) {
// your code here
}
恩恩,第一题不难,头脑中首先冒出两种方法
function repeat (str, count) {
if(str != undefined && count!= undefined && count>0 && !isNaN(count)) {
// 1
var s ='';
for(var i=0;i<count;i++){
s+=str;
}
return s;
//2
var arr = new Array(count + 1);
return arr.join(str);
}
}
但是,面试官肯定要深问啊,要求我用递归来实现。 当时比较紧张...,思路不是很清晰...,有点乱。 开始是用下面的递归方法:
function repeat(str ,count) {
var s = '';
rep(str,count);
return s;
function rep(str,count) {
if(count<=0) return;
s+=str;
arguments.callee(str,--count);
}
}
面试官还是不满意!让我改进,不用"全局变量" s
,于是修改代码为下:
function repeat(str ,count) {
return rep('',str,count);
function rep(s,str,count) {
if(count<=0) return str;
s+=str;
return arguments.callee(s,str,--count);
}
}
第二题
/*
使用 原生javacript 实现事件代理
例子:
delegate ( containerElement, 'click', 'remove-item', onClick )
会绑定一个事件代理到 containerElement 这个元素, 即是说, 所有在 containerElement 这个容器下的所有 .remove-item 在click事件出现时都会触发 onClick 这个回调
*/
function delegate(parentElem, eventType, className, callback) {
}
第二题也是比较常规的事件委托题目,想了一会儿,还好是想出来了。
function delegate(parentElem, eventType, className, callback) {
if(parentElem.attachEvent)
parentElem.attachEvent('on'+eventType,function (e) {
if(e.srcElement.classList.contains(className)){
callback(e);
}
});
else{
parentElem.addEventListener(eventType,function (e) {
if(e.target.classList.contains(className)){
callback(e);
}
});
}
}
写完后,面试官继续问:有没有方法可以让事件响应更快速点。 额,想了一分钟吧,面试官看我没声音,就直接到第三题了。`
其实,后面仔细想了下,觉得可以将`addEventListener`方法中的第三个参数设置为`true`,也就是按照事件捕获方式响应,
DOM事件流首先要捕获事件(由父结点到子节点),然后是事件冒泡(由子节点到父结点)。
`addEventListener`方法第三个参数默认为`false`,表示事件冒泡处理事件,所以我觉得设置为`true`,应该能够更快的响应事件。
第三题
开放题,考察我学习新知识的能力和方法,让我做出一个跟React中第三个Demo一样的效果(使用React)。 http://facebook.github.io/react/ ...当时我已经是比较懵逼了,就查看源码呗,看下官网上实现这个Demo的源码在哪,然后导入库文件,复制代码试试看咯。 但是当时突然就网络不好了,github上不去了,结果面试官还主动帮我下库文件,600多KB,结果发给我的数据居然是1KB/s,所以最后这道题不了了之。 时间差不多了,就结束了。
总结
最后我才知道一共有四道题目(恩,第四题也不知道是个什么东西)。 从腾讯一面被刷到百度的二面通过,等待三面,真是验证了一句话「机会是留给有准备的人的。」 还有,紧张只会给自己添乱子! 最后我希望三面也能顺风顺水吧。 如果拿到实习offer后,希望在实习的时候也能拿出以往的「折腾、捣鼓」精神,能够顺利转正。