前一段看tom大叔的 <<深入理解JavaScript系列>> ,受益颇多。
在第20篇的结尾有6道题很有意思,花了好长时间做了只做出5道,
第6题看了 Gray Zhang 的答案 , 之前没见过toString和valueOf的用法。
?
题目:
- 找出数字数组中最大的元素(使用Match.max函数)
- 转化一个数字数组为function数组(每个function都弹出相应的数字)
- 给object数组进行排序(排序条件是每个元素对象的属性个数)
- 利用JavaScript打印出Fibonacci数(不使用全局变量)
- 实现如下语法的功能:var a = (5).plus(3).minus(6); //2
- 实现如下语法的功能:var a = add(2)(3)(4); //9
在看完<<js高级程序设计>>后,对几道题进行了重新作答
//Q1: var a = [1,2,3,4,5], big = a[0]; for(var i=1,l=a.length; i<l; ++i){//最简单的方法 big = big > Math.max(a[0],a[i]) ? big : Math.max(a[0],a[i]); } alert(big); //在ECMAScript v3之后的版本中的max函数已经支持2个以上的参数, //所以可以用下面的方法 var a = [1,2,3,4,5], ret; ret = Math.max.apply(null,a); //Q2: Array.prototype.toFunction = function(){ var _this =this; for(var i=0; i< this.length; ++i){ (function(i){ _this[i] = function(){ //闭包的应用 alert(i); } })(i); } } var a = [1,2,3,4,5,6]; a.toFunction(); a[0](); //方法2,避免在Array原型连上添加方法,修正错误。 function arrayToFunction(array){ for(var i=0, len = array.length; i< len; ++i){ (function(i){ //闭包的应用 var num = 0; ? num = array[i]; array[i] = function(){ alert(num); } })(i); } } var a = [1,2,3,4,5,6]; arrayToFunction(a); a[3](); ?//Q3: Array.prototype.mysort = function(){ var i=0,j,cout; for(;i<this.length;i++){ cout = 0; for ( var j in this[i]){ if( this[i].hasOwnProperty(j)) //排除继承过来的属性 cout++; } this[i].propertyNums = cout; } return this.sort(function(a,b){ return a.propertyNums - b.propertyNums; }); } var a = [{a:"name",b:"type"},{c:"hello",d:"123",e:function(){}}]; a.mysort(); //方法2,避免在Array原型连上添加方法 function objectSort(array){ var len = array.lenth, i, j, cout; for(i=0; i<len; ++i){ cout = 0; for ( var j in array[i]){ if( array[i].hasOwnProperty(j)) //排除继承过来的属性 cout++; } array[i].propertyNums = cout; } return array.sort(function(a,b){ return a.propertyNums - b.propertyNums; }); } var a = [{a:"name",b:"type"},{c:"hello",d:"123",e:function(){}}]; objectSort(a); ?//Q4: function fibonacii(n){ return n<2 ? 1 : arguments.callee(n-1) + arguments.callee(n-2); //return n<2 ? 1 : fibonacii(n-1) + fibonacii(n-2);//用arguments.callee代替函数名,降低耦合度 } function printFib(n){ var ret = []; if(typeof n === "number"){ for(var i=1; i<=n; i++){ ret.push(fibonacii(i)); } console.log(ret); } } printFib(5); //Q5: Number.prototype.plus = function(x){ if(typeof x === "number") return this + x; else return this; } Number.prototype.minus = function(x){ if(typeof x === "number") return this - x; else return this; } alert((2).plus(3).minus(3));//这题算是最简单的了 //Q6: //直接copy Gray zhang 的,算是学了一招吧 function add(x) { var result = x; var fn = function(x) { result += x; return fn; }; fn.toString = fn.valueOf = function() { return result; }; return fn; }?
?