聊聊Javascript中的Iterator的理解

102 阅读1分钟

在学习es6语法时发现了,阮一峰es6提及的Iterator结合mdn官网Iterator的解释,总结下这个用法

Iterator:翻译过来就是:迭代器

适用范围:数组、类数组对象、Map和Set结构(即具有Iterator接口的数据结构)。对象中没有iterator接口,因为它没有确定的顺序,所以for...of不适用于对象

    var arr = ['a', 'b', 'c', 'd', 'e'];
    var eArr = arr[Symbol.iterator](); // 与arr.values()方法等效
    for (let letter of eArr) {
      console.log(letter);
    }

看看浏览器中eArr的打印结果

image.png

  • next()方法:
    var arr = [1,2,3,4];
    let iterator = arr[Symbol.iterator]();

    console.log(iterator.next());  //{ value: 1, done: false }
    console.log(iterator.next());  //{ value: 2, done: false }
    console.log(iterator.next());  //{ value: 3, done: false }
    console.log(iterator.next());  //{ value: 4, done: false }
    console.log(iterator.next());  //{ value: undefined, done: true }
  • Symbol.toStringTag属性:
    class ValidatorClass {
      get[Symbol.toStringTag]() {
        return 'Aoo';
      }
    }

    let res = Object.prototype.toString.call(new ValidatorClass()); 
    console.log(res); // "[object Aoo]"

    console.log(Object.prototype.toString.call(1)); // "[object Number]"
    console.log({[Symbol.toStringTag]: 'Foo'}.toString());  // "[object Foo]"  

Tips:这个属性要用[]包裹起来,Object.prototype.toString.call()可以用来识别任何数据类型,"符串中的数组第二项"变化的。ES6允许字面量定义对象时,把表达式作为对象的属性名,即把表达式放在方括号内。

插个小知识:values()和valueOf()用法区别:

    // values()返回的是一个包含iterator接口的数据类型
    let a = [1,2,3]
    console.log(a.values()); // Array Iterator {}
    
    // valueOf()用来判断详细的object类型,如下就是object中的boolean类型
    let b = new Boolean(true)
    console.log(typeof b.valueOf()); "boolean"
    console.log(typeof b); "object"
    
    let a ={a:1,b:2}
    console.log(Object.values(a)); // [1, 2]