【算法】牛客网前端算法(20-30)

来源:牛客网     链接:https://www.nowcoder.com/ta/js-assessment

1.

//将数组 arr 中的元素作为调用函数 fn 的参数 
function argsAsArray(fn, arr) {
return fn.apply(this,arr);
}

2.

//将函数 fn 的执行上下文改为 obj 对象 
function speak(fn, obj) {
return fn.call(obj);
}

3

//实现函数 functionFunction,调用之后满足如下条件:
//1、返回值为一个函数 f
//2、调用返回的函数 f,返回值为按照调用顺序的参数拼接,拼接字符为英文逗号加一个空格,即 ', '
//3、所有函数的参数数量为 1,且均为 String 类型 

function functionFunction(str) {
    return f=function(s){
        return str+', '+s;
    };
}

4.使用闭包

//实现函数 makeClosures,调用之后满足如下条件:
//1、返回一个函数数组 result,长度与 arr 相同
//2、运行 result 中第 i 个函数,即 result[i](),结果与 fn(arr[i]) 相同 

//评论中很好的总结了闭包问题https://www.nowcoder.com/questionTerminal/578026cd24e3446bbf27fe565473dc26

/*常犯错误

function makeClosures(arr, fn) {
var result=[];
    for(var i=0;i
        result[i]=function(){
                return fn(arr[i]);
        };
    }
    return result;
}

*/


function makeClosures(arr, fn) {
var result=[];
    for(var i=0;i         result[i]=function(num){
            return function(){
                return fn(num);
            };
        }(arr[i]);
    }
    return result;
}


5.

//已知函数 fn 执行需要 3 个参数。请实现函数 partial,调用之后满足如下条件:
//1、返回一个函数 result,该函数接受一个参数
//2、执行 result(str3) ,返回的结果与 fn(str1, str2, str3) 一致 
function partial(fn, str1, str2) {
    return f=function(str3){
        return fn(str1,str2,str3);
    }
}


6.

//函数 useArguments 可以接收 1 个及以上的参数。请实现函数 useArguments,返回所有调用参数相加后的结果。本题的测试参数全部为 Number 类型,不需考虑参数转换。 
function useArguments() {
var sum=0;
    for(var i=0;i         sum+=arguments[i];
    }
    return sum;
}

7.

//实现函数 callIt,调用之后满足如下条件
//1、返回的结果为调用 fn 之后的结果
//2、fn 的调用参数为 callIt 的第一个参数之后的全部参数 
function callIt(fn) {
    var arg=Array.prototype.slice.call(arguments,1);
    var res=fn.apply(this,arg);    //不能直接使用fn(arg),因为fn中的参数为具体的参数,非一个数组
    return res;
}


8.

//实现函数 partialUsingArguments,调用之后满足如下条件:
//1、返回一个函数 result
//2、调用 result 之后,返回的结果与调用函数 fn 的结果一致
//3、fn 的调用参数为 partialUsingArguments 的第一个参数之后的全部参数以及 result 的调用参数 
function partialUsingArguments(fn) {
    var a=Array.prototype.slice.call(arguments,1);  
var result=function(){
        var b=Array.prototype.slice.call(arguments);  
        return fn.apply(this,a.concat(b));
    }
    return result;
}

9.

//已知 fn 为一个预定义函数,实现函数 curryIt,调用之后满足如下条件:
//1、返回一个函数 a,a 的 length 属性值为 1(即显式声明 a 接收一个参数)
//2、调用 a 之后,返回一个函数 b, b 的 length 属性值为 1
//3、调用 b 之后,返回一个函数 c, c 的 length 属性值为 1
//4、调用 c 之后,返回的结果与调用 fn 的返回值一致
//5、fn 的参数依次为函数 a, b, c 的调用参数 
function curryIt(fn) {
return a=function(str1){
        return b=function(str2){
            return c=function(str3){
                return fn(str1,str2,str3);
            }
        }
    }
}


10.

//返回参数 a 和 b 的逻辑或运算结果 
function or(a, b) {
return a||b;
}

你可能感兴趣的:(算法)