函数柯里化一道经典面试题最后那个toString隐式转换没看懂,什么意思?

发布于 2022-09-12 23:02:50 字数 707 浏览 12 评论 0

// 实现一个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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

雪若未夕 2022-09-19 23:02:50

就是重写了 _addertoString() 方法,好让 _adder 这个 function 能直接打印成 number 的。

let func1 = function() { /* noop */ };
alert(func1);

let func2 = function() { /* noop */ };
func2.toString = () => 'override toString()';
alert(func2);

你可以试着自己执行一下,看看会输出什么?

溺渁∝ 2022-09-19 23:02:50

这里需要说明一下add(1)(2)(3)得不到结果需要toString()一下(我也不知道为啥都这么写,反正浏览器控制台得不到结果)。
首先你的疑惑点不清晰,导致你搜索的问题不在点上。遇到看不懂的代码最先想到的是打断点看逻辑走向,文章已经告诉你函数柯里化的核心思想是收集参数,最后将收集到的所以参数进行处理。你打断点就能知道代码就是这样执行的,并且你还会发现参数收集完后才去执行toString里面的内容(重点),所以你该思考的是为什么会最后执行这里。
你查了很多“toString隐式转换的特性”的文章,应该有文章说“在 JavaScript 中,toString()方法和valueOf()方法,在输出对象时会自动调用”,这句话就解释了,问什么会在最后执行toString,因为重写toString恰好能满足在递归收集完所有参数后再去执行这个条件所以用到了它。你也可以重写valueOf,结果是一样的。
image.png
这里还有个问题
这是hbuildx内置控制台的输出
image.png
这是外置浏览器的结果
image.png
哈哈哈,所以这代码对不对呢?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文