JS重写函数valueOf方法实现连续调用求和

对象转原始值先toString再valueOf

var obj = {
    toString: function() {
        console.log('调用了 obj.toString');
        return {};
    },
    valueOf: function() {
        console.log('调用了 obj.valueOf')
        return '110';
    }
}

alert(obj);
// 调用了 obj.toString
// 调用了 obj.valueOf
// 弹出110

从上面代码可看出输出obj时,先调用其toString方法,若toString返回原始值就直接返回,否则继续调用valueOf方法。

var obj = {
    toString: function() {
        console.log('调用了 obj.toString');
        return {};
    },
    valueOf: function() {
        console.log('调用了 obj.valueOf')
        return {};
    }
}

alert(obj);
// 调用了 obj.toString
// 调用了 obj.valueOf
// Uncaught TypeError: Cannot convert object to primitive value

若toString和valueOf都返回对象则程序报错

对象与数值运算转原始值先valueOf再toString

var obj = {
    valueOf: function() {
        console.log('调用 valueOf');
        return 5;
    }
}

console.log(obj + 1);
// 调用 valueOf
// 6

var obj = {
    valueOf: function() {
        console.log('调用 valueOf');
        return {};
    },
    toString: function() {
        console.log('调用 toString');
        return 10;
    }
}

console.log(obj + 1);
// 调用 valueOf
// 调用 toString
// 11

var obj = {
    valueOf: function() {
        console.log('调用 valueOf');
        return {};
    },
    toString: function() {
        console.log('调用 toString');
        return {};
    }
}

console.log(obj + 1);
// 调用 valueOf
// 调用 toString
// Uncaught TypeError: Cannot convert object to primitive value

输出函数名先valueOf,再toString

function test() {
    var a = 1;
    console.log(1);
}
test;
// 这里打印函数内容,即调用了test.valueOf()


test.valueOf = function() {
    console.log('调用 valueOf 方法');
    return 2;
}
 test;
// 输出如下:
// 调用 valueOf 方法
// 2

添加toString方法并将valueOf返回对象


test.valueOf = function() {
    console.log('调用 valueOf 方法');
    return {};
}
test.toString= function() {
    console.log('调用 toString 方法');
    return 3;
}
test;
// 输出如下:
// 调用 valueOf 方法
// 调用 toString 方法
// 3

若将其valueOf和toString都返回对象,程序不会报错

test.valueOf = function() {
    console.log('调用 valueOf 方法');
    return {};
}
test.toString= function() {
    console.log('调用 toString 方法');
    return {};
}
test;
//调用 valueOf 方法
//调用 toString 方法
//ƒ #<Function>

题目

add(1)(2) // 3
add(1, 2, 3)(10) // 16
add(1)(2)(3)(4)(5) // 15

实现:

function add() {
    var args1 = Array.prototype.slice.call(arguments);
    var fn = function () {
        var args2 = Array.prototype.slice.call(arguments);
        return add.apply(null,args2.concat(args1));
    };

    fn.toString = function () {
      return  args1.reduce(function (a, b) {
            return a * b;
        });
    };
   <!-- fn.valueOf = function () {
        return  args1.reduce(function (a, b) {
            return a + b;
        });
    };-->
    return fn;
}

其中,valueOf和toString,哪个先被改写优先调用谁,同时出现,调用valueOf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值