Js面试题。,都有哪些比较好的解法?

实现一个函数,运算结果可以满足如下预期结果:

add(1)(2) // 3
add(1, 2, 3)(10) // 16
add(1)(2)(3)(4)(5) // 15

阅读 4.9k
8 个回答
    function add(...values) {
        let sum = 0;
        for (key of values) {
            sum += key;
        }
        let tmp = (x) => {
            sum += x;
            return tmp;
        };
        tmp.toString = () => sum;

        return tmp;
    }
    
add(1)(2) // 3
add(1, 2, 3)(10) // 16
add(1)(2)(3)(4)(5) // 15

add(1)(2)(3)

function add(x) {
    var sum = x;
    var tmp = function (y) {
        sum = sum + y;
        return tmp;
    };
    tmp.toString = function () {
        return sum;
    };
    return tmp;
}
console.log(add(1)(2)(3));  //6
console.log(add(1)(2)(3)(4));   //10

你可能需要柯里函数

这个链接有很多方法,我就不一一列举了。
另外再补个链接,关于toString和valueOf的点我

function add(){
    var sum = 0;
    var slice = Array.prototype.slice;
    
    var f = function(){
        var params = slice.apply(arguments);
        params.forEach(function(it){
            sum+=it;
        });
        f.val = sum;
        return f;
    }
    
    return f.apply(null,slice.apply(arguments));
}

console.info(add(1)(2)(3)(4)(5)(6,7).val);// 28
const add = sum => {
  const calc = n => add(sum + n)
  calc.toString = () => sum
  return calc
}

add(1)(2)(3)(4)

不管是改写toString方法还是valueOf方法(toString会调用valueOf),都无法实现直接读取值,因为直接读取值并不会调用toString方法,所以add(1): { [Function: b] toString: [Function] } ; add(1)+0 : 1。
代码:

function add(){
    var sum = 0;
    for(let num of arguments)
        sum += num;
    function b(){
        for(let num of arguments)
            sum += num;
        return b;
    };
    b.toString = function(){return sum};
    return b;
}
console.log(add(1));// { [Function: b] toString: [Function] }
console.log(add(1)+0);// 1

非主流版:

function add(...values) {
    let tmp = (x) => {
        values.push(x);
        return tmp;
    };
    tmp.toString = () => new Function('return ' + values.join('+'))();
    return tmp;
}
console.log(add(1)(2)); // -> 3
console.log(add(1, 5)(2)); // -> 8
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题