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 相关文章推荐
Eclipse下jQuery文件报错出现错误提示红叉
Jan 13 Javascript
js使用循环清空某个div中的input标签值
Sep 29 Javascript
javascript实时显示当天日期的方法
May 20 Javascript
JavaScript学习总结之JS、AJAX应用
Jan 29 Javascript
Bootstrap3.0学习教程之JS折叠插件
May 27 Javascript
基于BootStrap实现局部刷新分页实例代码
Aug 08 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
Apr 13 Javascript
Vue resource三种请求格式和万能测试地址
Sep 26 Javascript
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
Apr 30 Javascript
JS实现的自定义map方法示例
May 17 Javascript
layui 对table中的数据进行转义的实例
Sep 12 Javascript
Vue v-for循环之@click点击事件获取元素示例
Nov 09 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
PHP中防止SQL注入方法详解
2014/12/25 PHP
php遍历树的常用方法汇总
2015/06/18 PHP
php基本函数汇总
2015/07/09 PHP
WordPress中缩略图的使用以及相关技巧
2015/11/24 PHP
php解决crontab定时任务不能写入文件问题的方法分析
2019/09/16 PHP
游戏人文件夹程序 ver 4.03
2006/07/14 Javascript
javascript应用:Iframe自适应其加载的内容高度
2007/04/10 Javascript
防止xss和sql注入:JS特殊字符过滤正则
2013/04/18 Javascript
JS将表单导出成EXCEL的实例代码
2013/11/11 Javascript
详解AngularJS中的表格使用
2015/06/16 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
2015/08/25 Javascript
JQuery学习总结【一】
2016/12/01 Javascript
利用nodejs监控文件变化并使用sftp上传到服务器
2017/02/18 NodeJs
js实现点击切换checkbox背景图片的简单实例
2017/05/08 Javascript
基于jQuery封装的分页组件
2017/06/26 jQuery
vue 粒子特效的示例代码
2017/09/19 Javascript
Vue.js 利用v-for中的index值实现隔行变色
2018/08/01 Javascript
Vue实现点击显示不同图片的效果
2019/08/10 Javascript
javascript实现留言板功能
2020/02/08 Javascript
JS如何生成随机验证码
2020/03/02 Javascript
JavaScript动画实例之粒子文本的实现方法详解
2020/07/28 Javascript
python实现按任意键继续执行程序
2016/12/30 Python
Python3实现购物车功能
2018/04/18 Python
Python学习小技巧总结
2018/06/10 Python
浅谈keras2 predict和fit_generator的坑
2020/06/17 Python
python 实现图片修复(可用于去水印)
2020/11/19 Python
Numpy中np.max的用法及np.maximum区别
2020/11/27 Python
CSS3中几个新增加的盒模型属性使用教程
2016/03/01 HTML / CSS
阻止移动设备(手机、pad)浏览器双击放大网页的方法
2014/06/03 HTML / CSS
5 个强大的HTML5 API 函数推荐
2014/11/19 HTML / CSS
Molton Brown美国官网:奢华美容、香水、沐浴和身体护理
2020/09/02 全球购物
科颜氏香港官方网店:Kiehl’s香港
2021/03/07 全球购物
密封类可以有虚函数吗
2014/08/11 面试题
简历的自我评价
2014/02/03 职场文书
2014党员干部四风问题对照检查材料思想汇报
2014/09/24 职场文书
解决ubuntu安装软件时,status-code=409报错的问题
2022/12/24 Servers