为了账号安全,请及时绑定邮箱和手机立即绑定

看一个题,谁能帮忙解释一下?这是一个关于reduce递归

看一个题,谁能帮忙解释一下?这是一个关于reduce递归

海绵宝宝撒 2019-03-13 17:15:31
看以下题目:var f = (function() {    let r = 1;    return function(...args){        r *= args.reduce((p, n) => p + n);        f.valueOf = () => r;    // 主要是这句代码,完全懵B        return f;    }}());+f(1,2,3)(2,3)(3,4,5)(6,7)// 输出值为(1+2+3)*(2+3)*(3+4+5)*(6+7)的计算结果考虑到用到的知识点reducevalueOf递归...(涉及的没提到的)
查看完整描述

4 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

1 reduce 配合 args 解构用来求每一个圆括号里面的和


const sum = (...args) => args.reduce((i, j) => i + j)

2 每次圆括号执行f都会再返回这个f,保证了这个f后面可以跟上无限多个圆括号


var j = (function() {

  return function () {

    console.log('yo')

    return j

  }

}())


j()()()() // yo yo yo yo

3 立即执行函数保证了每有一个圆括号都立即、顺序执行


var f = function() {

    let r = 1

    return function f(...args){

        r *= args.reduce((p, n) => p + n)

        console.log(args) // 第一个圆括号就不执行了

        f.valueOf = () => r

        return f

    }

}

4 如果你只想得到返回的 f 函数,或者是只想让这个 r 存在于各个层级 f 的上下文中的话,valueOf 都没有出现的意义,但是如果你想从 f()()() 中把 r 取出来,就需要 valueOf 了。最后的加号会用到他,这里就返回当前上下文中的 r。


var f = (function() {

    let r = 1

    return function f(...args){

        r *= args.reduce((p, n) => p + n)

        if (args.length == 2) return r // 如果你能找另外一个方式把 r 输出也是可以的

        return f

    }

}())

console.log(f(1,2,3)(2,3,5)(3,4,5)(6,7))


查看完整回答
反对 回复 2019-03-23
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

你懵逼的地方恰好是重点,你需要知道的是 .valueOf 是干嘛用的

举个最简单的例子你体会一下:


var obj = {};

obj.valueOf = function () {

  return 3;

}

console.log(obj + 4); // 7

简单来说,.valueOf() 会指定对象参与运算时的值,更详细的说明你可以查阅文档。


知道了这一点,回到这道题。

他想让我们实现的是:


+f(1,2,3)(2,3)(3,4,5)(6,7)

// 输出值为(1+2+3)*(2+3)*(3+4+5)*(6+7)的计算结果

首先你看到这么多括号连在一起,基本上肯定是闭包+递归了,

那么大致的思路是:


f() 可以对参数列表求和

f() 的返回值仍然是 f,它继续对参数列表求和,并且和上次的和相乘

+f 的结果是乘法操作的结果,所以要实现 f.valueOf()

因此就有了以下解答


var f = (function() {

    // 乘法运算的结果,初始为 1

    let r = 1;

    return function f(...args){

        r *= args.reduce((p, n) => p + n);

        f.valueOf = () => r; // 实现 +f 的值为乘法结果

        return f;

    }

}());

希望对你有帮助


查看完整回答
反对 回复 2019-03-23
?
慕森王

TA贡献1777条经验 获得超3个赞

valueOf方法一般是交由JS去隐式调用,在数值运算里,会优先调用valueOf(),如a + b;
这里重写了valueOf,因此只要是数值运算时会先调用valueOf返回r

查看完整回答
反对 回复 2019-03-23
?
MMTTMM

TA贡献1869条经验 获得超4个赞

这个 f 是惰性计算的形式,算一个知识点,它能在缓存结果的同时将新的计算延迟到需要的时候。

其他的就如同 @SevenOutman 所说了。


查看完整回答
反对 回复 2019-03-23
  • 4 回答
  • 0 关注
  • 601 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信