欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-20 09:47:18
jquery的中有很多值得学习借鉴的技巧,本文即收集了jquery中出现的各种遍历技巧和场景。具体分析如下: // 简单的for-in(事件) for ( type...

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中 
}