guiqide
  • 4
  • 新人请关照

js 函数的valueOf为什么不会被调用?

遇到一个题,通过柯里化的思想实现参数累加求和,类似于add(1)(2)(3)返回6,但是我写的demo,valueOf不会被调用

function add() {
    var args1 = [...arguments]
    var fn = function () {
        var args2 = [...arguments]
        return add.apply(null,args2.concat(args1))
    }

    fn.valueOf = function () {
        return args1.reduce((a, b) => a + b)
    }
    return fn
}
console.log(add(1, 2, 3, 4, 5))

https://codepen.io/guiqide/pe...

阅读 270
评论 更新于 2019-08-14
    2 个回答
    Yangk
    • 479

    valueOf()方法和toString()方法是一样的,都会在后台进行隐式的调用,比如类型转换的时候。
    比如: console.log(add(1, 2, 3, 4, 5) + '') 或者,你在return的时候,直接 return fn +''也可以达到你的效果

    评论 赞赏 2019-08-14

      这里就涉及到valueOf和toString方法的优先级问题:对象在作为操作数时,解释器总是优先调用valueOf()--(Date类型的对象在二元“+”运算时例外),而其他情况,解释器总是认为我们想要的是字符串,所以会优先调用toString()。所以return fn的时候实际上会优先调用toString方法,fn本身没有toString方法会去Function.prototype上调用,此时valueOf方法就不会调用了,所以这里你要实现预期功能重写toString方法就可以了(为了保险,也可以将valueOf和toString方法都重写)。

      评论 赞赏 2019-11-08
        撰写回答

        登录后参与交流、获取后续更新提醒