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...

阅读 2.7k
2 个回答

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题