//回调函数中的参数 i 为当前索引, n 为当前元素 $.each( [1, 2, 3], function( i, n ){console.log( '当前下标为: '+ i );console.log( '当前值为:' + n ); });
1.2 实现自己的迭代器
var each = function( ary, callback ){for ( var i = 0, l = ary.length; i };function testCase(){var users = [{name:"aa",age:10},{name:"bb",age:14},{name:"bb",age:18},]each( users, function( i, n ){console.log(this);console.log ( [ i, n ] );}); }
1.3 内部迭代器和外部迭代器
1. 内部迭代器
我们刚刚编写的 each 函数属于内部迭代器, each 函数的内部已经定义好了迭代规则,它完全接手整个迭代过程,外部只需要一次初始调用。
内部迭代器在调用的时候非常方便,外界不用关心迭代器内部的实现,跟迭代器的交互也仅仅是一次初始调用,但这也刚好是内部迭代器的缺点。由于内部迭代器的迭代规则已经被提前规定,上面的 each 函数就无法同时迭代 2个数组了。
比如现在有个需求,要判断 2个数组里元素的值是否完全相等, 如果不改写 each 函数本身的代码,我们能够入手的地方似乎只剩下 each 的回调函数了,代码如下:(compare 函数一点都算不上好看)
var compare = function( ary1, ary2 ){if ( ary1.length !== ary2.length ){throw new Error ( 'ary1 和ary2 不相等' );}each( ary1, function( i, n ){if ( n !== ary2[ i ] ){throw new Error ( 'ary1 和ary2 不相等' );}});alert ( 'ary1 和ary2 相等' ); }; compare( [ 1, 2, 3 ], [ 1, 2, 4 ] ); // throw new Error ( 'ary1 和ary2 不相等' );
var reverseEach = function( ary, callback ){for ( var l = ary.length - 1; l >= 0; l-- ){callback( l, ary[ l ] );} };reverseEach( [ 0, 1, 2 ], function( i, n ){console.log( n ); // 分别输出:2, 1 ,0 });
1.6 中止迭代器
迭代器可以像普通 for 循环中的 break 一样,提供一种跳出循环的方法。在 1.4节 jQuery的each 函数里有这样一句:
if ( value === false ) {break; }
如果回调函数的执行结果返回 false ,则提前终止循环。下面我们把之前的 each 函数改写一下:
var each = function( ary, callback ){for ( var i = 0, l = ary.length; i };each( [ 1, 2, 3, 4, 5 ], function( i, n ){if ( n > 3 ){ // n 大于3 的时候终止循环return false;}console.log( n ); // 分别输出:1, 2, 3 });