JavaScript高阶函数与valueOf/toString的联合应用

作者:函数茶馆时间:2026-10-30 09:07:15浏览:177

本文探讨JavaScript中通过高阶函数实现链式调用的技巧,如add(2)(3)(4)返回数值。重点解析利用valueOf和toString方法拦截隐式类型转换,使函数在参与运算或输出时自动返回累加结果,从而优化无限参数累加的解决方案。

高阶函数链式调用实现

近期遇到一个编程题目,要求实现特定的语法功能。


var a = add(2)(3)(4); //9 

该需求属于高阶函数的典型应用场景。分析可知,调用add(2)会返回一个函数,继续调用add(2)(3)依然返回函数,而最终执行add(2)(3)(4)时则返回具体的数值结果。

具体的实现代码如下:


function add(num1){
return function(num2){
return function(num3){
return num1+num2+num3;
}
}
}
add(2)(3)(4);//9 

上述代码逻辑正确,能够完美解决题目要求。

进一步优化:此处仅讨论高阶函数的相关部分,若追求更优解决方案,可实现支持无限参数调用的版本。

利用valueOf与toString优化


//方法一
function add(a) {
var temp = function(b) {
return add(a + b);
}
temp.valueOf = temp.toString = function() {
return a;
};
return temp;
}
add(2)(3)(4)(5);//14
//方法二、另看到一种很飘逸的写法(来自Gaubee):
function add(num){
num += ~~add;
add.num = num;
return add;
}
add.valueOf = add.toString = function(){return add.num};
var a= add(3)(4)(5)(6); // 18
//方法二注释:其实就相当于,只不过对函数应用了自定义属性,用于存储值。
;(function(){
var sum=0;
function add(num){
sum+=num;
return add;
}
add.valueOf=add.toString=function(){return sum;}
window.add=add;
})()
var a= add(3)(4)(5)(6); // 18[/code]

这是我在[url=http://www.cnblogs.com/wengxuesong/p/5577683.html]博客园[/url]看到的文章中写的,对于其中的方法一和方法二 一直不理解,也尝试在控制台输出 [code=javascript,javascript 代码,true]function 9


var temp = function() {
}
temp.valueOf = function() {
return 2;
}
temp.toString = function() {
return 'hahh';
}
alert(temp);
console.log(2 * temp); 

在JavaScript中,当对象需要转换为字符串时会调用toString方法,而当需要转换为数字时则会调用valueOf方法。

作者最新文章