汤姆大叔6道javascript思考题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汤姆大叔6道javascript思考题相关的知识,希望对你有一定的参考价值。

1、返回数组中的最大值;(math.max)
 
首先,明确用法。math.max(1,2,4,-5,3 )  比较传入参数的值,参数个数任意;
实现 : 用apply(object,[]);
var num =[1,2,3,4,5];
var b=Math.max.apply(Math,num);
2、转化一个数字数组为function数组(每个function都弹出相应的数字)

     function toFunction (num){
          var mynum= new Array();
          for(var i=0,len=num.length;i<len;i++)
          {
               var myfunction=(function(n){
                    return function(){
                             alert(n);
                        }
               })(num[i]); //自执行函数,通过循环将num中的每个值做为参数传给函数,每次都返回一个alert该参数的函数。因为使用了闭包(自由变量,不是在本身作用域定义的变量),通过n存储每个num【i】的值,以实现函数功能;
               mynum.push(myfunction);
          }
          return mynum;
     }
     var num=[1,2,3,4,5];
          var newnum=toFunction(num);
          newnum[4]();
// 3、给object数组进行排序(排序条件是每个元素对象的属性个数)  num[{a:1,b:2},{},{a:3}]   
num.sort()     arrayobj.sort(sortfunction)  
参数 
arrayObj  
必选项。任意 Array 对象。  
sortFunction  
可选项。是用来确定元素顺序的函数的名称。如果这个参数被省略, 
那么元素将按照 ASCII 字符顺序进行升序排列。  
说明 
sort 方法将 Array 对象进行适当的排序; 
在执行过程中并不会创建新的 Array 对象。 

如果为 sortfunction 参数提供了一个函数,那么该函数必须返回下列值之一:  

负值,如果所传递的第一个参数比第二个参数小。  
零,如果两个参数相等。  
正值,如果第一个参数比第二个参数大。  
//for(var i in object|[])  在对象上迭代时是无序的,i就相当于其中某一个属性的引用;数组上按元素顺序
     function sortfun(obj1,obj2){
              
               var fn=function (obj){
                    var size=0;//size必须定义在函数内部,若定义在函数外部,则每次调用该函数时,所得到的return的size都是相等的,并不能达到判断个数并交换的效果;
                    for(var i in obj)
                    {
                         if(obj.hasOwnProperty(i))
                              size++;
                    }
                    return size;
               }
               return fn(obj1)-fn(obj2);
     }
     var objnum=[
     {a:1,b:3,c:4},
      {a:1,b:3,c:4,d:5,f:6},
     {a:1,b:3,c:4,d:5} 
     ]
     objnum.sort(sortfun);         
// 利用javascript打印出Fibonacci数(不使用全局变量)
function fibNum(num){
     var fibArr=new Array();
     if(num<2){
          for(var i=0;i<num;i++)
          {
               fibArr.push(i)
          }
     }
          else{
               fibArr.push(0,1);
               for(var i=2;i<num;i++)
               {
                    var fibn=fibArr[i-1]+fibArr[i-2];
                    fibArr.push(fibn);
               }
          }
          return fibArr;
}

// 实现如下语法的功能:var a = (5).plus(3).minus(6);
Number.prototype.plus = function(i){   //为其原型添加方法plus 和 minus
    return this + i;
}
Number.prototype.minus = function(i){
    return this - i;
}

var a = (5).plus(3).minus(6);
console.log(a);
// 实现如下语法的功能:var a = add(2)(3)(4);
   function add(n1){
      return function(n2){
             n2=n2+n1;
             return function(n3)
             {
                  return n3+n2;
             }
      }

   }// 题目理解不够全面,并不只是单纯的3次参数传入,而是多个的情况下都能调试成功
   //实现分析 :递归调用 function(){ a+b}
   function myadd(l){
           var myl=l;
           var inadd= function (m){
                myl += m;
                return inadd;
           }//  当最后一个参数传入后,执行完毕得到需要的值myl,但是函数返回的是inadd这个
           inadd.toString=inadd.valueOf =function(){   //当返回的是函数或者对象时,浏览器会进行toString or valueOf 的转换,我们将该内部函数这两个自动转换机制的function进行重写,使其返回最后相加的值;
               return myl;
           }
           return inadd;
   }

var a = add(2)(3)(4);
console.log(a);

以上是关于汤姆大叔6道javascript思考题的主要内容,如果未能解决你的问题,请参考以下文章

深入理解JavaScript系列 --汤姆大叔

汤姆大叔JavaScript

汤姆大叔的博客-编程正例

学习汤姆大叔的knockout教程笔记

汤姆大叔的博客-menu

汤姆大叔的博客-高代码效率