js小题一道之valueOf&toString探究

如下:

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:

时间: 2024-10-25 20:44:37

js小题一道之valueOf&toString探究的相关文章

常让人误解的一道js小题

今天无意中看到一个js笔试题,不由得想起初学js那会被各种题目狂虐的心酸,虽说现在也会被笔试题所虐,但毕竟比之前好了很多,至少对于这道题我还是能正确解答上来的: var x = 1; function printx(){ console.log(x); } function show(f){ var x = 2; (function(){ f(); })() } show(printx); //1 结果后台会打印1,而不是2.这有些不合常理,因为很多人会错误的认为:函数show中的f()在执行时

关于js数组的一道小考题

网上看到的一道关于js数组的小考题,借此学习练习一下,也是拿来作为博客开篇之作吧! 题目如下: 给定一个随机数组,数组可能包含数组(也就是说数组元素可能为数组).要求用js实现一个函数,返回该数组中所有元素,重复的要求去掉.例如:数组[2,3,[4,6,[3,8]],12,10],返回结果为:[2,3,4,6,8,12,10]. 我的答案如下:(额外增加了排序) 1 var arr = [2,3,[4,6,[3,8,[15,16,[17,18,[1,2,3,[19,20]]]]],[13,14]

一道小题:从一个数组里产生所有可能的乘积组合

比如给定一个数组[2,3,11] 要求产生[1,2,3,6,11,22,33,66] 观察可得:[2,3] 产生了[1,2,3,6] 的乘积可能.当加入11时,11会和现有的每一个元素都相乘得到[1,2,3,6,11,22,33,66] public static void allProducts(int[] arr) { List<Integer> list = new ArrayList<Integer>(); list.add(1); for(int i=0; i<ar

关于js中全局变量和局部变量的寄到小题

往往最基本的也是最根本的. 这里有三道关于全局变量和局部变量的小题,供诸位一阅. 知识点: (1)在最外层声明的是全局变量 (2)在函数内声明的是局部变量 (3)在函数体内部,但是没有用var声明的变量也是全局变量 第一题: var a = 10;function fun(){var a = "global";}console.log(a); 第二题: var a ;function fun(){a = "global";} fun();console.log(a)

小题解析

前两天一位朋友留言问了我关于js的小题,其实在这位朋友之前曾经也有人询问过此类题,思前想后觉得写出来给那些还正在解答此题中的朋友们.   原型 var add = function (m) { var temp = function (n) { return add(m + n); } temp.toString = function () { return m; } return temp; }; add(3)(4)(5); // 12 add(3)(6)(9)(25); // 43 这个ad

用js刷题的一些坑

leecode可以用js刷题了,我大js越来越被认可了是吧.但是刷题中会因为忽略js的一些特性掉入坑里.我这里总结一下我掉过的坑. 坑1:js中数组对象是引用对象 js中除了object还有数组对象也是引用对象,这点常常被忽视,所以在递归的时候传递数组要用arr.slice(0)这样复制一个一样的新数组,不然会出现你传入的数组会被同级的递归改变,结果就不对了. 所以只要数组复制的地方最好都要这么写,除非你真的想引用.而且注意是slice不是splice这两个方法差别很大,你如果用splice(0

关于理解python类的小题

今天看了python部落翻译的一篇<一道python类的小题>文章,感觉挺有启发性,记录下来: 1 print('A') 2 class Person(object): 3 print('B') 4 def __int__(self,name): 5 print('C') 6 self.name = name 7 print('D') 8 print('E') 9 10 11 p1= Person('name1') 12 p2 = Person('name2') 输出结果: A B D E C

前端笔试小题

/*一.变量作用域一道小题*/var x='a';function printX(){ console.log(x); var x='b'; console.log(x);}printX(); var y='c';function printY(){ console.log(y); y='d'; console.log(y);}printY();//输出结果undefined,b,c,d /*二.输出结果*///alert(null instanceof Object);//alert(null

js小点

js小点1:function a (x) { return x * 2;}var a;alert (a); js永远是先解析声明式函数,再解析变量,但不会赋值 执行顺序:1,解析函数a2,声明变量var a;此时a并没有赋值,所以a=function a js小点2:js中没有块的概念--比如for(var i in array)中的i依然是全局变量 js小点3:function b (x, y, a) { arguments[2] = 10; alert (a);}b(1, 2, 3); 分析