1 // ES5
 2 // 对于数组,使用标准的 for 循环,其实这种方式并不是在遍历值,而是遍历下标来指向值!ES5中增加了一些数组迭代器:forEach、every、some
 3 // forEach:遍历数组中的所有值并忽略回调函数的返回值
 4 // every:一直运行直到回调函数返回 false
 5 // some:一直运行直到回调函数返回 true
 6 // 对于对象, for..in 循环实际上遍历的是对象的可枚举属性列表(包括原型链)需要手动获取属性值
 7 // 手动实现一个类似内置迭代器的 @@iterator
 8 var myObject = {
 9   a: 2,
10   b: 3
11 };
12 
13 Object.defineProperty( myObject, Symbol.iterator, {
14   enumerable: false,
15   writable: false,
16   configurable: true,
17   value: function() {
18     var o = this;
19     var idx = 0;
20     var ks = Object.keys( o );
21     
22     return {
23       next: function() {
24         return {
25           value: o[ks[idx++]],
26           done: (idx > ks.length)
27         };
28       }
29     };
30   }
31 } );
32 
33 // 手动遍历 myObject
34 var it = myObject[Symbol.iterator]();
35 
36 console.log(it.next());   // { done: false, value: 2 }
37 console.log(it.next());   // { done: false, value: 3 }
38 console.log(it.next());   // { done: true, value: undefined }
39 
40 // ES6
41 // 使用 for..of 遍历数据结构(数组、对象等等)中的值,它会使用内置的 @@iterator 对象并调用它的 next 方法来遍历数据值
42 for (var v of myObject) {
43   console.log(v);
44 }

 

posted on 2017-02-08 09:34  狂流  阅读(526)  评论(0编辑  收藏  举报