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 相关文章推荐
表单内同名元素的控制
Nov 22 Javascript
漂亮的widgets,支持换肤和后期开发新皮肤
Apr 23 Javascript
在IE浏览器中resize事件执行多次的解决方法
Jul 12 Javascript
Js 冒泡事件阻止实现代码
Jan 27 Javascript
JQuery结合CSS操作打印样式的方法
Dec 24 Javascript
JavaScript获取鼠标移动时的坐标(兼容IE8、chome谷歌、Firefox)
Sep 13 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
Jun 19 Javascript
JS组件Bootstrap Select2使用方法解析
May 30 Javascript
浅谈Angular的$q, defer, promise
Dec 20 Javascript
详解Node.js项目APM监控之New Relic
May 12 Javascript
基于jQuery实现无缝轮播与左右点击效果
May 13 jQuery
Nuxt的路由动画效果案例
Nov 06 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
实现分十页分向前十页向后十页的处理
2006/10/09 PHP
phpinfo 系统查看参数函数代码
2009/06/05 PHP
php编写一个简单的路由类
2011/04/13 PHP
PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
2015/05/11 PHP
javascript权威指南 学习笔记之变量作用域分享
2011/09/28 Javascript
JS实现带缓冲效果打开、关闭、移动一个层的方法
2015/05/09 Javascript
Bootstrap轮播加上css3动画,炫酷到底!
2015/12/22 Javascript
BootStrap文件上传样式超好看【持续更新】
2016/05/10 Javascript
浅析Node.js:DNS模块的使用
2016/11/23 Javascript
基于bootstrap风格的弹框插件
2016/12/28 Javascript
vue2滚动条加载更多数据实现代码
2017/01/10 Javascript
Textarea输入字数限制实例(兼容iOS&amp;安卓)
2017/07/06 Javascript
再谈Angular4 脏值检测(性能优化)
2018/04/23 Javascript
你了解vue3.0响应式数据怎么实现吗
2019/06/07 Javascript
JavaScript通如何过RGraph实现动态仪表盘
2020/10/15 Javascript
[08:04]TI4西雅图DOTA2前线报道 海涛探访各路人马
2014/07/09 DOTA
Python中用Ctrl+C终止多线程程序的问题解决
2013/03/30 Python
Python进行数据科学工作的简单入门教程
2015/04/01 Python
Python中文件I/O高效操作处理的技巧分享
2017/02/04 Python
Python使用爬虫爬取静态网页图片的方法详解
2018/06/05 Python
Caffe均值文件mean.binaryproto转mean.npy的方法
2018/07/09 Python
Python用Jira库来操作Jira
2020/12/28 Python
sklearn中的交叉验证的实现(Cross-Validation)
2021/02/22 Python
使用简单的CSS3属性实现炫酷读者墙效果
2014/01/08 HTML / CSS
Born鞋子官网:Born Shoes
2017/04/06 全球购物
Speedo速比涛法国官方网站:泳衣、泳镜、泳帽、泳裤
2019/07/30 全球购物
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
汽车维修专业个人求职信范文
2014/01/01 职场文书
高中生学期学习自我评价
2014/02/24 职场文书
党的群众路线个人对照检查材料
2014/09/23 职场文书
尼克胡哲观后感
2015/06/08 职场文书
感恩信:写给爸爸妈妈的一封感谢信
2019/09/12 职场文书
详解MySQL主从复制及读写分离
2021/05/07 MySQL
Python 可迭代对象 iterable的具体使用
2021/08/07 Python
Go中的条件语句Switch示例详解
2021/08/23 Golang
SQL实战演练之网上商城数据库商品类别数据操作
2021/10/24 MySQL