前面的话
分享几题阿里的基础面试题,题目来自小柒看的一场直播课上的。
解析
(1)下面的代码输出结果
var test = (function(a) {
this.a = a;
return function(b){
return this.a+b;
}
}(function(a,b){
return a;
}(1,2)));
console.log(test(4));
解析:
-
首先test是一个立即执行函数的结果,这个立即执行函数里的参数:
function(a,b){ return a; }(1,2)
也是一个立即执行函数,这个函数执行后返回a,即1。所以test可以变为:
var test = (function(a) { this.a = a; return function(b){ return this.a+b; } }(1));
-
再来看剩下的立即执行函数:
-
this.a = a ,考查this的指向问题,这里是普通函数的调用,this指向window,
即window.a = 1; -
这个立即执行函数返回又了一个函数,即test又可以变为:
var test = function(b) { return this.a + b; }
这里的this同样指向window,即window.a + b;
-
-
最后console.log(test(4)),4传给上面的参数b,最后结果 1+ 4 = 5。
(2)不使用循环,如何让长度为100的数组的元素为相应的索引。
解析:
这题有很多解法:定时器、递归等,但是面试官其实最想要的是数组的map方法。
这里直接给出使用map方法实现的过程:
var crr = new Array(100).join(',').split(',');
crr = crr.map(function(item, index){
return index;
})
console.log(crr);
因为map方法只会将数组中有值的项进行操作。所以如果只定义一个100长度的数组map是不起作用的。先用join方法将数组转为全为逗号的字符串,再用split方法将字符串以,进行分割,转为数组。这样数组就元素就全为‘,’,解决了数组值为空的问题。
(3)如何优雅的实现数组乱序(洗牌算法)?
解析:
这题考查的同样是数组的方法:sort()。
var arr = [4, 1, 6, 7, 5, 6, 9,8];
arr.sort(function(a, b) {
return Math.random()>0.5? 1: -1;
})
console.log(arr);
随机生成0.01 ~0.99 的数,比0.5大返回1,表示a>b不交换位置;比0.5小,返回-1,表示a<b,a与b换值。这样只要返回-1,a和b就会交换,达到了乱序的效果。
(4)如何优雅的计算出数组前十位的和?
这里考查的是数组的reduce方法
var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13];
// 先截取前10位,再使用reduce方法
arr = arr.splice(0,10).reduce(function (pre, crr, index,array) {
return pre + crr;
})
console.log(arr);
总结:前面都是考查的一些高阶函数的使用,数组的5个迭代方法都属于高阶函数。 详细了解高阶函数