一道前端面试题

今天在逛知乎的时候看见了这样一道题原文链接

写一个mul函数调用时将生成以下输出:
console.log(mul(2)(3)(4)); // output : 24
console.log(mul(4)(3)(4)); // output : 48

一个比较简单的方法

const mul = a=>b=>c=> a*b*c

但是这种办法的参数是写死的,不够灵活,看这种

function mul(x) {
    const result = (y) => mul(x * y); 
    result.valueOf = () => x;
    return result;
}

这个办法用到了递归调用和valueOf方法

  1. valueOf
    有关valueOf的介绍具体可以看Object.prototype.valueOf
    但是这种办法在node.js中valueOf方法并不生效
    下面是改进版,
    function mul(x){
    const result = (y) => mul(x * y)
    result[Symbol.toPrimitive] = hint => {
       if (hint == 'string')
       {
          return x.toString();
       }
       return x;
    }
     result.valueOf = () => x
     return result;
    }
    console.log(-mul(2)(3)(4)); // -24
    console.log(mul(2)(3)(4)); // 24
    console.log(`${mul(2)(3)(4)}`); // 24
    
    这里用到了[Symbol.toPrimitive]方法

hint值是字符串,有三个:default,number和string。一般来讲+链接运算符传入的是default,乘法等算数运算符传入的是number,String(str)传入的是string
好像依然在node.js中不生效,不过可以作为了解扩充一下知识

mode_edit