下午课上接到了阿里二面的电话,当时不太方便就约了晚上八点。可是八点的时候我精神不太好,有点困,思路不太流畅….也不知道二面结果如何了。不过二面面试官真的很nice,会慢慢等我的思路。
二面一开始就是远程敲代码:
【题目】请编写一段js函数,该函数的参数是一个骆驼命名法命名的变量标识符,
函数最终返回该标识符的下划线命名法,如,输入:abcDefGhi,返回:abc_def_ghi
这道题刚开始我直观感受就用的是循环了,但面试官提醒我不要用循环,然后就想到了正则表达式。
代码如下:(面试官提示我replace后面可以用function,然后就做出来了…)
function fun(value) {
let reg = /[A-Z]+/g;
return value.replace(reg,function (char) {
return "_"+char.toLocaleLowerCase();
})
}
console.log(fun("asdaBasdZasdk"));//asda_basd_zasdk
【题目】小明使用js编写了一个dog类,该dog类有一个方法bark,
bark方法会在执行完毕之后间隔1秒继续调用自己,以下是小明写的代码,
请看下他写的有什么问题?如果有问题,如何改造?
function Dog(){ }
Dog.prototype.bark = function(msg){
console.log(msg);
setTimeout(function(){
this.bark(msg);
},1000);
};
let d = new Dog();
d.bark("wang");
这道题,我刚开始竟然说setTimeout是不会重复调用的,它只是一个延时执行函数。噗,经面试官提醒,里面又调用了bark方法….好吧,一开始没看清。
然后发现this指针有问题,面试官问我怎么改,我修改的代码如下:主要就是把当前this传进去。
function Dog(){ }
Dog.prototype.bark = function(msg){
console.log(msg);
setTimeout(function(target){
target.bark(msg);
},1000,this);
};
let d = new Dog();
d.bark("wang");
面试官好像不太同意这种思路…然后他又出了一道题。
2018.03.28修改:
突然想到了箭头函数,就觉得面试官应该是要我这样做的:
function Dog(){ }
Dog.prototype.bark = function(msg){
console.log(msg);
setTimeout(()=>{this.bark(msg)},1000);
};
let d = new Dog();
d.bark("wang");
对,bingo.
【题目】用js写一个折半查找(二分查找)函数
这道题肯定难不倒我的:
function bfind(array,target){
let left = 0;
let right = array.length-1;
let mid;
while(left <= right){
mid = Math.floor((left+right)/2);
if(target>array[mid]){
left = mid +1;
continue;
}
if(target == array[mid]){
return mid;
}
if(target < array[mid]){
right = mid-1;
}
}
return -1;//没找到
}
然后面试官要我不要用循环,用递归实现。
…..
好吧,那就递归:
function bfinds(array,target){
let left = 0;
let right = array.length-1;
return fun2(array,left,right,target);
}
function fun2(array,left,right,target){
let mid = Math.floor((left+right)/2);
if(target === array[mid]){
return mid;
}
if(left>=right){
return -1;
}
if(target > array[mid]){
return fun2(array,mid+1,right,target);
}
if(target < array[mid]){
return fun2(array,left,mid-1,target);
}
}
console.log("result:",bfinds([1,2,3,4],4));
刚开始做完的时候犯了两个错误,一个是在递归里面对数组用了slice方法,然而传进去的仍然是left和right,所以出问题了。另一个方面是我改过来之后发现在bfinds
方法里没有返回fun2方法,所以一直打印的undefined。。。
代码敲完了之后面试官就开始和我聊我的简历,面试官说我的简历写的太简单了…不过确实,面试官都没啥好问的,真尴尬。后来面试官就和我聊了聊项目里提到的websocket,以及聊天室后台怎么搭建的(我用的是Java…我以前的博客写过),和易达这个项目。。
从内存方面讲,C++给程序员的自由度很高,在允许的范围下可以自己分配内存。而Java就不能,Java有自己的内存机制。后来说了说GC,本来想借此提到JS的垃圾回收的,面试官没给我这个机会,他就往下面问了…
还问了些我在学校里学了什么课程,如实回答就好了。
问了我为什么会学习前端。
….
这里总结一下面试官给我的经验:
首先学好web基础,好好学透JS高程,看看JQ源码,多了解JS底层的API(因为我前面忘了replace可以传函数的…),以及了解一下ES6的规范,去github上看看那些优秀的开源库的源码。总之自己多学多做多实战,后来再看那些React和Vue框架等等。
嗯,这些我一定要去看的,这里立个flag。
后来就加了面试官微信,嘿嘿。