学习ECMAScript 2015【8】Iterators + For..Of

原创
10/14 10:41
阅读数 79

0.背景

今天要介绍的Iterators + For..Of和Java中的增强for循环很类似。可以用在能够迭代的对象上。你也许会问:“不是有for in了吗?”别急,后面说。

image.png

1.总览

let fibonacci = {
  [Symbol.iterator]() {
    let pre = 0, cur = 1;
    return {
      next() {
        [pre, cur] = [cur, pre + cur];
        return { done: false, value: cur }
      }
    }
  }
}

for (var n of fibonacci) {
  // truncate the sequence at 1000
  if (n > 1000)
    break;
  console.log(n);
}

2. 一些注意事项

2.1.用let或者var都是可以改变元素的

let iterable = [10, 20, 30];

for (let value of iterable) {
    value += 1;
    console.log(value);
}
// 11
// 21
// 31

不想改变元素,就用const

let iterable = [10, 20, 30];

for (const value of iterable) {
  console.log(value);
}
// 10
// 20
// 30

2.2.String中的元素也可以迭代

let iterable = "boo";

for (let value of iterable) {
  console.log(value);
}
// "b"
// "o"
// "o"

2.3.迭代Map时,使用[key,value]的方式

let iterable = new Map([["a", 1], ["b", 2], ["c", 3]]);

for (let entry of iterable) {
  console.log(entry);
}
// ["a", 1]
// ["b", 2]
// ["c", 3]

for (let [key, value] of iterable) {
  console.log(value);
}
// 1
// 2
// 3

2.4.for...of与for...in的区别

for...in 语句以任意顺序迭代对象的可枚举属性。

for...of 语句遍历可迭代对象定义要迭代的数据。

如果非要类比的法,inkeyofvalue,大概就是个类比。

Object.prototype.objCustom = function() {};
Array.prototype.arrCustom = function() {};

let iterable = [3, 5, 7];
iterable.foo = 'hello';

for (let i in iterable) {
  console.log(i); // 0, 1, 2, "foo", "arrCustom", "objCustom"
}

for (let i in iterable) {
  if (iterable.hasOwnProperty(i)) {
    console.log(i); // 0, 1, 2, "foo"
  }
}

for (let i of iterable) {
  console.log(i); // 3, 5, 7
}

2.5.可以迭代一个生成器

function* fibonacci() { // 一个生成器函数
    let [prev, curr] = [0, 1];
    for (;;) { // while (true) {
        [prev, curr] = [curr, prev + curr];
        yield curr;
    }
}

for (let n of fibonacci()) {
     console.log(n);
    // 当n大于1000时跳出循环
    if (n >= 1000)
        break;
}

生成器这种模式,我最早在python中见过,各位同学在使用的时候,一定要注意让生成的逻辑尽量简单,大量取用的时候别阻塞。在生活中,不易穷尽列举的,我们才用这种方式。所以尽量先看大神们怎么用,自己必要时再用。

3.结语

祝愿大家一切顺利,没有bug。好朋友们,如果您觉得文中存在什么问题,请在评论区留言啊!期待大家的热烈讨论。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部