全面分析toString与valueOf,并随手解决掉几道大厂必备面试题( 四 )

add()每次都会返回一个函数sum , 直到最后一个没被调用 , 默认会触发toString方法 , 所以我们这里重写toString方法 , 并返回累计的最终值a这样说才能理解:
add(10): 执行函数add(10) , 返回了sum函数 , 注意这一次没有调用sum , 默认执行sum.toString方法 。所以输出10
add(10)(20): 执行函数add(10) , 返回sum(此时a为10) , 再执行sum(20) , 此时a为30 , 返回sum , 最后调用sum.toString()输出30 。add(10)(20)…(n)依次类推 。
3. 柯里化实现多参累加这里是上面累加的升级版 , 实现多参数传递累加 。
add(1)(3,4)(3,5)// 16add(2)(2)(3,5)// 12复制代码function add(){// 1 把所有参数转换成数组let args = Array.prototype.slice.call(arguments)// 2 再次调用add函数 , 传递合并当前与之前的参数let fn = function() {let arg_fn = Array.prototype.slice.call(arguments)return add.apply(null, args.concat(arg_fn))}// 3 最后默认调用 , 返回合并的值fn.toString = function() {return args.reduce(function(a, b) {return a + b})}return fn}// ES6写法function add () {let args = [...arguments];let fn = function(){return add.apply(null, args.concat([...arguments]))}fn.toString = () => args.reduce((a, b) => a + b)return fn;}

经验总结扩展阅读