了解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()。
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 方法?
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 的优化方法
9.jQuery的实现原理(待解决)