jquery学习总结

了解JQuery 之后要回答的几个问题:

1.jquery 中如何将数组转化为 json 字符串,然后再转化回来?

jQuery中没有直接提供将数组转化为json字符串的方法,但我们可以编写jQuery实例对象的扩展:

$.fn.stringifyArray = function (array) {

    return JSON.stringify(array);//把一个数组转换成JSON字符串

}

$.fn.parseArray = function (json) {

    return JSON.parse(json);//把一个JSON字符串转换成数组

}

//调用

$("").stringifyArray(array)

 

2.jquery.extend 与 jquery.fn.extend 的区别?

jquery.extend用来扩展jQuery对象本身,为jQuery添加类方法,可以理解为静态方法。

jquery.fn.extend用来扩展jQuery的实例,源码中jquery.fn = jquery.prototype,所以对jquery.fn的扩展,就是对jQuery类添加成员函数。

使用时,jquery.extend需要通过jQuery类调用,而jquery.fn.extend,jQuery实例都可以直接调用。

 

3.jQuery.fn 的 init 方法返回的 this 指的是什么对象?为什么要返回 this?

this指向jQuery的实例对象,返回this是为了实现jQuery的链式操作

 

4.jQuery 的属性拷贝(extend)的实现原理是什么,如何实现深拷贝?

第一个参数默认为false,表示浅拷贝,设置true时表示进行深度拷贝,利用递归实现对内嵌数组或者内嵌对象的拷贝。

当只有一个参数时JQuery.extend(源对象),将源对象扩展到jQuery对象上,即吧源对象的属性和方法都负责到jQuery对象上,此时为浅拷贝

当有两个参数时JQuery.extend(目标对象,源对象,将源对象的属性和方法复制到目标对象,此时为浅拷贝

当有两个参数时JQuery.extend(true,目标对象,源对象),采用深拷贝将源对象的属性和方法复制到目标对象。

递归实现深拷贝(拷贝对象上每一个层级),也可以使用JSON.stringify将对象转化为字符串,再使用JSON.parse将字符串转化为对象

function deepClone(obj){
    var cloneObj = Array.isArray(obj)?[]:{};
    if( obj && typeof obj ==="object"){
       for(var key in obj){
          if(obj.hasOwnProperty(key)){
           if(obj[key] && typeof obj[key] ==="object"){//如果为对象就调用递归继续拷贝
            cloneObj[key] = deepClone(obj[key]);
           }else{
               cloneObj[key] = obj[key];
           }
          }
       }
    }
   
   /*  var cloneObj = JSON.parse(JSON.stringify(obj)); */

    return cloneObj;
}

5.Jquery 中的 bind(),live(),delegate(),on()的区别?

(1)bind()只支持为已存在的元素进行事件的设置,而live(),delegate(),on()支持已存在和未来新添加的元素的事件设置。

(2)关于支持的版本:bind()支持jQuery的所有版本,on()支持1.7+版本,官方推荐使用on()代替bind();live()在1.9版本中已删除,支持1.8-版本,delegate()支持1.4.2+版本,性能优于live()。

  • bind()非常浪费性能,因为它把同一个事件函数附加到了每一个匹配的元素上
  • live()使用事件委托的概念,将与事件处理函数相关联的事件信息和选择器附加到文档的根元素document,这种做法会导致很多问题,比如DOM层级很深的情况下带来的性能问题、阻止事件传播e.stopPropagation()无效等,在1.7+以后版本被弃用。
  • delegate()也是使用事件委托的概念,但是可以指定附加的元素
  • on()模拟前三种方式实现的语法糖,具体取决于你如何调用

 

6.JQuery 一个对象可以同时绑定多个事件,这是如何实现的?

利用bind(),live(),delegate(),on()可以实现绑定多个事件,底层实现是通过使用addEventListener和attachEvent兼容做事件注册。

题外话:关于addEventListner和attachEvent

addEventListner(type,listener,userCapture)--type事件名称,注意去掉事件前边的on,比如'onclick'改为'click';listener事件监听函数,不要括号;userCapture事件监听方式,true表示捕获模式,false表示冒泡模式。

attachEvent(type,listener)--type事件名称,保留事件前边的on;listener事件监听函数;默认事件冒泡。

addEventListner是标准的事件监听函数方法,但是IE8以下版本不支持,而采用attachEvent

 

7.原生JS 的 window.onload 与 Jquery 的$(document).ready(function(){})有什么不同?如何用原生 JS 实现 Jq 的 ready 方法?

  • window.onload在页面所有元素(图片、引用文件)加载完毕后才执行,等价于jQuery中的$(window).load();
  •  $(document).ready()在DOM结构绘制完成后,网页内容加载之前执行

JS实现简化版JQ的ready方法:

function ready(fn){

    if(document.addEventListener){      //标准浏览器

        // 当页面文档加载并解析完毕之后会马上触发DOMContentLoaded 事件,而不会等待样式文件、图片文件和子框架页面的加载

        document.addEventListener('DOMContentLoaded',function(){

            //注销事件,避免重复触发

            //arguments.callee指向拥有这个arguments对象的函数

            document.removeEventListener('DOMContentLoaded',arguments.callee,false);

            fn();       //运行函数

        },false);

    }else if(document.attachEvent){     //IE浏览器

        document.attachEvent('onreadystatechange',function(){

            if(document.readyState=='complete'){

                //删除注册事件

                document.detachEvent('onreadystatechange',arguments.callee);

                fn();       //函数运行

            }

        });

    }

}

 

8.针对 jQuery 的优化方法

  • 优先使用ID选择器寻找元素。在jQuery中最快的选择器是ID选择器,它直接使用原生的JavaScript的getElementById();第二快的选择器是类选择器,它直接使用原生的JavaScript的getElementsByClassName()
  • 多次使用jQuery获取同一元素时,使用变量将jQuery对象缓存,因为查找DOM非常消耗性能
  • 尽量不要使用live(),效率低

9.jQuery的实现原理(待解决)

 

你可能感兴趣的:(前端学习总结,jQuery)