jQuery源码分析之jQuery中的循环技巧详解_jquery

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程序设计有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索jquery
, 源码
, 循环
, 分析
技巧
jquery源码详解、lwip协议栈源码详解、spring mvc源码详解、java贪吃蛇源代码详解、orb slam 源代码详解,以便于您获取更多的相关知识。

时间: 2024-09-20 00:16:56

jQuery源码分析之jQuery中的循环技巧详解_jquery的相关文章

jQuery源码分析之jQuery.fn.each与jQuery.each用法_jquery

本文实例讲述了jQuery源码分析之jQuery.fn.each与jQuery.each用法.分享给大家供大家参考.具体分析如下: 先上例子,下面代码的作用是:对每个选中的div元素,都给它们添加一个red类 复制代码 代码如下: $('div').each(function(index, elem){       $(this).addClass('red'); } }); 上面用的的.each,即jQuery.fn.each,其内部是通过jQuery.each实现的 复制代码 代码如下: j

Jquery源码分析---构建jQuery对象

2.1.jQuery的设计理念 使用jQuery之前,我们都会问jQuery是什么?jQuery是一个类库,和 prototype,mootools等类库一样,为Web的Js开发提供辅助功能.那为什么要选 用jQuery呢?在jQuery出现之前,Prototype,YUI都是很成熟的Js的框架,而且 是各有各的特点.为什么要抛弃它们,而使用后起之秀的jQuery,它有什么优秀 的特性吸引开发人员呢? 回答这个问题,我们得明白jQuery的设计理念.回忆或想象一下,我们在web 开发中是如何使用

Jquery源码分析---构建Jquery的Dom元素

在jQuery.fn.init函数中,最终的结果是把Dom元素放到jQuery对象的集合, 我们可以传入单个Dom元素或Dom元素集合直接把其存到jQuery对象的集合.但是 如果第一个参数是string类型的话,如#id就要把Dom文档树去查找.对于html的 片断就得生成Dom元素.我们再进一步,传入的单个Dom元素或Dom元素集合参数 又是从那里来的?我们可以通过Dom元素的直接或间接的查找元素的方式. 这一部分首先分析如何从html的片断就得生成Dom元素,然后分析jQuery 是如何通

JVM源码分析之System.currentTimeMillis及nanoTime原理详解

概述 上周@望陶问了我一个现象很诡异的问题,说JDK7和JDK8下的System.nanoTime()输出完全不一样,而且差距还非常大,是不是两个版本里的实现不一样,之前我也没注意过这个细节,觉得非常奇怪,于是自己也在本地mac机器上马上测试了一下,得到如下输出: ~/Documents/workspace/Test/src ᐅ /Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java NanosTest 1

jQuery-1.9.1源码分析系列(十)事件系统之事件包装_jquery

在上篇文章给大家介绍了jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构,本篇继续给大家介绍jquery1.9.1源码分析系列相关知识,具体内容请看下文吧. 首先需要明白,浏览器的原生事件是只读的,限制了jQuery对他的操作.举个简单的例子就能明白为什么jQuery非要构造一个新的事件对象. 在委托处理中,a节点委托b节点在a被click的时候执行fn函数.当事件冒泡到b节点,执行fn的时候上下文环境需要保证正确,是a节点执行了fn而非b节点.如何保证执行fn的上下文环境是a节点

jQuery源码分析-03构造jQuery对象-工具函数_jquery

作者:nuysoft/高云 QQ:47214707 EMail:nuysoft@gmail.com 声明:本文为原创文章,如需转载,请注明来源并保留原文链接. 读读写写,不对的地方请告诉我,多多交流共同进步,本章的的PDF等本章写完了发布. jQuery源码分析系列的目录请查看 http://nuysoft.iteye.com/blog/1177451,想系统的好好写写,目前还是从我感兴趣的部分开始,如果大家有对哪个模块感兴趣的,建议优先分析的,可以告诉我,一起学习. 3.4 其他静态工具函数

Jquery 1.9.1源码分析系列(十二)之筛选操作_jquery

废话不多说了直接奔入主题了. jQuery.fn.find( selector ) find接受一个参数表达式selector:选择器(字符串).DOM元素(Element).jQuery对象.分两种情况处理: 第一种,如果传入的参数是非字符串,则先通过jQuery选择器将selector查找出来,然后过滤出包含于当前jQuery对象所匹配的元素的节点. if ( typeof selector !== "string" ) { self = this; return this.pus

jQuery 1.9.1源码分析系列(十三)之位置大小操作_jquery

先给大家展示谢 jQuery.fn.css (propertyName [, value ]| object )(函数用于设置或返回当前jQuery对象所匹配的元素的css样式属性值.如果需要删除指定的css属性,请使用该函数将其值设为空字符串("") 注意:1.如果省略了value参数,则表示获取属性值:如果指定了该参数,则表示设置属性值.2.css()函数的所有"设置"操作针对的是当前jQuery对象所匹配的每一个元素:所有"读取"操作只针对

smarty手册-smarty中foreach循环语句详解

原文地址:smarty手册-smarty中foreach循环语句详解作者:谭博 {foreach}循环也有自身属性的变量,可以通过{$smarty.foreach.name.property}访问,其中"name"是name属性. Note: The name attribute is only required when you want to access a {foreach} property, unlike {section}. Accessing a {foreach} p