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效率 一次判断,而不要次次判断
Mar 30 Javascript
Javascript判断文件是否存在(客户端/服务器端)
Sep 16 Javascript
JavaScript清空数组元素的两种方法简单比较
Jul 10 Javascript
JavaScript实现定时隐藏与显示图片的方法
Aug 06 Javascript
网页瀑布流布局jQuery实现代码
Oct 21 Javascript
js模拟百度模糊搜索的实例
Aug 04 Javascript
js 开发之autocomplete=&quot;off&quot;在chrom中失效的解决办法
Sep 28 Javascript
Vue 仿QQ左滑删除组件功能
Mar 12 Javascript
ES6 class的应用实例分析
Jun 27 Javascript
react实现antd线上主题动态切换功能
Aug 12 Javascript
Node Mongoose用法详解【Mongoose使用、Schema、对象、model文档等】
May 13 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
Jul 20 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(5) 类和对象
2010/02/16 PHP
PHP 面向对象详解
2012/09/13 PHP
php分割合并两个字符串的函数实例
2015/06/19 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
PHP中define() 与 const定义常量的区别详解
2019/06/25 PHP
用JS做的简单的可折叠的两级树形菜单
2013/09/21 Javascript
深入浅析react native es6语法
2015/12/09 Javascript
干货分享:让你分分钟学会javascript闭包
2015/12/25 Javascript
javascript实现粘贴qq截图功能(clipboardData)
2016/05/29 Javascript
Javascript blur与click冲突解决办法
2017/01/09 Javascript
AngularJS实现tab选项卡的方法详解
2017/07/05 Javascript
深入浅析vue组件间事件传递
2017/12/29 Javascript
JQuery元素快速查找与操作
2018/04/22 jQuery
JS限制输入框输入的实现代码
2018/07/02 Javascript
一个Vue视频媒体多段裁剪组件的实现示例
2018/08/09 Javascript
vue单页应用在页面刷新时保留状态数据的方法
2018/09/21 Javascript
微信小程序自定义导航栏实例代码
2019/04/05 Javascript
原生javascript单例模式的应用实例分析
2020/02/23 Javascript
[01:31]DOTA2上海特级锦标赛 SECRET战队完整宣传片
2016/03/16 DOTA
[04:32]玩具屠夫中文语音节选
2020/08/23 DOTA
Python类定义和类继承详解
2015/05/08 Python
Linux系统上Nginx+Python的web.py与Django框架环境
2015/12/25 Python
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
2018/06/04 Python
python单线程文件传输的实例(C/S)
2019/02/13 Python
Django高级编程之自定义Field实现多语言
2019/07/02 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
2019/12/26 Python
世界顶级户外运动品牌折扣网站:LeftLane Sports
2019/06/12 全球购物
美国折扣地毯销售网站:Rugs.com
2020/03/27 全球购物
爱岗敬业演讲稿范文
2014/01/14 职场文书
简历的自我评价范文
2014/02/04 职场文书
《跟踪台风的卫星》教学反思
2014/04/10 职场文书
学校对教师的评语
2014/04/28 职场文书
市场营销策划方案
2014/06/11 职场文书
教师自我剖析材料范文
2014/09/30 职场文书
python字符串的一些常见实用操作
2022/04/06 Python