迭代器的总结

迭代器的总结:

迭代器:

​ 迭代器(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 of可以遍历数组,但是不能使用索引值

​ 我们可以在外部定义索引值,在内部修改索引值即可使用

for in可以遍历数组,索引值是字符串

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

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

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值