链式调用和argument【10bet】

来源:http://www.chinese-glasses.com 作者:Web前端 人气:104 发布时间:2020-05-06
摘要:时间: 2019-09-06阅读: 100标签: argument面试题目(头条): step 1:编写add函数,实现add(1)(2)(3)输出6 遇到这个题,我们的第一反应是利用闭包每次返回一个函数,在其中做加法运算 设计一个

时间: 2019-09-06阅读: 100标签: argument面试题目(头条):

  • step 1:编写add函数,实现add(1)(2)(3)输出6
    遇到这个题,我们的第一反应是利用闭包每次返回一个函数,在其中做加法运算

设计一个sum函数,使其满足以下要求

sum(1, 2).sumOf() // 返回 3

var add=function(x){
    return function(y){
        return function(z){
            return x+y+z
        }
    }
}
add(1)(2)(3)  //输出6

sum(1, 2)(3).sumOf() // 返回 6

但是这样的函数必须按照特定的方式调用,如果使用add(1)(2)(3)(4)就不适用了

sum(1)(2, 3, 4).sumOf() // 返回 10

  • step 2:可以不限调用的次数

10bet,sum(1, 2)(3, 4)(5).sumOf() // 返回 15

答案解析:

var add=function(x){
    var sum=x;
    var tmp = function(y){
        sum+=y;
        return tmp;
    }
    tmp.valueOf = tmp.toString = function(){
        return sum;
    }
    return tmp;
}
add(1)(2)(3)(4)(5)  //输出15

这道题目主要考察以下两点:

分析以上函数,第一次调用add返回了一个临时创建的函数tmp并将第一个参数值存储在变量sum中,因为闭包tmp可以访问到sum,并在tmp中将sum与当前tmp的参数进行相加更新sum变量,实现加法。但是这样计算完成后返回的还是一个函数,最终并不能输出我们的结果。JavaScript中,打印和相加计算,会分别调用toString或valueOf函数,对于加法运算,valueOf比toString优先级更高。 所以我们重写tmp的toString和valueOf方法,返回sum的值。

函数参数arguments的应用;函数的链式调用实现;

  • step 3:不限制形参的个数,例如add(1,2,3)(4)能输出10

arguments

arguments对象是函数(非箭头)内部都可以访问到的局部变量,该对象是一个类数组对象,具有数组的length,索引特性。

var add=function(){
    var args=[].slice.call(arguments);
    var tmp = function(){
        //收集参数到args数组
        args = args.concat([].slice.call(arguments));  
        return tmp;
    }
    tmp.valueOf = tmp.toString = function(){
         return args.reduce(function(first,second){
                return first+second;
        })
    }
    return tmp;
}
add(1,2,3)(4,5)(6)  //输出21
function print () { console.log(arguments[0]); console.log(arguments[1]); console.log(arguments[2]); console.log(arguments.length); // 3}print(1, 2, 3);// 利用arguments的索引特性,call、apply函数,可以使用数组的方法Array.prototype.shift.call(arguments);// 将arguments转为数组,Array参数为一个,并且是整数时,表示数组长度,超过一个时表示数组元素var args = arguments.length == 1 ? [arguments[0]] : Array.apply(null, arguments);

由于每次调用时参数的个数不确定,所以相比step2我们需要将求和的操作替换成参数收集的操作,通过链式调用将所有的参数收集到args数组中,对这个数组求和,返回最终的结果。

链式编码原理

本文由10bet发布于Web前端,转载请注明出处:链式调用和argument【10bet】

关键词:

最火资讯