迭代器的总结

迭代器的总结:

迭代器:

​ 迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。

jQuery中的迭代器 (先index,后value)

var obj = {a: 11, b: 22, c: 33};
var arr = [1,2,3,5];    

$.each(obj, function(index, value) {
    console.log(value, index);
});

$.each(arr, function(index, value){
    console.log(value, index);
});

underscore中的迭代器

var obj = { a: 11, b: 22, c: 33 };
var arr = [1, 2, 3, 5];    

_.each(obj, function(value, index){
    console.log(value, index);
});

_.each(arr, function(value, index){
    console.log(value, index);
});

ES5中的迭代器(forEach只能遍历数组,不能遍历对象)

// 遍历数组
var arr = [1,2,3,5];
arr.forEach(function(value, index, arr) {
    console.log(value, index, arr);
});

for in 遍历(可以是对象,可以是数组。但是不应该用于遍历数组,下面会讲到为什么不应该用于遍历数组)

var obj = { a: 11, b: 22, c: 33 };
var arr = [1, 2, 3, 5];
for (var i in obj) {
    console.log(obj[i], i);
}
for (var i in arr) {
    console.log(arr[i], i);
}

for 只能遍历数组(不能遍历对象)

var arr = [1, 2, 3, 5];
for (var i = 0; i < arr.length; i++) {
    console.log(arr[i], i);
}

for...in 循环只遍历可枚举属性(包括它的原型链上的可枚举属性)

封装一个遍历的函数(也就是相当于实现了forEach)

Object.prototype.myEach = function(fn) {
    // 区分数组和对象
    if (Array.isArray(this)) {
        // 数组
        for(var i in this) {
            fn(this[i], i, this);
        }
    } else {
        // 对象
        for(var i in this) {
            fn(this[i], i, this);
        }
    }
    // for(var i in this) {
    //     fn(this[i], i, this);
    // }
}

// this  也被遍历了
Object.defineProperty(Object.prototype, 'myEach', {
    // 设置不可遍历
    enumerable: false,
})
// 遍历数组
var arr = [1,2,3,5];
arr.myEach(function(value, index, arr) {
    console.log(value, index, arr);
});  


var obj = {a: 11, b: 22, c: 33};
obj.myEach(function(value, index, obj) {
console.log(value, index, obj);
});

for in 能实现对象和数组的遍历,因为不建议使用for in遍历数组,所以是对象的话,使用for in。是数组的话,使用for遍历。

官方文档是这样解释的: for...in不应该用于迭代一个 Array,其中索引顺序很重要。

数组索引只是具有整数名称的枚举属性,并且与通用对象属性相同。不能保证for ... in将以任何特定的顺序返回索引。for ... in循环语句将返回所有可枚举属性,包括非整数类型的名称和继承的那些。

因为迭代的顺序是依赖于执行环境的,所以数组遍历不一定按次序访问元素。因此当迭代访问顺序很重要的数组时,最好用整数索引去进行for循环(或者使用 Array.prototype.forEach()for...of 循环)。

发布了7 篇原创文章 · 获赞 1 · 访问量 215

猜你喜欢

转载自blog.csdn.net/qq_35898059/article/details/103883840