zoukankan      html  css  js  c++  java
  • 两道函数式编程题

    题目是由Winter出的,出片在这里>>

    Winter出的题,有些我也答不上来,题目难度并不是很高,但还考的比较深入。例如:

    JavaScript中的科里化、尾递归及其优化等(因为工作中用到这些的地方并不多)

    之前我也整理过,叫《网上收集的十道题》,那些题目,如果只是日常的页面开发,有些也许不会遇到,但如果想深入JavaScript,去研究一下也未尝不是一件好事情。

    我所了解的招聘前台开发人员,不同的公司以及部门对前台开发的技能要求会各有所异。

    打个比方:(需要熟练掌握如下技能的:切图、XHTML、CSS、JavaScript)的前端开发的公司会问:Web标准、函数式、设计模式、OO、浏览器兼容性以及hasLayout的问题,进(以JavaScript开发为主导的,平时较少需要进行页面切割)的公司,算法是一定会考的,其中编写的JavaScript脚本它的性能和优化问题,CDN、http相关也会问,但这些公司都会问同一个问题:跨域如何处理,方案有哪些,如何选择?

    部门、产品需要什么样的人,考察的侧重点会有所不同。但既然是写代码,基本的一些算法还是要会一点,性能优化这个也是很重要的。即使如此,对于编写人员,有些能力也是比较重要的:测试、运营、业务、需求、网络协议等,这些是对某一门开发语言掌握之后附加的能力(过早的涉入可能容易分散对某一门开发语言学习的精力),如果想提升自己的综合能力,上面那些会越来越重要。

    只试着解答两道题:

    1、写一个函数式风格的菲波纳契数列。

    2、写一个函数式风格的快速排序。

    第一题:

    之前写过,是使用了三种方法:递归、数组缓存、加法,有兴趣可以看这里>>

       1: var IterMemoFib = function() { 
       2:     var cache = [1, 1]; 
       3:     return function (n) { 
       4:         if (n >= cache.length) { 
       5:             for (var i = cache.length; i < n ; i++ ) { 
       6:                 cache[i] = cache[i - 2] + cache[i - 1]; 
       7:             } 
       8:         } 
       9:         return cache[n - 1]; 
      10:     } 
      11: }();

    第二题:

       1: <script type="text/javascript">
       2:     var arr = [1, 3, 5, 7, 9, 10, 20, 50, 760, 3, 8];
       3:  
       4:     function ASC(a, b) {
       5:         return a - b;
       6:     }
       7:  
       8:     function DES(a, b) {
       9:         return b - a;
      10:     }
      11:  
      12:     alert(arr.sort(ASC));
      13: </script>

    不过winter出的另外几道题还是比较有意思的,不注意的话容易掉陷阱里去

       1: <script type="text/javascript">
       2: var proto = {a:1};
       3: function cls() {};
       4: var obj1 =  new cls();
       5: cls.prototype = proto;
       6: //obj1.a现在是什么?
       7: </script>

    注意这里使用的是“=”赋值,等价于cls.prototype = {a:1};

    所以obj1.a === undefined

    稍微变换一下:

       1: <script type="text/javascript">
       2:  function cls() {};
       3: var obj1 =  new cls();
       4: cls.prototype.a = 1;
       5: //obj1.a现在是什么?
       6: </script>

    这个时候就不一样了,此时obj1从cls的原型上继承了属性’a’,那么obj1.a值就为1了

    两者的区别因为形式不同,而导致的意义也完全不一样:

    cls.prototype.a = 1;     cls.prototype = {a:1}

    还有一题:

    Function.prototype.ex = function() {
                            this.call(arguments);
                    }
                    请编写一段代码,调用ex方法,但不能出现Function.prototype,说明其中this代表哪个对象

    编写的代码如下:

       1: <script type="text/javascript">
       2: Function.prototype.ex = function() {
       3:     this.call(arguments);
       4: }
       5:  
       6: function abc() {
       7:     alert(this.length);
       8: }
       9:  
      10: abc.ex(1, 2, 3, 4, 5);
      11: </script>

    this.call这段代码中,第一个参数是arguments(‘伪’数组,是方法执行时传递的实参集合),如果某个函数使用.ex进行调用,函数内使用this将会指向参数集合(arguments),this.length则为实参的个数,this指向了调用时的实参集合(arguments)

    有空要折腾一下算法和FP了…

  • 相关阅读:
    古谚、评论与论断、名篇与名言
    重读《西游记》
    重读《西游记》
    命名之法 —— 时间、季节、地点
    命名之法 —— 时间、季节、地点
    文言的理解 —— 古时的称谓、别称、别名
    文言的理解 —— 古时的称谓、别称、别名
    Oracle GoldenGate for Oracle 11g to PostgreSQL 9.2.4 Configuration
    瀑布 敏捷 文档
    POJ 1325 ZOJ 1364 最小覆盖点集
  • 原文地址:https://www.cnblogs.com/meteoric_cry/p/1980212.html
Copyright © 2011-2022 走看看