码迷,mamicode.com
首页 > Web开发 > 详细

js小题一道之valueOf&toString探究

时间:2014-11-18 23:49:03      阅读:357      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   ar   color   os   sp   strong   div   

如下:

var add = function() {___}; console.log(add(3)(4)(5)); // 输出60

  题目要求能无限相乘,请补充add函数。

  首先很显然,add函数必须返回一个带一个参数的function,不然无法进行后续的连乘操作;其次,乘到最后,没有参数了,add函数直接得把数值返回。其实这类似一个深搜的函数,根据n的值进行递归:

1 var add = function(n) {
2   if(n === 5) 
3     return n;
4   return n * add(n + 1);
5 }
6 console.log(add(3));

  第二行相当于没有参数时的判断操作,第四行相当于返回一个带参数的方法。此题的难点是值的累计,如果能设置一个全局变量保存值,将会方便很多,因为没有中间变量,而根据js函数特性又只能返回一个函数,不能返回函数与数字相乘的方式。如果能设置全局变量:

1 var add = function(n) {
2   ans *= n;
3   return add;
4 }
5 var ans = 1;
6 add(5)(4)(3);
7 console.log(ans);

  因为要返回一个函数,又要实现值的累计,又不能外加变量,所以只能将累计的值作为参数传入。

1 var add = function(a) {
2   var temp = function(b) {
3     return add(a * b);
4   }
5   return temp;
6 }

  那么,add(3)(4)(5)在以上代码中是如何运作的?第一步a=3,b=4,运算后变成add(3*4)(5),第二步,a=12,b=5,运算后变成add(3*4*5),第三步a=60传入,temp方法return了,在控制台看到如下:

function (b) {
   return add(a * b);
} 

  这时就要关注一下function的toString和valueOf方法。重写toString和valueOf方法,就能得到答案。

 1 var add = function(a) {
 2   var temp = function(b) {
 3     return add(a * b);
 4   }
 5   temp.toString = temp.valueOf = function() {
 6     return a;
 7   }
 8   return temp;
 9 }
10 console.log(add(3)(4)(5));

 

valueOf & toString:

 

js小题一道之valueOf&toString探究

标签:style   blog   io   ar   color   os   sp   strong   div   

原文地址:http://www.cnblogs.com/bigbigsunrise/p/4106711.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!