add(2)(5)的JavaScript累加以及从中发现的小疑惑

上周五去面试,最后面试官说做道题吧。就直接扔了张纸过来,上面就写了两行

add(2,5)           //7
add(2)(5)          //7

我一看,这不简单嘛!于是洋洋洒洒写下了

    const add = (a)=> (b)=> a + b;

写完还想怎么这么简单。果然,面试完回来上网查了一下,原来面试官想要的答案是随意参数累加啊!
实现这个功能,我想了几个关键的地方:

  • 对于不确定个数的参数,可以用ES6的rest参数,详情看阮老师的教程,当然也可以用es5的arguments类数组对象
  • 实现累加的方法 Array.prototype.reduce(),或者forEach()也行.
  • 因为实现累加的函数调用accu()返回的还是函数,所以需要重写accu的valueOf方法,以返回需要的累加值。

说到valueOf,就简单说一下。

在下面两种情况下,函数会自己调用valueOf()或者toString()

  • 函数的返回值不是基本数据类型(Number,String,Boolean,null,undefined)
  • 函数的 valueOf() 和 toString() 任一或两者被override
    在 valueOf() 和 toString() 都被override的情况下,会优先调用valueOf(),如果valueOf()返回的不是基本数据类型,再调用toString()
    于是,答案应该是下面这样。
    const add = (...args)=> {
        let sum = args.reduce((pre,crt)=> pre + crt);
        const accu = (...args2)=> {
            sum += args2.reduce((pre,crt)=> pre+crt);
            return accu;
        }
        accu.valueOf = ()=> sum;
        return accu;
    }
add(2,3,4)        // 9
add(2)(5)         // 7
add(2,3)(5)(1) //  11
小疑惑
  • 返回值是Symbol
  • valueOf()以及toString()的返回值都不是基本数据类型
    在以上两种情况下 把返回值在控制台打印出来是这样的
    #<Function>

测试代码如下:

const testA = ()=> {
    const fn =()=> {
      console.log('called');
      return fn;
    }
    fn.valueOf = ()=> {
      return [];
    }
    fn.toString = ()=> {
      return {};
    }
    return fn;
  } 
  console.log(testA()());

这个** #<Function>** 是什么,有没有大神解答一下,好人一生平安!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容