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 )