先看看这次收到的面试题:
相对于前三季的面试题,这次的题型不再局限在知识点上,而是更考验逻辑性、知识点的运用能力、实际解决问题能力,还有与实战开发紧密接合的内容,可谓干货满满!
因此本次的讨论,对于有些题型,我们想与大家共同探讨,而非给出所谓参考答案。面试题活动进行到这个阶段,希望再上一个台阶,借着这个过程可以与大家一起交流思想、共同探讨一些原理性的内容和具体的方法论,期待此举能够引发大家思考、共同提升技术!
UC国际前端笔试题
1. 现有一数组 a,长度未知,数组每一项的数据类型约定为 Number,请用 JavaScript 实现以下逻辑:(5分)
- 如果 a 的长度为零,则为其添加一个新项,值为 1。
- 如果 a 的长度不为零,则按照 先进先出 的原则,移除一项。
- 评分标准:代码越精简越好,<=30 字符 10 分,<=35 字符 6 分, >35 字符 3 分(空格不算)
参考答案
a[a.length?'shift':'push'](1);
// 纯数组方法的使用,只要知道数组这几个方法的用法就能看明白,就不展开分析了。
2. 请阅读以下代码,并把运行结果写到下方注释中。(5分)
var func = (function(a) {
this.a = a;
return function(a) {
a += this.a;
return a;
}
})(function(a, b) {
return a;
}(1, 2));
// func(4) = _________;
参考答案
5
分析
- 首先 var func = 后面是一个自执行函数
(function(a) {
this.a = a;
return function(a) {
a += this.a;
return a;
}
})
- 执行上面函数的时候传入了另外一个自执行函数:
function(a, b) {
return a;
}(1, 2)
- 执行上面函数,返回的结果为 1
- 把 1 作为参数传给了第一个自执行函数
(function(a) { // a = 1
// this 为 window,this.a = 1,等于 window.a = 1;
this.a = a;
// 返回内部函数
return function(a) {
a += this.a;
return a;
}
})(1)
- 上面自执行函数执行完成后返回一个内部函数,赋值给了 func,也就是
var func = function(a) {
a += this.a;
return a;
}
- 调用 func(4)
function(a) {
// 注意这里的a是局部(参数)变量,this是window
// a = a + this.a;
// a = 4 + 1
a += this.a;
// 返回结果 5
return a;
}
3. 用 JavaScript 实现以下功能:
不使用 loop 生成一个长度 n=100,每一项的数据类型为 Number,值等于其下标的数组 array。(5分)
参考答案
var arr = [];
~function(n) {
if (n < 100) {
arr.push(n);
arguments.callee(arr.length);
}
}(0);
// 不用循环就把事给办了~嗯,逻辑也不算复杂,分析就略过吧。
// 有问题可在底下留言,我们会去回复大家问题的。
6. 列举 3 种提取网页所有链接的方法,并说明其优劣。(5分)
参考答案
- 方法一:通过 DOM 分析
var aElements = document.querySelectorAll('a');
for (var i=0; i < aElements.length; i++) {
if (aElements[i].href) {
console.log(aElements[i].href);
}
}
- 方法二:通过正则匹配
var docHtml = document.documentElement.innerHTML;
var data = [];
docHtml.replace(/<a[^>]*href=(['"])([^>'"]+)\1[^>]*>/gi, function($0, $1, $2) {
data.push($2);
});
console.dir(data);
目前所列这两种方法算是抛砖引玉吧,不知道大家是否能想出第三种方法?可在底下留言,我们共同探讨哈~
如果网页中存在动态生成的链接地址,列举3种提取地址的方法?(5分)
ㄒoㄒ~~~
发这表情是有原因的,何谓 “动态生成的链接地址?”,结合第一个提问,面试官究竟在考核什么知识点?有高人能 真正 明白的,可否告之一二?大家共同探讨。
提取所有链接地址后,请问有什么方法找出具有相同结构规则的链接地址?(5分)
参考答案
这个规则还是有点模糊,比如字母数字中横线混合的算是同类结构吗?如果简单点话,那么可以按照协议、域名、端口、目录进行初步提取,目录方面再根据类型,比如字符、数字规则进行提取。
这道题答的有点累心,主要是不明其意,如若面试过程中被问到这些不太清楚题意的题目,还是仔细问清楚考官究竟要考什么,问清楚了再答不迟。或许是我们理解能力不够吧……继续这个表情:ㄒoㄒ~~~
7. 请用 JS 编写正则,对符合规则的白名单 url 地址替换为可点击的超链接。(10分)
白名单为:*.http://uc.cn 所有的二级域名,以及在其下的所有服务
var content = "欢迎访问 http://web.uc.cn/guild/home 以上就是我要说的,谢谢。"
//code here
var regex = ______________________________________;
console.log( content.replace(regex, '<a href="$1">$1</a>') );
参考答案
/(http|https):\/\/([a-zA-Z\d]+\.)*uc\.cn(\/[a-zA-Z\d]*)*(\.[\w\-]+)*\/?(\?([\w\-\.,@?^=%&:\/~\+#]*)+)?/
// 要是正则不太明白的童鞋,看到这儿估计会晕……你说咋办?要么看妙味视频自己研究,要么就来实体学习吧……
// 再不然,“从入门到放弃?”
8. 如果以上的正则属于核心代码,对性能要求极高,并且修改发布也是高风险操作,容易影响全局。你会做一些什么工作来保证每次发布的修改,性能都是可衡量的,出问题的概率是最低的?(10分)
参考答案
单元测试: 写相对刁钻的测试用例重复测试,测试过程中记录执行时间与消耗资源。