阿里巴巴前端二面-2018.03.26

下午课上接到了阿里二面的电话,当时不太方便就约了晚上八点。可是八点的时候我精神不太好,有点困,思路不太流畅….也不知道二面结果如何了。不过二面面试官真的很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代码判断错误问题

【题目】小明使用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写出二分查找代码

【题目】用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…我以前的博客写过),和易达这个项目。。

后来问了问我Java和C++的区别

从内存方面讲,C++给程序员的自由度很高,在允许的范围下可以自己分配内存。而Java就不能,Java有自己的内存机制。后来说了说GC,本来想借此提到JS的垃圾回收的,面试官没给我这个机会,他就往下面问了…
还问了些我在学校里学了什么课程,如实回答就好了。

问了我为什么会学习前端。

….

我问的问题是,如何学好前端?

这里总结一下面试官给我的经验:
首先学好web基础,好好学透JS高程,看看JQ源码,多了解JS底层的API(因为我前面忘了replace可以传函数的…),以及了解一下ES6的规范,去github上看看那些优秀的开源库的源码。总之自己多学多做多实战,后来再看那些React和Vue框架等等。
嗯,这些我一定要去看的,这里立个flag。

后来就加了面试官微信,嘿嘿。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值