阿⾥Node.js⾯试题集合
1.
前提说明:
⾃⼰是在北邮论坛中的学长内推,当时与学长问了关于阿⾥前端中是否有偏向JavaScript开发(中间件,⼯具库)的⽅向,学长说只有杭州有类似岗位,最后把我内推到了淘宝UED的团队去了。
简历说明中侧重讲了关于Node.js的经历,JavaScript轮⼦的介绍以及⼀些使⽤了Node.js技术栈的Web项⽬。这点对于前端实习也是⼀个加分项。
⼀⾯:
原生js和js的区别⼀⾯⾯试官问了⼤概有4年开发经验(包括了Java和JavaScript),上来除了标准的⾃我介绍以外,⼤概主要谈论了关于
Node.js,JavaScript语法以及Web开发的领域,对简历中提到的项⽬稍微深⼊问了⼀下。
1. babel或者coffee Script的这些编译到JS的语⾔是如何⼯作的?
这个问题是最纠结的,因为不太清楚⾯试官想问什么,⼤概说了关于Parse的东西,后⾯补充了关于babel的递归引⽤JS⽂件处理的东西,估计有问题。
2. JavaScript的Async库基本原理是什么?
这个⽹上都有,就是Async的parrllel,waterfall的简单实现,讲出了把callback function替换this域,⽤⼀个list来遍历执⾏,把最终的error或者result参数填回到Async.parallel([functionList], callback(err,result))中,差不多
3. 你写的Functional.js中monad, curry, lazy的解释和意义?
基本⾯向简历的作品,讲解了⼀点关于monad的简单意义(包裹,传递流,防⽌外部更改),curry化对JS库函数的意义,还有lazy list 或者range对于那种⼤量数据处理的好处什么的。
4. Node.js框架同其他语⾔框架的⽐较?
答出Node.js特⾊的⾮阻塞IO和异步性,和Python的Flask对⽐,再讲解⼀下express中间件这种模式的特点,差不多了
5. Node.js与Swift在Web领域的未来?(因为我简历写了iOS开发和Swift)
随便扯吧……就是强类型的问题,基于原型⾯向对象优劣,语法糖的问题,还有⽀持库什么的。
其他就是⾃由提问,知道了阿⾥淘宝对前端实习要求基本不⾼,主要是JS熟悉,会Node有加分,⽽且没有固定谁来切图谁写JS,⼀般都会⼀点跨栈的东西。
⼆⾯:
(⼆⾯充分暴露了⾃⼰的若菜本质)。⾯试官是Winter,就是那个知乎的温兆伦的Winter(P8)。⼆⾯是电话+⽹页coding的部分,需要在电脑,⽹络OK情况下进⾏,要⾃⼰提前准备好(不⾏就说明改个时间……)。开始电话问了⼀些关于JS的东西,什么闭包,Node.js的require依赖顺序什么的……之后就开始正式⽹页coding。
1. 第⼀题:设计⼀个简单的红绿灯策略,⽐如红灯亮分别为console.log(“red”)这种,要求按照红3s-黄1s-绿1s顺序不断循环展⽰。
这个本来很简单的问题开始愣住了,因为原⽣的setTimeout好久没⽤了,问了问可以使⽤第三⽅库,但原⽣其实有笨办法,就是直接硬编三个setTimeout,时间分别为0,3s,4s,然后最外层⼀个10s延迟的setInterval的来重复。虽然效果但是这肯定不对,因为这直接⽆视了事件发⽣相对顺序,靠着全局时间来实现,长期下去由于JS引擎的延时会最终乱掉。
第⼆种想法,我借⽤了Promise,⼤概就是⽤Promise⾥⾯resolve⼀个setTimeout的函数模拟事件结束,最后由Promsie.then控制流程,好处就是绝对不会出现事件先后顺序错乱,⽽且写起来简单。
1 2 3 4 5 6function button(color, time) {
let p = new Promise( function (resolve, reject) {
setTimeout( function() {
resolve( "Timestamp: " + getTimestamp() + " Color: " + color) }, time);
});
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22});
return p;
}
function flash() {
button( "red", 3000) // after last task end, which means the last task will need 3s
.then( (v) => {
console.log(v);
return button( "yellow", 3000); // last spend 3s
}).then( (v) => {
console.log(v);
return button( "green", 1000); // last spend 1s
}).then( (v) => {
console.log(v);
});
}
1. 第⼆题:算法题,第⼀问是:给定⼀个整数⾦额的整钱n,还有2,3,5元三种货币,要你计算出所有能凑出整钱的组合个数。
(这⾥⼜暴露⾃⼰思维模式问题)应该先从最简单想,假如n=10,把5,3,2元的取的张数定为i,j,k,⼀定要按照由⼤到笑顺序,那么就相当于从i=0,j=0,k=0开始循环,⼀旦组合总⾦额超过n,那么就break停⽌(因为从⼤到⼩取⾦额,最⼩的都⽆法凑出,那么之后再也不能取了),能凑齐就加⼀个组合。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23function countMoney(total) {
if (total < 2) {
return0;
}
var result = 0;
var maxAmount = total / 2;
for ( var i = 0; i <= maxAmount; i++) { // 5 for ( var j = 0; j <= maxAmount; j++) { // 3 for ( var k = 0; k <= maxAmount; k++) { // 2 var sum = i * 5 + j * 3 + k * 2;
if (sum == total) {
result++;
break;
} else if (sum > total) {
break;
}
}
}
}
return result;
}
console.log(countMoney( 10));
笨⽅法,但是外层不会超过 n / max[i],所以复杂度最差也没有到O(n^3)
第⼆问:假如这个能使⽤的货币列表是给定的,意思是输⼊⼀个整数list,⽐如[1,2,3,5],还有⾦额n,求出所有组合数。
现在货币列表不是定的,那么就得想别的⽅法,当时答的时候说要⽤递归,但是最终没写出来(唉……),在之后才写出来。
前提思路⽤的是递归,function countMoney(amount, moneyArr),amount为剩下的⾦额,moneyArr为可以选择的货币列表,返回的是产⽣的组合数,那么初始条件认为amount = n, moneyArr = list(排序,由⾼往低)。取出当前moneyArr(也就是当前最⼤的⾯值
)的货币first,剩下的货币可选⾯额叫做smallerMoneyArr,然后从0到first最⼤能取的个数开始(即 0 ~ amount / first),不断递归调⽤countMoney(remainingAmount, smallerMoneyArr),加起来所有组合数即可。
终⽌条件很简单,如果剩余余额不为0但可选货币为空,那么分割⽅法失败,返回0;如果余额是0,那么分割成功,返回1;搞定。
1 2 3
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29//Recursive DP
var inputMoneyArray = [ 1, 2, 3, 5];
inputMoneyArray.sort().reverse(); // must from higher to lower function countMoney(amount, moneyArr) {
if (amount != 0 && moneyArr.length == 0) {
return0; // no use
} else if (amount == 0) {
return1; // success one
}
var first = moneyArr[ 0];
var smallerMoneyArr = [];
for ( var i = 1; i < moneyArr.length; i++) {
smallerMoneyArr[i -1] = moneyArr[i];
}
var sum = 0;
for ( var i = 0; i <= amount / first; i++) {
var remainingAmount = amount - (first * i);
sum += countMoney(remainingAmount, smallerMoneyArr);
}
return sum;
}
var result = countMoney( 10, inputMoneyArray);
console.log(result); // 20
然⽽……当时⾯试脑抽没想出来,后⾯就问了问⼀些前端开发要求还有⼯作环境什么的就没了……唉,还是没有准备的问题,如果真要⾯试,希望提前准备好⼀点常见题⽬,主要是思维⽅式要对,先最简单(从特例开始,变量假设为固定值),然后推⼴,复习⼀下递归,动态规划什么的就很简单。
三⾯
三⾯还是技术⾯,其实我也没有任何准备(以为⼆⾯挂了),⾯试官是淘宝⼀个P7级别的吧,也是上来⾃我介绍,然后开始问⼀些Node.js 和JS(有前端JS)的问题,基本我全程都没遇到过HTML5,CSS,Web前端框架,构建⼯具等问题……可能是简历导致的吧。
1. 说⼀下关于Node.js的⽂件读写⽅式和实现?
基本解释⼀下fs.readFile,说明异步性,然后⾯试官开始追问:Node.js是单线程,如何实现多个同时的⽂件IO?
紧接着就开始解释Node.js的fs调⽤V8的libuv中的uv_fs_open,绑定JS的callback到⼀个c的函数指针上,然后推⼊事件列表队列
(QueueUserWorkItem),再根据操作系统,Windows下使⽤IOCP来完成异步IO,*NIX上使⽤libev来实现。说明Node.js从上层到V8是单线程,从libuv到IOCP或者libev是多线程IO读写
2. 说⼀下JavaScript⼏种异步⽅法和原理?
基础问题……先说callback function,说明问题,再讲Promise,包括Promise的原理和实现。然后还有co,利⽤generator和yield来实现异步控制,顺便也提到了async和await(虽然ES7还是没有加……简直服了),介绍⼀下使⽤经验,差不多了。
3. 介绍⼀下Session和Cookie?
不⽤解释了吧……服务端随机分⼀个SessionID然后HTTP字段Set-Cookie,内存存⼀个Map -> 浏览器存Session,以后请求都带Cookie字段(值为SessionID) -> 服务端看到Cookie字段,读SessionID对应的Map,执⾏逻辑。
4. 前端⽅⾯,说明addEventListener使⽤?作⽤域?
其实问的是如何给⼀个链接上⿏标事件,先说addEventListener。再追问说,现在IE8和Chrome不⼀致,IE的addEventListener绑定是window,⽽标准是document,如何设计⼀个库来兼容避免对window的污染?
然后讲解⾸先库要做成⼀个全局匿名闭包,接受⼀个listener来处理作为执⾏函数,然后要把window.document保留为内部的变量,然后把listener的this域换位这个闭包的this,就是⼤概这样?由
于不怎么写前端可能是错的……
1 2 3 4 5 6 7 8 9 10 11( function myAddEventListener(type, listener) { var document = window.document;
var that = this;
if (IE) {
attachEvent.bind(that);
attachEvent(type, listener);
} else {
addEventLisener(type, listener);
}
})();
1. 谈谈冒泡和捕获事件的区别,应⽤?
就是Event捕获顺序,前者从底向上,后者从顶向下,说明可以stopPropagation,⼤家都会……
然后就没了,最终谈了谈阿⾥对实习⽣要求不⾼,正式校招实习⽣只有免笔试的优惠,还得⾯试⼀轮,不过也觉得可以了。还知道内推是默认团队的,除⾮再⼈事申请,公开实习可以选择意向。HR⾯还没有,基本上没有意外⼀般不会⼜问题。
总结
前端⼯程师还是⽼⽼实实⼲前端吧,我这个⾯试经历算是特例。其实选择前端是因为阿⾥的后台开发只有Java岗位,⽽且都会考很多J2EE 的东西(Servlet,SSH,设计模式,中间件,JavaBean什么的)感觉很不喜欢(毕竟是实习,想做⼀点感兴趣的东西),iOS开发也只要OC⽽且难度很⾼。其他公司倒有投后台和iOS的,基本上感觉以后还是很⼤可能搞iOS了。
其实如果真想毕业⼯作,⼤三下之前就最好决定⾃⼰⽅向(或者⼀个可选),不要技能栈拉太长,导致深度不够,这是很重要的。⾯试经历,基本上不准备不太可能(我这是特例……),多刷点简单OJ题(实习⾯试coding⼀般很简单),对⼀些框架,技术原理性要掌握(不⼀定实践过),项⽬要写的话⼀定确保⾃⼰还有印象,⽐较熟悉,不然被问到就很⿇烦,基本上这样了。
关于Fundebug
专注于JavaScript、⼩程序、⼩游戏,Node.js和Java实时BUG监控。
⾃从2016年双⼗⼀正式上线,Fundebug累计处理了5亿+错误事件,得到了众多知名⽤户的认可。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论