迭代器:提供一种顺序访问聚合对象各个元素方法,并不暴露该对象
内部迭代器 请求一次就会得到执行结果
var each = function (ary, callback) { for (var i = 0, l = ary.length; i < l ; i++){ callback.call(ary[i], i, ary[i]); } }; var compare = function (ary1, ary2) { if(ary1.length !== ary2.length){ throw new Error('两个对象不相等!'); } each(ary1, function (i, n) { if(n !== ary2[i]){ throw new Error('两个对象不相等!'); } }); console.log('两个对象相等'); }; compare([1, 2, 3], [1, 2, 4]);外部迭代器 外部迭代器需要每次显示的调用。
var Iterator = function (obj) { var current = 0; //指定当前读取的位置
var next = function () { current += 1; }; var isDone = function () { //是否已经读取到最后 return current >= obj.length; }; var getCurrItem = function () { return obj[current]; }; return { next: next, isDone: isDone, getCurrItem: getCurrItem }}
上面内部迭代器比较的例子,用外部迭代器就要使用循环显示的每次去比较
这是jQuery的内部实现
//判断是否是类数组 function isArraylike( obj ) { var length = obj.length, type = jQuery.type( obj ); if ( jQuery.isWindow( obj ) ) { return false; } if ( obj.nodeType === 1 && length ) { return true; } return type === "array" || type !== "function" && ( length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj ); } myEach = function (obj, callback) { var value, i = 0, length = obj.length, isArray = isArraylike(obj); //是否是类数组对象 if(isArray){ //迭代类数组 for (; i < length; i++){ value = callback.call(obj[i], i, obj[i]); if(value === false){ break; } } }else{ for (i in obj){ value = callback.call(obj[i], i, obj[i]); if(value === false){ break; } } } } myEach({name:'xin', age: 23}, function (i, value) { console.log(value); })