zoukankan      html  css  js  c++  java
  • 汤姆大叔 javascript 系列 第20课 最后的5到javascript题目

    博客链接:http://www.cnblogs.com/TomXu/archive/2012/02/10/2342098.html

    原题:

    大叔注:这些题目也是来自出这5个题目的人,当然如果你能答对4个及以上并且想拿高工资的话,请联系我。

    1. 找出数字数组中最大的元素(使用Match.max函数)
    2. 转化一个数字数组为function数组(每个function都弹出相应的数字)
    3. 给object数组进行排序(排序条件是每个元素对象的属性个数)
    4. 利用JavaScript打印出Fibonacci数(不使用全局变量)
    5. 实现如下语法的功能:var a = (5).plus(3).minus(6); //2
    6. 实现如下语法的功能:var a = add(2)(3)(4); //9

    以前一直是写.net后台,对js的操作,只是出于dom和ajax之间,对jquery的也只是存在能使用(还不算熟练)

    后来在网上找到了tom大叔的javascript系列,发现写的真好.真的是我这种dom能操作,ajax能写,jquery会用.但是希望更深入下去的采纳哦.

    于是就花了一些时间来学习博客里的内容.[本文最后回附上javascript系列文章的目录列表]

    现在开始答题,用我自己的思路,(因为我本身算不上一个前端,只是偶尔前端忙的时候,我就写一下dom操作,和ajax.jquery里的ajax函数都没记清,还要去查API)

    所以出现纰漏和错误的地方还希望大家指出,学习.

    第一题:

    找出数字数组中最大的元素(使用Match.max函数).

    答题思路:首先,我之前没有用过这个函数,js自带的参数提示也是一坨shit,况且弱类型语言,啥玩意都能往里面传,能不能执行就另说.

    于是我就百度了一下Match.max函数,发现里面的参数是以Math.max(1,2,3,4,5,6,7) 这种模式.

    去掉数组左右小括号里面的"内容"的格式就刚好满足max参数的要求.

    于是:

    <script type="text/javascript">
            var int_array = [1,2,3,4,5,6];
            var str_array ="";
            for(var i = 0; i < int_array.length; i++){
              str_array += int_array[i] + ",";
         }
         
          str_array = str_array.subString(0,str_array.length-1);//这里没有找到一个string内置的去掉特定尾字符的函数(trim(),trimRight)//可能是我参数没调对
    
        eval("Math.max("+str_array+")");
        
    
    </script> 
    

    第一条还算顺利,不算太难.

    第二题:转化一个数字数组为function数组(每个function都弹出相应的数字)

    答题思路:将一个数字转化成function数组,并且每个函数输出对应的数字.

                关键在于"弹出相对应的数字."

                明显就是一个闭包的操作.(为什么说"明显",因为我花了2天时间去理解和学习闭包)....

                

    <script type="text/javascript">
           var int_array =  [1,2,3,4,5,6,7];
            var fn_array = [];
            for(var i = 0; i < int_array.length;i++){
                  var f =   (function(lockitem){
                         return function(){
                               console.log("当前是函数fn_"+ lockitem +"  ----  对应的数字是:" + lockitem);
                         }
                    })(int_array[i]);
    
                    fn_array.push(f);
             }
    
    
             for(var j = 0 ; j < fn_array.length;j++){
                     console.log(fn_array[j]());
            }
    </script>            
    

      

    第三题:给object数组进行排序(排序条件是每个元素对象的属性个数)

    答题思路:首先给一个对象的数组 比如(var obj_array = [{},{},{}]);

                然后写一个函数,计算每个对象的属性个数(不包括原型属性),并返回新的对象,这个新的对象有2个属性 var newObj = {obj:obj,count:count};//Obj就是之前计算属性个数的那个对象本身,count是数量

                然后在根据count属性排序,并把这个对象的obj属性返回出来.

                

    var obj_array = [
                    {
                        name:"张三"
                    },
                    {
                        name:"张三",
                        age:25
                    },
                    {
                        name:"张三",
                        age:25,
                        address:"湖北武汉"
                    }
                ];
    
                function propertyCount(obj){
                    if(typeof obj !== "object"){
                        throw new Error("参数类型错误!");
                    }
                    var count = 0;
                    for(var prop in obj){
                        if(obj.hasOwnProperty(prop)){
                            count++;
                        }
                    }
    
                    var obj_instance = {
                        target:obj,
                        count:count
                    }
    
                    return obj_instance;
                }
    
                //删除数组的指定索引元素
                function removeAtIndex(array,index){
                    array.splice(index,1);
                }
    
    
                var obj_whit_propertyCount  = [];
                var sort_object = [];
                var i_array = [];
    
                for (var x = 0;x < obj_array.length;x++) {
    
                    obj_whit_propertyCount.push(propertyCount(obj_array[x]));
                    i_array.push(propertyCount(obj_array[x]).count);
                    i_array.sort();
                }
    
                for (var s = i_array.length - 1; s >=0;s-- ) {
                        sort_object.push(returnObj(s+1));
                    }
    
                console.log(obj_whit_propertyCount);
                console.log(sort_object);
    
                function returnObj(count){
                    for (var q = 0;q < obj_whit_propertyCount.length;q++) {
                        if(obj_whit_propertyCount[q].count == count){
                            return obj_whit_propertyCount[q].target;
                        }
                    }
                }

    第三体肯定不是好的思路,不过跌跌撞撞也算是做出来了.

    第四题: 利用JavaScript打印出Fibonacci数(不使用全局变量)

          我只做出了递归计算,对于打印出1,1,2,3,5,8....这样的数字还没思路,如果读者,请留言告诉我.

      

    function Fibonacii(num){
                    if(num == 1 || num == 2){
                        return 1;
                    }
    
                    return Fibonacii(num-1) + Fibonacii(num-2);
                }
    
                console.log(Fibonacii(5)); //第五个数

                

    第五题:实现如下语法的功能:var a = (5).plus(3).minus(6); //2

    答题思路:我一开始看到第一个(5),说是实话,真的懵了...怎么会有这么奇特的语法?只有函数调用的时候在会有f()啊!!

                后来一想:(1+2)*4 ,(9/3)-1..()就很普通了,不就是一个expression么.

        然后在控制台里输出:console.log((5));//返现结果和我预期一样.

               于是,就开始琢磨add和minus两个函数.

               既然(5)返回就是一个number类型,那我直接就在Number的prototype属性扩展这两个方法好了.(不是老有人老生常谈不要去修改系统的原型对象)

               

    Number.prototype.add = function(num1){
          return this + a;
    }
    
    Number.prototype.minus = function(num1){
        return this - a;
    }
    
    console.log((5).add(3).minus(6));

    其实解答这题的时候,还有另外一个思路

    因为Number.prototype._ptoto_ : Object.prototype的,那我在Object.prototype元素上扩展add和minus不一样也可以吗?

    这是我写的代码

    Object.prototype.add = function(num1){ //
    //                if(typeof this != "number"){
    //                    throw new Error("必须是数字类型");
    //                }
    //                if(parseInt(this) == NaN){
    //                    throw new Error("必须是数字");
    //                }
                    return parseInt(this) + num1;
                }
    
                Object.prototype.minus = function(num1){
    //                if(typeof this != "number"){
    //                    throw new Error("必须是数字!");
    //                }
    //                if(parseInt(this) == NaN){
    //                    throw new Error("必须是数字");
    //                }
                    return parseInt(this) - num1;
                }
    
                  var result = (5).add(100).minus(5);
                  console.log(result);

    大家注意注释的地方.

    第六题:实现如下语法的功能:var a = add(2)(3)(4);

            答题思路,返回每次调用完毕之后,返回此函数本身.但做到的要求估计不是题目要求的那样.

           因为题目的要求可能是add(2)(3)(4) 只返回一个结果.我是add(2)一次 add(2)(3)一次 add(2)(3)(4)一次.

          

    var sum_array = [];
                var sum = 0;
                var add = function(a){
    
                    sum_array.push(a);
                    if(sum_array.length==1){
                        console.log(a);
                        return this.add;
                    }else if(sum_array.length > 1){
                        for (var y = 0;y < sum_array.length;y++) {
                            sum+=sum_array[y];
                        }
                    }
                    console.log(sum);
    
                    return this.add;
                }
    
                add(1)(2)(3);

    到这里,6道题算是马马虎虎的做出来了,肯定有错误的位置.但我会慢慢学习和思考,尽快的把javascript基础知识巩固起来.

    ps:公司一同事,看我写这些代码,说你这是要转前台的节奏阿,闭包都懂..

        然后我模拟了一个场景:

      面试官:闭包,函数作用于,执行上下文你都懂,不错,明天来上班吧. 对了,你随便写一个模态弹出层吧.

     我:...不会.....

    汤姆大叔博客地址:http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html

       

  • 相关阅读:
    全国疫情可视化地图(第三阶段)
    全国疫情可视化地图(第二阶段)
    JAVAWEB调用数据库显示图形化显示
    全国疫情可视化地图(第一阶段)
    第二周学习总结
    个人介绍及目前现状
    循环列表下练习循环子数组
    构建之法读书笔记(三)
    构建之法读书笔记(二)
    变叶木
  • 原文地址:https://www.cnblogs.com/JustCoding/p/4925066.html
Copyright © 2011-2022 走看看