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 相关文章推荐
javascript 建设银行登陆键盘
Jun 10 Javascript
javascript实现信息增删改查的方法
Jul 25 Javascript
JavaScript动态提示输入框输入字数的方法
Jul 27 Javascript
bootstrap输入框组代码分享
Jun 07 Javascript
Asp.Net之JS生成分页条的方法
Nov 23 Javascript
JS多物体实现缓冲运动效果示例
Dec 20 Javascript
使用Vue如何写一个双向数据绑定(面试常见)
Apr 20 Javascript
jQuery实现输入框的放大和缩小功能示例
Jul 21 jQuery
vue生成文件本地打开查看效果的实例
Sep 06 Javascript
JavaScript中Array方法你该知道的正确打开方法
Sep 11 Javascript
js中innerText/textContent和innerHTML与target和currentTarget的区别
Jan 21 Javascript
vue单文件组件无法获取$refs的问题
Jun 24 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的Yii框架中cookie和session功能的相关操作
2016/03/17 PHP
php性能分析之php-fpm慢执行日志slow log用法浅析
2016/10/17 PHP
php自定义时间转换函数示例
2016/12/07 PHP
swoole和websocket简单聊天室开发
2017/11/18 PHP
Aster vs Newbee BO5 第三场2.19
2021/03/10 DOTA
JavaScript中的View-Model使用介绍
2011/08/11 Javascript
ExtJS DOM元素操作经验分享
2013/08/28 Javascript
javascript alert乱码的解决方法
2013/11/05 Javascript
js创建一个input数组并绑定click事件的方法
2014/06/12 Javascript
javascript中bind函数的作用实例介绍
2014/09/28 Javascript
详解AngularJS中自定义过滤器
2015/12/28 Javascript
开启BootStrap学习之旅
2016/05/04 Javascript
jQuery使用each方法与for语句遍历数组示例
2016/06/16 Javascript
js实现千分符和保留几位小数的简单实例
2016/08/01 Javascript
概述VUE2.0不可忽视的很多变化
2016/09/25 Javascript
JS新包管理工具yarn和npm的对比与使用入门
2016/12/09 Javascript
简单实现js浮动框
2016/12/13 Javascript
vue左右侧联动滚动的实现代码
2018/06/06 Javascript
15个顶级开源JavaScript框架和库
2018/10/10 Javascript
JavaScript中filter的用法实例分析
2019/02/27 Javascript
JavaScript制作3D旋转相册
2020/08/02 Javascript
js+canvas实现两张图片合并成一张图片的方法
2019/11/01 Javascript
python将处理好的图像保存到指定目录下的方法
2019/01/10 Python
实例讲解Python中整数的最大值输出
2019/03/17 Python
PyQt5实现从主窗口打开子窗口的方法
2019/06/19 Python
keras 获取某层的输入/输出 tensor 尺寸操作
2020/06/10 Python
CSS3中border-radius属性设定圆角的使用技巧
2016/05/10 HTML / CSS
html5中去掉input type date默认样式的方法
2018/09/06 HTML / CSS
Cole Haan官方网站:美国时尚潮流品牌
2017/12/06 全球购物
澳大利亚现代波西米亚风格女装网站:Bohemian Traders
2018/04/16 全球购物
出纳员岗位责任制
2014/02/11 职场文书
关于元旦的广播稿
2014/02/16 职场文书
六一儿童节主持词
2014/03/21 职场文书
学生偷窃检讨书
2014/09/25 职场文书
2014年度个人总结范文
2015/03/09 职场文书
深入理解python多线程编程
2021/04/18 Python