javascript迭代器
迭代器:提供一种顺序访问聚合对象各个元素方法,并不暴露该对象
jQuery迭代器
$.each([1, 2, 3, 4], function (i, n) {
console.log(i +'---'+ n);
})
自定义迭代器
var each = function (ary, callback) {
for (var i = 0, l = ary.length; i < l ; i++){
callback.call(ary[i], i, ary[i]);
}
};
each([1, 2, 3, 4], function (i, n) {
console.log(i+'----'+n);
})
内部迭代器和外部迭代器
内部迭代器
请求一次就会得到执行结果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);
})