// ES5
// 对于数组,使用标准的 for 循环,其实这种方式并不是在遍历值,而是遍历下标来指向值!ES5中增加了一些数组迭代器:forEach、every、some
// forEach:遍历数组中的所有值并忽略回调函数的返回值
// every:一直运行直到回调函数返回 false
// some:一直运行直到回调函数返回 true
// 对于对象, for..in 循环实际上遍历的是对象的可枚举属性列表(包括原型链)需要手动获取属性值
// 手动实现一个类似内置迭代器的 @@iterator
var myObject = {
a: 2,
b: 3
}; Object.defineProperty( myObject, Symbol.iterator, {
enumerable: false,
writable: false,
configurable: true,
value: function() {
var o = this;
var idx = 0;
var ks = Object.keys( o ); return {
next: function() {
return {
value: o[ks[idx++]],
done: (idx > ks.length)
};
}
};
}
} ); // 手动遍历 myObject
var it = myObject[Symbol.iterator](); console.log(it.next()); // { done: false, value: 2 }
console.log(it.next()); // { done: false, value: 3 }
console.log(it.next()); // { done: true, value: undefined } // ES6
// 使用 for..of 遍历数据结构(数组、对象等等)中的值,它会使用内置的 @@iterator 对象并调用它的 next 方法来遍历数据值
for (var v of myObject) {
console.log(v);
}