jQuery源码分析之jQuery中的循环技巧详解


Posted in Javascript onSeptember 06, 2014

jQuery的源码中有很多值得学习借鉴的技巧,本文即收集了jQuery中出现的各种遍历技巧和场景。具体分析如下:

// 简单的for-in(事件) 
for ( type in events ) { 
 
} 
// 缓存length属性,避免每次都去查找length属性,稍微提升遍历速度 
// 但是如果遍历HTMLCollection时,性能提升非常明显,因为每次访问HTMLCollection的属性,HTMLCollection都会内部匹配一次所有的节点 
for ( var j = 0, l = handlers.length; j < l; j++ ) { 
 
} 
// 不比较下标,直接判断元素是否为true(强制类型转换) 
var elem; 
for ( var i = 0; elems[i]; i++ ) { 
  elem = elems[i]; 
  // ... 
} 
// 遍历动态数组(事件),不能缓存length属性,j++之前先执行j--,保证不会因为数组下标的错误导致某些数组元素遍历不到 
for ( j = 0; j < eventType.length; j++ ) { 
eventType.splice( j--, 1 ); 
} 
for ( var i = 1; i < results.length; i++ ) { 
  if ( results[i] === results[ i - 1 ] ) { 
    results.splice( i--, 1 ); 
  } 
} 
// 迭代过程中尽可能减少遍历次数(事件),如果你能知道从哪里开始遍历的话,这里是pos 
for ( j = pos || 0; j < eventType.length; j++ ) { 
 
} 
//倒序遍历(事件),减少了几个字符:循环条件判断,合并i自减和i取值,倒序遍历会有浏览器优化,稍微提升遍历速度 
for ( var i = this.props.length, prop; i; ) { 
  prop = this.props[ --i ]; 
  event[ prop ] = originalEvent[ prop ]; 
} 
// 倒序遍历,中规中矩,倒序会有浏览器优化,稍微提升遍历速度 
for ( j = tbody.length - 1; j >= 0 ; --j ) { 
  if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) { 
    tbody[ j ].parentNode.removeChild( tbody[ j ] ); 
  } 
} 
//不判断下标,直接判断元素(选择器) 
for ( i = 0; checkSet[i] != null; i++ ) { 
  if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { 
    results.push( set[i] ); 
  } 
} 
for ( ; array[i]; i++ ) { 
  ret.push( array[i] ); 
} 
// 不判断下标,取出元素然后判断元素(选择器) 
for ( var i = 0; (item = curLoop[i]) != null; i++ ) { 
 
} 
// 遍历DOM子元素 
for ( node = parent.firstChild; node; node = node.nextSibling ) { 
  if ( node.nodeType === 1 ) { 
    node.nodeIndex = ++count; 
  } 
} 
// 动态遍历DOM子元素(DOM遍历),dir参数表示元素的方向属性,如parentNode、nextSibling、previousSibling、lastChild和firstChild 
for ( ; cur; cur = cur[dir] ) { 
  if ( cur.nodeType === 1 && ++num === result ) { 
    break; 
  } 
} 
// while检查下标i 
var i = promiseMethods.length; 
while( i-- ) { 
  obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ]; 
} 
// while检查元素 
while( (type = types[ i++ ]) ) { 
 
} 
// while遍历动态数组(AJAX),总是获取第一个元素,检查是否与特殊值相等,如果相等就从数组头部移除,直到遇到不相等的元素或数组为空 
while( dataTypes[ 0 ] === "*" ) { 
  dataTypes.shift(); 
  if ( ct === undefined ) { 
    ct = s.mimeType || jqXHR.getResponseHeader( "content-type" ); 
  } 
} 
// while遍历动态数组(异步队列),总是获取第一个元素,直到数组为空,或遇到值为undefined的元素 
while( callbacks[ 0 ] ) { 
  callbacks.shift().apply( context, args ); 
} 
// while反复调用RegExp.exec(AJAX),能够否反复调是exec比re.test、String.match更加强大的原因,每次调用都将lastIndex属性设置到紧接着匹配字符串的字符位置 
while( ( match = rheaders.exec( responseHeadersString ) ) ) { 
  responseHeaders[ match[1].toLowerCase() ] = match[ 2 ]; // 将响应头以key-value的方式存在responseHeaders中 
}

希望本文所述对大家jQuery的WEB程序设计有所帮助。

Javascript 相关文章推荐
extjs 学习笔记(三) 最基本的grid
Oct 15 Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
Jan 08 Javascript
document.getElementBy(&quot;id&quot;)与$(&quot;#id&quot;)有什么区别
Sep 22 Javascript
jQuery 无刷新分页实例代码
Nov 12 Javascript
javascript实现手机震动API代码
Aug 05 Javascript
js实现TAB切换对应不同颜色的代码
Aug 31 Javascript
深入剖析JavaScript中的函数currying柯里化
Apr 29 Javascript
json的使用小结
Jun 08 Javascript
Canvas实现放射线动画效果
Feb 15 Javascript
React-Native做一个文本输入框组件的实现代码
Aug 10 Javascript
react 父组件与子组件之间的值传递的方法
Sep 14 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
May 28 Javascript
10分钟学会写Jquery插件实例教程
Sep 06 #Javascript
页面加载完后自动执行一个方法的js代码
Sep 06 #Javascript
jquery mobile页面跳转后样式丢失js失效的解决方法
Sep 06 #Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
Sep 06 #Javascript
js和jquery中循环的退出和继续学习记录
Sep 06 #Javascript
jquery实现html页面 div 假分页有原理有代码
Sep 06 #Javascript
JavaScript及jquey实现多个数组的合并操作
Sep 06 #Javascript
You might like
国产动画《伍六七》原声大碟大卖,啊哈娱乐引领音乐赋能IP的新尝试
2020/03/08 国漫
ThinkPHP实现分页功能
2017/04/28 PHP
javascript firefox不显示本地预览图片问题的解决方法
2008/11/12 Javascript
jquery validator 插件增加日期比较方法
2010/02/21 Javascript
用显卡加速,轻松把笔记本打造成取暖器的办法!
2013/04/17 Javascript
$.each与$().each的区别示例介绍
2014/03/20 Javascript
node.js中的console.log方法使用说明
2014/12/09 Javascript
js实现兼容IE和FF的上下层的移动
2015/05/04 Javascript
js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
2016/04/01 Javascript
bootstrap中使用google prettify让代码高亮的方法
2016/10/21 Javascript
DropDownList实现可输入可选择(两种版本可选)
2016/12/07 Javascript
微信小程序 新建登录页并实现tabBar隐藏
2017/06/13 Javascript
解决JS外部文件中文注释出现乱码问题
2017/07/09 Javascript
vue2.0使用swiper组件实现轮播效果
2017/11/27 Javascript
纯js封装的ajax功能函数与用法示例
2018/05/14 Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
2018/05/23 Javascript
layui实现文件或图片上传记录
2018/08/28 Javascript
vue主动刷新页面及列表数据删除后的刷新实例
2018/09/16 Javascript
解决Layui中templet中a的onclick参数传递的问题
2019/09/20 Javascript
JavaScript实现拖拽效果
2020/03/16 Javascript
linux下安装easy_install的方法
2013/02/10 Python
Python中字典和JSON互转操作实例
2015/01/19 Python
机器学习python实战之手写数字识别
2017/11/01 Python
Python去除、替换字符串空格的处理方法
2018/04/01 Python
Python 打印中文字符的三种方法
2018/08/14 Python
Python 数值区间处理_对interval 库的快速入门详解
2018/11/16 Python
正则给header的冒号两边参数添加单引号(Python请求用)
2019/08/09 Python
css3 实现元素弧线运动的示例代码
2020/04/24 HTML / CSS
Senreve官网:美国旧金山的奢侈手袋品牌
2019/03/21 全球购物
白俄罗斯女装和针织品网上商店:Presli.by
2019/10/13 全球购物
美国手机支架公司:PopSockets
2019/11/27 全球购物
美术专业学生个人自我评价
2013/09/19 职场文书
大一学生假期实习的自我评价
2013/10/12 职场文书
优秀团员自我评价范文
2014/04/23 职场文书
活动倡议书范文
2014/05/13 职场文书
市场营销专业求职信
2014/06/17 职场文书