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 相关文章推荐
js实现通用的微信分享组件示例
Mar 10 Javascript
js使用心得分享
Jan 13 Javascript
使用JQuery 加载页面时调用JS的实现方法
May 30 Javascript
jsp 网站引入外部css或者js失效问题解决
Oct 31 Javascript
JS键盘版计算器的制作方法
Dec 03 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
Jan 15 Javascript
js, jQuery实现全选、反选功能
Mar 08 Javascript
js简易版购物车功能
Jun 17 Javascript
angularjs实现的购物金额计算工具示例
May 08 Javascript
Element 默认勾选表格 toggleRowSelection的实现
Sep 04 Javascript
微信小程序 wx:for遍历循环使用实例解析
Sep 09 Javascript
vue基于Echarts的拖拽数据可视化功能实现
Dec 04 Vue.js
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
PHP 函数学习简单小结
2010/07/08 PHP
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
2012/05/07 PHP
PHP简单读取xml文件的方法示例
2017/04/20 PHP
myeclipse安装jQuery插件的方法
2011/03/29 Javascript
js调用浏览器打印模块实现点击按钮触发自定义函数
2014/03/21 Javascript
JavaScript中的公有、私有、特权和静态成员用法分析
2014/11/20 Javascript
javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
2014/12/20 Javascript
JS实现仿Windows经典风格的选项卡Tab切换代码
2015/10/20 Javascript
基于BootStrap的图片轮播效果展示实例代码
2016/05/23 Javascript
浅谈JavaScript的push(),pop(),concat()方法
2016/06/03 Javascript
AngularJS入门教程之表格实例详解
2016/07/27 Javascript
node文件批量重命名的方法示例
2017/10/23 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
2019/09/27 Javascript
微信小程序复选框实现多选一功能过程解析
2020/02/14 Javascript
Vue实现购物车实例代码两则
2020/05/30 Javascript
python抓取某汽车网数据解析html存入excel示例
2013/12/04 Python
Python中atexit模块的基本使用示例
2015/07/08 Python
Python爬虫模拟登录带验证码网站
2016/01/22 Python
python3.6使用tkinter实现弹跳小球游戏
2019/05/09 Python
Django 实现admin后台显示图片缩略图的例子
2019/07/28 Python
Flask框架路由和视图用法实例分析
2019/11/07 Python
opencv-python 提取sift特征并匹配的实例
2019/12/09 Python
使用jupyter notebook直接打开.md格式的文件
2020/04/10 Python
Django分组聚合查询实例分享
2020/04/29 Python
实例讲解使用CSS实现多边框和透明边框的方法
2015/09/08 HTML / CSS
aden + anais英国官网:美国婴儿贴身用品品牌
2019/09/08 全球购物
运动会通讯稿500字
2014/02/20 职场文书
公务员中国梦演讲稿
2014/08/19 职场文书
义卖募捐活动总结
2015/05/09 职场文书
2015小学语文教师个人工作总结
2015/05/20 职场文书
酒店温馨提示语
2015/07/14 职场文书
运动会开幕式致辞
2015/07/29 职场文书
python glom模块的使用简介
2021/04/13 Python
python四种出行路线规划的实现
2021/06/23 Python
Redis的字符串是如何实现的
2021/10/24 Redis
浅谈为什么我的 z-index 又不生效了
2022/07/15 HTML / CSS