1.快速 排序的思想并实现一个快排?

“快速排序”的思想很简单,整个排序过程只需要三步:

  (1)在数据集之中,找一个基准点

  (2)建立两个数组,分别存储左边和右边的数组

  (3)利用递归进行下次比较

    <scripttype="text/javascript">

        functionquickSort(arr){

            if(arr.length<=1){

                return arr;//如果数组只有一个数,就直接返回;

            }

 

            var num = Math.floor(arr.length/2);//找到中间数的索引值,如果是浮点数,则向下取整

            var numValue =arr.splice(num,1);//找到中间数的值

            var left = [];

            var right = [];

            for(var i=0;i<arr.length;i++){

                if(arr[i]<numValue){

                   left.push(arr[i]);//基准点的左边的数传到左边数组

                }

                else{

                  right.push(arr[i]);//基准点的右边的数传到右边数组

                }

            }

            returnquickSort(left).concat([numValue],quickSort(right));//递归不断重复比较

        }
        alert(quickSort([32,45,37,16,2,87]));//弹出“2,16,32,37,45,87”

    </script>


    2.你觉得jQuery或zepto源码有哪些写的好的地方

    jQuery源码封装在一个匿名函数的自执行环境中,有助于防止变量的全局污染,然后通过传入window对象参数,可以使window对象作为局部变量使用,好处是当jquery中访问window对象的时候,就不用将作用域链退回到顶层作用域了,从而可以更快的访问window对象。同样,传入undefined参数,可以缩短查找undefined时的作用域链。
    
        (function( window, undefined ) {
             //用一个函数域包起来,就是所谓的沙箱
             //在这里边var定义的变量,属于这个函数域内的局部变量,避免污染全局
             //把当前沙箱需要的外部变量通过函数参数引入进来
             //只要保证参数对内提供的接口的一致性,你还可以随意替换传进来的这个参数
           window.jQuery = window.$ = jQuery;
        })( window );
    jquery将一些原型属性和方法封装在了jquery.prototype中,为了缩短名称,又赋值给了jquery.fn,这是很形象的写法。
    
    有一些数组或对象的方法经常能使用到,jQuery将其保存为局部变量以提高访问速度。
    
    jquery实现的链式调用可以节约代码,所返回的都是同一个对象,可以提高代码效率。


      3.ES6的了解

      新增模板字符串(为JavaScript提供了简单的字符串插值功能)、箭头函数(操作符左边为输入的参数,而右边则是进行的操作以及返回的值Inputs=>outputs。)、for-of(用来遍历数据—例如数组中的值。)arguments对象可被不定参数和默认参数完美代替。ES6将promise对象纳入规范,提供了原生的Promise对象。增加了let和const命令,用来声明变量。增加了块级作用域。let命令实际上就增加了块级作用域。ES6规定,var命令和function命令声明的全局变量,属于全局对象的属性;let命令、const命令、class命令声明的全局变量,不属于全局对象的属性。。还有就是引入module模块的概念


        4.js继承方式及其优缺点

        原型链继承的缺点
        一是字面量重写原型会中断关系,使用引用类型的原型,并且子类型还无法给超类型传递参数。
        借用构造函数(类式继承)
        借用构造函数虽然解决了刚才两种问题,但没有原型,则复用无从谈起。所以我们需要原型链+借用构造函数的模式,这种模式称为组合继承
        组合式继承
        组合式继承是比较常用的一种继承方法,其背后的思路是 使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数复用,又保证每个实例都有它自己的属性。


          5.关于Http 2.0 你知道多少?

          HTTP/2引入了“服务端推(server push)”的概念,它允许服务端在客户端需要数据之前就主动地将数据发送到客户端缓存中,从而提高性能。
          
          HTTP/2提供更多的加密支持
          
          HTTP/2使用多路技术,允许多个消息在一个连接上同时交差。
          
          它增加了头压缩(header compression),因此即使非常小的请求,其请求和响应的header都只会占用很小比例的带宽。


            6.defer和async

            defer并行加载js文件,会按照页面上script标签的顺序执行 
            async并行加载js文件,下载完成立即执行,不会按照页面上script标签的顺序执行


              7.谈谈浮动和清除浮动

              浮动的框可以向左或向右移动,直到他的外边缘碰到包含框或另一个浮动框的边框为止。由于浮动框不在文档的普通流中,所以文档的普通流的块框表现得就像浮动框不存在一样。浮动的块框会漂浮在文档普通流的块框上。


                8.如何评价AngularJS和BackboneJS

                backbone具有依赖性,依赖underscore.js。Backbone + Underscore + jQuery(or Zepto) 就比一个AngularJS 多出了2 次HTTP请求.
                
                Backbone的Model没有与UI视图数据绑定,而是需要在View中自行操作DOM来更新或读取UI数据。AngularJS与此相反,Model直接与UI视图绑定,Model与UI视图的关系,通过directive封装,AngularJS内置的通用directive,就能实现大部分操作了,也就是说,基本不必关心Model与UI视图的关系,直接操作Model就行了,UI视图自动更新。
                
                AngularJS的directive,你输入特定数据,他就能输出相应UI视图。是一个比较完善的前端MVW框架,包含模板,数据双向绑定,路由,模块化,服务,依赖注入等所有功能,模板功能强大丰富,并且是声明式的,自带了丰富的 Angular 指令。


                  9.用过哪些设计模式?

                  工厂模式:
                  
                  主要好处就是可以消除对象间的耦合,通过使用工程方法而不是new关键字。将所有实例化的代码集中在一个位置防止代码重复。
                  
                      工厂模式解决了重复实例化的问题 ,但还有一个问题,那就是识别问题,因为根本无法搞清楚他们到底是哪个对象的实例。
                  
                   
                  
                   
                  
                  function createObject(name,age,profession){//集中实例化的函数var obj = newObject();
                  
                      obj.name =name;
                  
                      obj.age = age;
                  
                      obj.profession= profession;
                  
                      obj.move =function () {
                  
                          returnthis.name + ' at ' + this.age + ' engaged in ' + this.profession;
                  
                      };
                  
                      return obj;
                  
                  }
                  
                  var test1 = createObject('trigkit4',22,'programmer');//第一个实例var test2 =createObject('mike',25,'engineer');//第二个实例
                  
                   
                  
                  构造函数模式
                  
                  使用构造函数的方法 ,即解决了重复实例化的问题 ,又解决了对象识别的问题,该模式与工厂模式的不同之处在于:
                  
                  1.构造函数方法没有显示的创建对象 (new Object());
                  
                  2.直接将属性和方法赋值给 this 对象;
                  
                  3.没有 renturn 语句。


                    10.说说你对闭包的理解

                    使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。在js中,函数即闭包,只有函数才会产生作用域的概念
                    
                    闭包有三个特性:
                    1.函数嵌套函数
                    2.函数内部可以引用外部的参数和变量
                    3.参数和变量不会被垃圾回收机制回收