迭代器的总结:
迭代器:
迭代器(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
循环)。