2016春季阿里游戏前端实习生笔试题

闭包问题

var fun = (function(a) {
    this.a = a;

    return function(a) {
        a += this.a;
        return a;
    };
}(function(a) {
    return a;
})(1));

console.log( fun(4) ); // ?

好好想想看,答案是?这个 this 究竟可不可以传递到闭包里面呢?
























> 5

我写了 NaN ,真是呵呵。
事实上,返回的闭包无论有多少层,this 都是指向顶层父函数的 this


最优雅地实现:

若一个数组 arr 长度为 0,则添加一个元素(1,数字类型),否则根据先进先出移除一个
请写出代码。。。
























// 温习功课:尾进push,尾出pop;头进unshift,头出shift

arr.length ? arr.shift() : arr.push(1); // 10分的题目只拿了8

面试的时候,面试官说最优雅的实现应该是:

arr == '' ? arr.shift() : arr.push(1); // 原理:隐式转换(toString / valueOf)

不使用循环生成长度为100的数组 array ,对应值为其下标

想想看可以怎么实现?

























我只想到了用递归

function generator(arr) {
    var len = arr.length;

    if (len < 100) {
        arr[len] = len;
        return generator(arr); // (这里我忘了加return,我醉了...)
    } else {
        return arr;
    }
}

var array = generator([]);
console.log(array); // [0, 1, 2, ..., 99]

将上述数组乱序

想想看能如何实现?

























我能想到的就是使用 Math.random * 100
但我错用了 Math.round
四舍五入会导致访问溢出(不存在 a[100] )!!!

温习功课:Math.random 返回值区间为 [0, 1)
因此,最好使用 Math.floorparseInt

网上搜了一下,原来还有更加优雅的办法:

array.sort(function() {
    // 返回值小于0则调换位置,否则不变
    return 0.5 - Math.random();
});

console.log( array ); // (乱序的array)

请优雅地将上述乱序数组的前十项求和

一定要优雅哦~

























我天真地使用了 forEach ,但这是一个大坑:forEach 不支持中断(break 报错,return 无效)。。。
网上搜了一下,发现最优雅的是

eval(array.join('+'))

但这只是针对整个数组求和。So?我也母鸡。。。


请使用正则匹配九游所有的二级域名及其服务

例如:http://a.li.9game.cn/hello/world?ie=utf-8&q=haha&f=&m=true 这样都要匹配到(请注意 query 中 f 为空值)。
正则绝对是要考的啦~~~快快想想怎么写吧,不许先偷看答案哦!
























// 我事后拼命挤出来的。。。
var reg = /((http|https):\/\/)?(\w+.)*9game.cn(\/\w+)*(\??([^?=&]+=[^?=&]*)&?)*/g;

如果以上的正则属于核心代码,对性能要求很高,并且修改发布也是高风险操作,容易影响全局,你会做一些什么工作来 保证每次发布的修改、性能都是可衡量的,出问题的概率是最低的

这应该属于开放性题目,好好想想,别急着看答案~
























下面是我的原答案,拿了满分:

单元测试:写相对刁钻的测试用例重复测试,测试过程中记录执行时间与消耗资源。

最高性能地往body中插入十行无序列表,每行显示“第N行”

























var ul = document.createElement('ul');
    i = 0;

while (i < 10) {
    var li = document.createElement('li');
    li.innerHTML = '第' + ++i + '行';
    ul.appendChild(li);
}

document.getElementsByTagName('body')[0].appendChild(ul); // 这里扣分了。面试官说这样子会遍历文档,性能不算最高,请直接使用 document.body。。。

如果是直接往 body 中直接 append 10个 p,则建议使用 document.createDocumentFragment() 一次性插入。


摆脱回调地狱的异步编程解决方案有哪些?用一句话描述其优/缺点


























请参考 《Javascript异步编程的4种方法 - 阮一峰的网络日志》


JS实现继承的方式有哪些?哪种是你最推荐的?为什么?


























请参考 《Javascript 面向对象编程 - 阮一峰的网络日志》(三篇)


如何捕获生产环境下的报错代码?


























在项目中我是通过监听 window.onerror,然后Ajax上传错误信息到后台


根据雅虎军规,前端的 html / js / css / 图片 该如何优化?


























请参考《前端开发面试题》


上述工作如何自动化?


























我的答案只拿了7分(满分8分):

前端部分:利用 grunt / gulp / webpack 构建工具(及其插件)实现自动化
后端部分:利用镜像(Docker等)以便于实现大规模部署

日常开发如何调试?有什么辅助工具?


























请自行百度吧亲。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值