函数柯里化一道经典面试题最后那个toString隐式转换没看懂,什么意思?
// 实现一个add方法,使计算结果能够满足如下预期:
add(1)(2)(3) = 6;
add(1, 2, 3)(4) = 10;
add(1)(2)(3)(4)(5) = 15;
function add() {
// 第一次执行时,定义一个数组专门用来存储所有的参数
var _args = Array.prototype.slice.call(arguments);
// 在内部声明一个函数,利用闭包的特性保存_args并收集所有的参数值
var _adder = function() {
_args.push(...arguments);
return _adder;
};
// 利用toString隐式转换的特性,当最后执行时隐式转换,并计算最终的值返回
_adder.toString = function () {
return _args.reduce(function (a, b) {
return a + b;
});
}
return _adder;
}
add(1)(2)(3) // 6
add(1, 2, 3)(4) // 10
add(1)(2)(3)(4)(5) // 15
add(2, 6)(1) // 9
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
就是重写了
_adder
的toString()
方法,好让_adder
这个function
能直接打印成number
的。你可以试着自己执行一下,看看会输出什么?
这里需要说明一下add(1)(2)(3)得不到结果需要toString()一下(我也不知道为啥都这么写,反正浏览器控制台得不到结果)。
首先你的疑惑点不清晰,导致你搜索的问题不在点上。遇到看不懂的代码最先想到的是打断点看逻辑走向,文章已经告诉你函数柯里化的核心思想是收集参数,最后将收集到的所以参数进行处理。你打断点就能知道代码就是这样执行的,并且你还会发现参数收集完后才去执行toString里面的内容(重点),所以你该思考的是为什么会最后执行这里。
你查了很多“toString隐式转换的特性”的文章,应该有文章说“在 JavaScript 中,toString()方法和valueOf()方法,在输出对象时会自动调用”,这句话就解释了,问什么会在最后执行toString,因为重写toString恰好能满足在递归收集完所有参数后再去执行这个条件所以用到了它。你也可以重写valueOf,结果是一样的。
这里还有个问题
这是hbuildx内置控制台的输出
这是外置浏览器的结果
哈哈哈,所以这代码对不对呢?