汤姆大叔 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

时间: 2024-10-18 06:56:45

汤姆大叔 javascript 系列 第20课 最后的5到javascript题目的相关文章

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

深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大叔写作的动力. 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点 深入理解JavaScript系列(2):揭秘命名函数表达式 深入理解JavaScript系列(3):全面解析Module模式 深入理解JavaScript系列(4):立即调用的函数表达式 深入理解JavaScript系列(5):强大的原型和原型链 深入理解JavaScript系列(6

深入理解JavaScript系列(转自汤姆大叔)

深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大叔写作的动力. 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点 深入理解JavaScript系列(2):揭秘命名函数表达式 深入理解JavaScript系列(3):全面解析Module模式 深入理解JavaScript系列(4):立即调用的函数表达式 深入理解JavaScript系列(5):强大的原型和原型链 深入理解JavaScript系列(6

看了汤姆大叔的“你真懂JavaScript吗?”的一些感慨

看了汤姆大叔的“你真懂JavaScript吗?”,里面有5道题目,我都一一作了,然后在chrome的控制台里面运行了一遍,虽然只错了一道,但还是细细读了下答案,在此总结一下,看看是否对大家对这些JavaScript底层的原理都懂了. 题目一(所有全局变量都是window的属性.变量声明提前.变量赋值不会提前) if (!("a" in window)) { var a = 1; } alert(a); 因为在JavaScript在变量声明提前的特性,所以事实上上述代码相当于下面所示:

汤姆大叔的6道js题目

汤姆大叔的6道javascript编程题题解 看汤姆大叔的博文,其中有篇(猛戳这里)的最后有6道编程题,于是我也试试,大家都可以先试试. 1.找出数字数组中最大的元素(使用Math.max函数) 1 2 3 var a = [1, 2, 3, 6, 5, 4]; var ans = Math.max.apply(null, a); console.log(ans);  // 6 这题很巧妙地用了apply,如果不是数组,是很多数字求最大值,我们知道可以这样: 1 2 var ans = Math

你必须知道ASP.NET知识------关于动态注册httpmodule(对不起汤姆大叔)

一.关于动态注册的问题 很多人看过汤姆大叔的MVC之前的那点事儿系列(6):动态注册HttpModule ,其实汤姆大叔没有发现httpmodule动态注册的根本机制在哪里. 亦即:怎么动态注册?为什么能够动态注册? 汤姆大叔给了如下开篇 通过前面的章节,我们知道HttpApplication在初始化的时候会初始化所有配置文件里注册的HttpModules,那么有一个疑问,能否初始化之前动态加载HttpModule,而不是只从Web.config里读取? 答案是肯定的, ASP.NET MVC3

我读汤姆大叔的深入理解js(二)

继续汤姆大叔的js之旅. 揭秘命名函数表达式 函数表达式和函数声明 汤姆大叔在博客中引用ECMA规范:函数声明必须带有标识符,函数表达式可以省略.对于我来说这些概念的东西真是不所适从.还是大叔的实例带劲.上实例如下: function foo(){};//鬼都知道是声明 var bar = function foo(){};//鬼也知道是表达式 new function bar(){}; (function() { function bar(){};//这也是声明 })();这些大家看看应该都很

汤姆大叔的博客-menu

1.汤姆大叔的博客http://www.cnblogs.com/tomxu/archive/2011/12/15/2288411.html 关键字:技术,管理,英文,吃喝玩乐,健身,慎独 2.menu 如何编写高质量的js代码例如避免全局变量,使用单变量声明,在循环中预缓存length(长度),遵循代码阅读可维护的代码意味着:可读的,一致的,可预测的,看上去就像是同一个人写的,已记录命名函数表达式的秘密 书写可维护的代码,这关系到底线(营业收入)和开发人员的幸福解决bug=1.花时间理解这个问题

深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点(转)

才华横溢的Stoyan Stefanov,在他写的由O’Reilly初版的新书<JavaScript Patterns>(JavaScript模式)中,我想要是为我们的读者贡献其摘要,那会是件很美妙的事情.具体一点就是编写高质量JavaScript的一些要素,例如避免全局变量,使用单变量声明,在循环中预缓存length(长度),遵循代码阅读,以及更多. 此摘要也包括一些与代码不太相关的习惯,但对整体代码的创建息息相关,包括撰写API文档.执行同行评审以及运行JSLint.这些习惯和最佳做法可以

读汤姆大叔《JavaScript变量对象》笔记

一段简单的JavaScript代码思考 先看一段简单的代码,打印结果是??为什么why?? 从上述打印结果不难看出,在打印基本变量num.函数表达式fn.函数声明fun时,就已经知道变量num.函数表达式fn值为undefined,函数声明fun值为function 但这样会存在一个疑问?js在代码执行之前打印时(变量.函数表达式.函数声明)就存在值,那么在打印(变量.函数表达式.函数声明)之前究竟发了什么?? [答案是变量对象.执行上下文代码的2个阶段] (当然 打印在基本变量num.函数表达