能够摄取必要营养的人要比吃得很多的人更健康,同样,真正的学者往往不是读了很多的书的人,而是读了有用的书的人。--亚里斯提卜

JavaScript中valueOf、toString的隐式调用

今天在群上有人问这样一个问题:

函数add可以实现连续的加法运算
函数add语法如下
add(num1)(num2)(num3)...;//注意这里是省略号哟,无限
使用举例如下:
add(10)(10)=20;
add(10)(20)(50)=80;
add(10)(20)(50)(100)=180;
请用js代码实现函数add。

自个琢磨了一会只能Google之,代码如下:

    function add(num){
        var sum=num,
        
            tmp=function(v){
                sum+=v;
                return tmp
            };
        
        tmp.toString=function(){
            return sum
        };
        
        return tmp
    }
    
    
    alert( add(10)(20)(50) )        //80

起初没弄懂为什么会返回80,因为toString方法一直没被调用啊,怎么会返回sum呢;后来知道原来toString被隐式调用了,也就有了下文。

 

先引用一段话

 

每个对象的toString和valueOf方法都可以被改写,每个对象执行完毕,如果被用以操作JavaScript解析器就会自动调用对象的toString或者valueOf方法,举栗子:

    //我们先创建一个对象,并修改其toString和valueOf方法
    var obj={
        
        i:10,
        
        valueOf:function(){
            
            console.log('执行了valueOf()');
            
            return this.i+20
            
        },
        
        toString:function(){
            
            console.log('执行了toString()');
            
            return this.valueOf()+20
        }
    }
    
    //当我们调用的时候:
    
    alert( obj )    //50       执行了toString() 执行了valueOf()
    alert( +obj )    //30       执行了valueOf()
    alert( obj>40 )    //false       执行了valueOf()
    alert( obj==30 )